汇编语言——汇编程序从写出到最终执行的过程

一个汇编语言程序从写出到最终执行的简要过程:
编写--〉编译--〉连接--〉执行

1、编写

notepad++选择Assembly编写程序,保存成xx.asm,样式如下

assume cs:abc    ; abc被我们当做代码段来使用,so要把它和cs联系起来
abc segment        ; 定义一个段(abc),到ends结束
start:    mov ax,2    ; 给程序一个起始位置,从这开始到段结束的位置才是汇编指令,其他的都是伪指令(给编译器看的)
        add ax,ax    ; 在这个代码段写入汇编指令(这个段就是我们定义的代码段)
        add ax,ax
        mov ax,4c00H    ; 这两句汇编指令就是程序返回
        int 21H        ; 我们暂时不需要知道这两句话为啥是这样的,只要知道它的作用是程序返回(将CPU的控制权还给使它能运行的程序)
abc ends    ; 代码段结束
end    start    ; 指出程序结束的位置

2、编译

程序经过编译后成为可执行文件

编译方法

进入DOS方式(cmd),进入 C:\masm 目录,运行masm.exe。
如果源程序文件不是以 asm 为扩展名的话,就要输入它的全名。比如p1.txt。
在输入源程序文件名的时候一定要指明它所在的路径。如果文件就在当前路径下,只输入文件名就可以。
输入要编译的源文件文件名后,按 Enter键。
目标文件(*.obj)是我们对一个源程序进行编译要得到的最终结果。
编译程序默认要输出的目标文件名为1.obj,所以可以不必再另行指定文件名。

3、连接

我们刚刚把文件编译成了(*.obj)的格式,现在要将.obj格式 --> .exe格式

连接方法

进入DOS方式,进入C:\masm目录,运行link.exe。
如果目标文件不是以obj为扩展名的话,就要输入它的全名。比如:p1.bin。
在输入目标文件名的时候,要注意指明它所在的路径。这里,我们要连接的文件是当前路径下1.obj,所以此处输入“1”。
输入要连接的目标文件名后,按Enter键。
可执行文件是我们对一个程序进行连接要得到的最终结果。
连接程序默认要输出的可执行文件名为 1.EXE ,所以可以不必再另行指定文件名。
我们直接按 Enter 键,使用连接程序设定的可执行文件名。

连接的作用

连接的作用有以下几个:
当源程序很大时,可以将它分为多个源程序文件来编译,每个源程序编译成为目标文件后,再用连接程序将它们连接到一起,生成一个可执行文件;
程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这此内容处理为最终的可执行信息。
所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。

4、执行

直接在目录下执行1.exe

EXE文件中的程序的加载过程

程序真正开始的位置是SA:100H位置,那256(100H)个内存单元是存放PSP的。

PSP的作用:连接程序与系统的接口。

程序加载后,ds中存放着程序所在内存区的段地址,这个内存区的偏移地址为 0 ,则程序所在的内存区的地址为:ds:0;
这个内存区的前256 个字节中存放的是PSP,dos用来和程序进行通信。
从 256字节处向后的空间存放的是程序。
所以,我们从ds中可以得到PSP的段地址SA,PSP的偏移地址为 0,则物理地址为SA×16+0。
因为PSP占256(100H)字节,所以程序的物理地址是:SA×16+0+256= SA×16+16×16=(SA+16)×16+0,可用段地址和偏移地址表示为:SA+10:0。

时间: 2024-11-08 10:58:48

汇编语言——汇编程序从写出到最终执行的过程的相关文章

C#代码从编写到最终执行的过程

1>编写c#代码,保存为.cs文件. 2>通过csc.exe程序来将.cs文件编译为.net程序集(.exe或.dll).此时的exe或dll并不是机器码(cpu不可理解).[>csc /out:c:\a.exe c:\program.cs] 3>程序运行时通过JIT编译(Just In Time)即时编译,将程序集编译为cpu能理解的机器码,这时cpu才能执行.(这个编译过程会与当前机器有关(根据当前机器的内存.cpu等)).

第11周阅读程序写出执行结果1(5)

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称 : *作 者 : 刘云 *完成日期 : 2016年5月8号 *版 本 号 : v6.0 * *问题描述 : 阅读程序写出执行结果1(5) *输入描述 : 无 *程序输出 : */ /*********************************(a)****************************************************/ #include

经过多次的测试,最终写出了access数据库一次插入多条数据

OleDbConnection inconn = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;Data Source=DB.mdb"); inconn.Open(); OleDbTransaction myTrans = inconn.BeginTransaction(); OleDbCommand incmd = inconn.CreateCommand(); incmd.Transaction = myTrans; s

条款25:考虑写出一个不抛异常的swap函数

条款25:考虑写出一个不抛异常的swap函数 swap函数在C++中是一个非常重要的函数,但实现也非常复杂. 看一个缺省的std::swap函数的实现 namespace std { template<typename T> void swap( T& a , T& b) { T temp(a); a = b; b = temp } } ①内置类型的调用 int a = 2; int b =3; std::swap(a, b); cout<<"a:&quo

如何写出更好的Java代码

Java是最流行的编程语言之一,但似乎并没有人喜欢使用它.好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具. 这篇文章在GitHub上也有.你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践. 编码风格 结构体 builder模式 依赖注入 避免null值 不可变 避免过多的工具类 格式 文档 Stream 部署 框架 Maven 依赖收敛 持续集成 Maven仓储 配置管理

写出优质Java代码的4个技巧(转)

http://geek.csdn.net/news/detail/238243 原文:4 More Techniques for Writing Better Java 作者:Justin Albano 翻译:Vincent 译者注:如果现在要求对你写的Java代码进行优化,那你会怎么做呢?作者在本文介绍了可以提高系统性能以及代码可读性的四种方法,如果你对此感兴趣,就让我们一起来看看吧.以下为译文. 我们平时的编程任务不外乎就是将相同的技术套件应用到不同的项目中去,对于大多数情况来说,这些技术都

[译]C++ WEB编程:写出你的CGI程序

一.什么是CGI      CGI(The Common Gateway Interface):通用网关接口,定义web服务器和客户脚本进行信息交互的一系列标准. 二.WEB浏览器       为了了解CGI的概念,让我们来看看当我们单击一个超链接来浏览一个特定的web页或URL的时候,背后会发生什么事?       (1)浏览器首先会链接HTTP web 服务器并且请求一个URL 页面:       (2) WEB服务器将会解析这个URL并且查询请求的文件名,如果找到了请求文件服务器就会将这个

在java中写出完美的单例模式

1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的--基本上每个开发者都能够随手写出--但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了.我并不想危言耸听说一定还有你不知道的--毕竟我自己的了解也的确有限,但究竟你自己了解的程度到底怎样呢?往下看,我们一起来聊聊看~ 2. 什么是单例? 单例对象的类必须保证只有一个实例存在--这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准. 对单

如何写出高性能的SQL语句(转)

高性能的SQL语句能提高页面的执行效率,让你的服务器运行的更为流畅,所以大家在以后的使用过程中,尽量的考虑到效率. (1)整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) (2)删除重复记录: 最高效的删除重复记录方法 ( 因为使用了ROWID)例子: DELETE FROM EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP