目录
4.1 一个源程序从写出到执行的过程
汇编语言程序从写出到最终执行的过程:
第一步:编写汇编源程序
- 使用文本编辑器(如Edit、记事本等),用汇编语言编写汇编源程序
- 产生一个存储源程序的文本文件。
第二步:对源程序进行编译连接
- 使用汇编语言编译程序对源程序文件中的源程序进行编译,产生目标文件;再用连接程序对目标文件进行连接,生成可在操作系统中直接运行的可执行文件。
- 用编辑器(Sublime Text、Nodepad++、UltraEdit)编写,文件后缀为.asm。
- 可执行文件包含两部分内容:
- 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的数据)
- 相关的描述信息(比如,程序有多大,要占用多少内存空间等)
- 产生一个可在操作系统中运行的可执行文件。
第三步:执行可执行文件中的程序
- 操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。
- 使用MASM.EXE编译生产obj(目标文件)。
- LINKE.EXE对目标文件进行连接生产可在操作系统中直接运行的可执行文件。
4.2 源程序
1、伪指令
在汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令。
- 汇编指令:有对应的机器码的指令,编译为机器指令被CPU执行。
- 伪指令:没有对应的机器指令,不被CPU所执行,由编译器执行来进行相关的编译工作。
(1)segment和ends
segment和ends是一对成对使用的伪指令,是在写可被编译器编译的汇编程序时必须要用到的一对伪指令。segment和ends的功能是定义一个段,segment说明一个段开始,ends说明一个段结束。
一个有意义的汇编程序中至少有一个段。
使用格式:
段名 segment
......
段名 ends
(2)end
end是一个汇编程序的结束标记。
(3)assume
assume用来加上某一段寄存器和程序中的某一用segment……ends定义的段相关联。通过assume说明这种关联,在需要的情况下编译程序可以将段寄存器和某一个具体的段相联系。
assume cs:codesg ;假设代码段的名称为codesg
codesg segment ;定义一个codesg段
mov ax,0123H
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends ;codesg段结束
end ;是个伪指令,程序的结束标记
2、源程序中的“程序”
- 将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行、处理的指令或数据,称为程序。
- 程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。
3、标号
一个标号指代了一个地址。如“codesg”。
codesg:放在segment前面,作为一个段的名称,这个段的名称最终将被编译、连接程序,称为一个段的段地址 。
4、程序的结构
小练习
编程运算2^3:
assume cs:abc ;段与寄存器关联
abc segment ;定义一个段,名称为abc
mov ax,2;写入汇编指令
add ax,ax
add ax,ax
abd ends
end ;程序结束处
5、程序返回
一个程序结束后,将CPU的控制权交还给使它得以运行的程序的过程称为:程序返回。
在程序的末尾添加返回的程序段。
mov ax,4c00H
int 21H ;第21号中断
这两条指令说实现的功能就是程序返回。
6、语法错误和逻辑错误
- 程序在编译时被编译器发现的错误是语法错误。
- 在源程序编译后,在运行时发生的错误是逻辑错误。
4.3 编辑源程序
使用编辑器编辑,扩展名为.asm
assume cs:ABC
ABC segment
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00H
int 21h
ABC ends
end
4.4 编译
- masn和 1.asm在同一目录中,dos下使用masm 1.asm命令即可生产1.obj文件。
- 在编译过程中,我们提供了一个输入,即源程序文件。最多可以得到3个输出:目标文件(.obj)、列表文件(.lst)、交叉引用文件(.crf)。目标文件是我们最终要得到的结果,而另外两个只是中间结果,可以让编译器忽略对它们的生成。
- 编译过程中出现两类错误会得不到所期望的目标文件:
(1)程序中有“Severe Errors”;
(2)找不到所给出的源程序文件。
4.5 连接
- link 1.obj,生成exe文件,enter忽略编译程序提示输入的信息。
- 连接的作用:
- 当源程序很大时,可以将它分成多个源程序文件编译,每个源程序编译成目标文件后再用连接程序将他们连接到一起,生成一个可执行文件;
- 程序中调用了某个库文件中的子程序,需要将这个库文件和该目标文件连接到一起,生成一个可执行文件;
- 一个源程序编译后得到存有机器码的目标文件,目标文件中的有些内容还不能直接生成可执行文件,连接程序将此内容处理为最终的可执行文件信息。
4.6 以简化的方式进行编译和连接
4.7 1.exe的执行
4.8 将可执行文件中的程序装载进入内存并使它运行
(1)在DOS中直接执行1.exe时,是正在运行的command,将1.exe中的程序加载入内存;
(2)command设置CPU的CS:IP指向程序的第一条指令(即程序的入口),从而使程序得以运行;
(3)程序运行结束后,返回到command中,CPU继续运行command。
- 汇编程序从写出到执行的过程:编程 -> 编译 -> 连接 -> 加载 -> 内存中的程序 -> 运行
4.9 程序执行过程的跟踪
在dos系统中.exe文件中的加载过程: