文章目录
引言
我们开始编写完整的汇编语言程序,用编译器将它们编译成为可执行文件(如*.exe文件),在操作系统中运行。
4.1一个源程序从写出到执行的过程
编写汇编源程序
- 使用文本编辑器,用汇编语言编写汇编源程序
对源程序进行编译链接
- 使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件
- 再用链接程序(LINK.EXE)对目标文件进行链接,生成可以在操作系统中直接运行的可执行文件。
可执行文件
- 可执行文件包含两部分内容:
(1)程序和数据
(2)相关的描述信息
执行可执行文件中的程序
- 在操作系统中,执行可执行文件中的程序
- 操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置CS:IP指向第一条要执行的指令),然后由CPU执行程序。
4.2 源程序
assume cs:codesg
codesg segment
start: mov ax,0123H ;汇编指令,有机器码和其一一对应,可以编译成对应的机器指令
mov bx,0456H
add ax,bx
add ax,ax
mov ax,4c00h
int 21h
codesg ends
end ;伪指令,汇编程序的结束标记
- 伪指令:没有对应的机器码,不被CPU执行,编译器识别
例如:xxx segment
segment和ends是一对成对使用的伪指令,这是在写可被编译器编译的汇编程序时,必须要用到的一对伪指令。
segment是段的开始,ends是段的结束
一个段必须要有一个名称来标识
段名 segment
assume:假设
它假设某一段寄存器和程序中的某一个用segment…ends定义的段相关联
通过assume说明这种关联,在需要的情况下,编译程序可以将段寄存器和某一个具体的段相联系。
例如: assume cs:codesg
定义一个段
- 一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。
- 一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
程序经编译链接后变为机器码
标号
- 一个标号指代了一个地址
- codesg:放在segment的前面,作为一个段的名称,这个段的名称最终将被编译、链接程序处理为一个段的段地址
DOS中的程序运行
- DOS是一个单任务操作系统
应该再程序的末尾添加返回的程序段
mov ax,4c00H
int 21H
这两条指令所实现的功能就是程序返回
4.3 编辑源程序
可以用任意的文本编辑器来编辑源程序
4.4 编译
4.5链接
问题4.1
问题4.2
程序结束运行后,返回到哪里?
扫描二维码关注公众号,回复:
9907350 查看本文章
4.9 程序执行过程的跟踪
PSP的段地址是SA,PSP的物理地址是SA*0x10+0,即SA:0
PSP占256字节,16进制是0x100,故程序的开始地址是SA+10H:0