一个源程序从写出到执行的过程
编写汇编源程序
产生存储源程序的文本文件
对源程序进行编译连接
使用汇编语言编译程序对源程序文本文件进行编译,产生目标文件
使用连接程序对目标文件进行连接,生成可执行文件
可执行文件中包含:
程序(汇编指令翻译成的机器码)和数据(源程序中定义的数据)
相关描述信息
执行可执行文件中的程序
由操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化,然后由
CPU执行程序
源程序
1 | assume cs:codesg |
伪指令
汇编语言源程序中,包含两种指令,一种是汇编指令,一种是伪指令
汇编指令可被编译为机器指令,被CPU执行
伪指令由编译器执行,编译器根据伪指令来进行相关编译工作
segment–ends
segment和ends成对出现,功能是定义一个段,一个段必须有一个名称来标识
格式:
1 | 段名 segment |
一个汇编程序由多个段组成,用于存放代码、数据或当作栈空间来使用
一个有意义的汇编程序中至少要有一个段,用于存放代码
end
汇编语言的结束标记
当碰到伪指令end,就结束对源程序的编译
assume
用于假设某一段寄存器和程序中的某一个用segment--ends定义的段相关联,通过assume说明这种关联
源程序中的“程序”
可以将源程序文件中的所有内容称为源程序,将源程序中最终由计算机执行、处理的指令或数据,称为程序
程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中
标号
如codesg,一个标号指代一个地址
段名称最终将被编译、连接程序处理为一个段的段地址
程序的结构
源程序是由一些段构成的。可以在这些段中存放代码、数据、或将某个段当作栈空间
编程运算2^3
定义一个段
1
2
3abc segment
...
abc ends在段中写入汇编指令
1
2
3
4
5
6
7abc segment
mov ax,2
add ax,ax
add ax,ax
abc ends指出程序何处结束
1
2
3
4
5
6
7
8
9abc segment
mov ax,2
add ax,ax
add ax,ax
abc ends
endabc段被当作代码段来使用,所以,应将abc和cs联系起来1
2
3
4
5
6
7
8
9
10
11assume cs:abc
abc segment
mov ax,2
add ax,ax
add ax,ax
abc ends
end
程序返回
一个程序结束后,将CPU的控制权交还给使它得以运行的程序,被称为程序返回
在程序的末尾添加返回的程序段
1 | mov ax,4c00H |

语法错误和逻辑错误
程序在编译时被编译器发现的错误是语法错误,例:拼写错误
在源程序编译后,在运行时发生的错误是逻辑错误,例:无程序返回
编辑源程序
可以用任意的文本编辑器来编辑源程序,只要最终将其存储为纯文本文件即可


编译
对源程序进行编辑后,得到源程序文件c:\1.asm
采用微软masm5.0汇编编译器
运行
masm.exe
输入
c:\1.asm(默认后缀为.asm)输出
.obj文件
默认输出
1.obj,可自定义输出目录输入列表文件名称
列表文件(
.lst)是将源程序编译为目标文件过程中产生的中间结果,Enter跳过
输入交叉引用文件的名称
交叉引用文件(
.crf)同列表文件用途相同,Enter跳过
编译完成
生成
.obj目标文件
编译器输出的最后两行表示源程序无警告错误和必须要改正的错误
一般来说,有两类错误使我们得不到所期望的目标文件:
程序中有必须要改正的错误
找不到所给出的源程序文件
连接
对源程序进行编译得到目标文件之后,需对目标文件进行连接,从而得到可执行文件
使用微软Overlay Linker 3.60连接器
运行
link.exe
输入
1(默认后缀.obj)输入可执行文件名称

输入映像文件名称

映像文件是连接程序将目标文件连接为可执行文件过程中产生的中间结果,
Enter跳过输入库文件名称

库文件中包含一些可以调用的子程序,若程序中调用了某一库文件中的子程序,则在连接中,需将库文件与目标文件进行连接,生成可执行文件,
Enter跳过生成可执行文件

在当前路径下,出现
1.exe,这是对目标文件1.obj进行连接所得到的结果若连接过程中出现错误,将得不到可执行文件
连接的作用
当源程序很大时,可以将它分为多个源程序文件进行编译,每个源程序编译成目标文件之后,再用连接程序将它们连接到一起,生成一个可执行文件
若程序中调用了某个库文件中的子程序,需将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件
在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件
以简化的方式进行编译和连接
1 | masm c:\1; |

生成目标文件1.obj,并在编译过程中自动忽略中间文件的生成
1 | link 1; |

生成可执行文件1.exe,并在过程中自动忽略中间文件的生成
1.exe的执行

程序执行,无输出
谁将可执行文件中的程序装载进内存并使它运行
操作系统的外壳
任何通用的操作系统,都要提供一个称为shell(外壳)的程序,供用户使用这个程序来操作计算机系统进行工作
DOS中有一个程序command.com,在DOS中称为命令解释器,也就是DOS的shell
DOS启动后,初始化后,运行command.com,在屏幕上显示盘符和路径组成的提示符
用户所输入的所要执行的命令,由command执行,完成后,显示结果并再次出现提示符,等待用户输入
用户执行程序,输入可执行文件名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置CS:IP指向程序入口。之后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示提示符,等待用户的输入
在DOS中,command处理各种输入(命令或可执行文件)。我们通过command来进行工作
程序执行过程
在
DOS中执行1.exe,是正在运行的command将1.exe加载入内存的command设置CPU的CS:IP指向程序的第一条指令(程序入口),使程序运行程序运行结束后,返回到
command中,CPU继续运行command
汇编语言从写出到执行的过程

程序执行过程的跟踪
为了观察程序的运行过程,可以使用Debug。Debug可以将程序加载入内存,设置CS:IP指向程序入口,但Debug并不放弃对CPU的控制,这样,可以使用Debug的相关命令来单步执行程序,查看每一条指令的执行结果

使用R命令查看各寄存器设置情况

CX中存放的是程序的长度,1.exe中程序的机器码共15个字节,则CX中的内容为00FH
DOS系统中.EXE文件加载过程

程序加载后,DS存放程序所在内存区的段地址
DS中的值即为PSP的段地址SA
SA*16+0+256即为程序的物理地址,即为CS:IP的地址
使用U查看其他指令

从12AE:0000-12AE:000E都为程序的机器码
T命令进行单步执行
执行到int 21时,使用P命令

执行int 21后,显示Program terminated normally,返回Debug,表示程序正常结束
在此过程中,程序的加载顺序是:command加载Debug,Debug加载1.exe。返回顺序是:1.exe返回到Debug,Debug返回到command