-
源程序
1. 伪指令:由编译器来执行,编译器根据伪指令来进行相关的编译工作;没有对应的机器指令,最终不被CPU执行
(1)段名 segment
段名 ends
segment和ends是一对成对使用的伪指令,它们定义了一个段。一个汇编程序由多个段组成的,这些段用来存放代码、数据或当作栈空间来用。
(2)end
end是一个汇编程序的结束标记,即碰到了伪指令end就结束对源程序的编译(注意:ends标记了一个段的结束,而end是标记整个程序的结束)
(3)assume
assume的含义为“假设”,它将有特定用途的段和相关的段寄存器关联起来。(例如用作代码段就和段寄存器cs相关联,用作栈段就和ss相关联,数据段就和ds相关联)
2. 源程序中的“程序”——汇编指令:指源程序中最终由计算机执行、处理的指令或数据(汇编指令经编译、连接后转变为机器码)
3. 标号:一个标号指代了一个地址。例如code在segment的前面作为一个段的名称,此名称最终会被编译、连接处理为一个段的段地址
4. 程序的结构
(1)先定义一个段,名称为code
(2)在此段中写入汇编指令
(3)指出程序在何处结束,利用end
(4)用assume将段和其功能相关联的段寄存器联系起来
5. 程序返回:一个程序结束后,将CPU的控制权交还给使它得以运行的程序
mov ax,4c00h int 21h ;由CPU执行,用于程序返回
6. 语法错误和逻辑错误:程序在编译器发现的错误是语法错误,编译后在运行时发生的错误是逻辑错误
-
编译,连接,执行源程序
1. 编译:masm p1;(加;号可以忽略中间文件的生成,当p1.asm与masm不在同一文件中则要输入路径)
(编译成功后将生成p1.obj的目标文件)
2. 连接:link p1;(同理加;号可以简化步骤,当p1.obj与masm不在同一文件中也要输入路径)
(连接成功后将生成p1.exe的可执行文件)
3. 执行:p1
-
程序执行过程的跟踪
1. 在DOS中执行一个程序的时候,是由command将程序从可执行文件中加载入内存,并得以执行。当CS:IP一指向程序的入口,command就放弃了CPU的控制权,CPU立即开始运行程序,直至程序结束
(commamd:命令解释器,DOS系统的外壳)
2. 使用debug观察程序运行过程:debug p1.exe
3. 用r查看各个寄存器:CX存放的是程序的长度
4. dos系统中.exe文件加载的过程:
(1)程序加载后,ds保存程序所在内存区的段地址,偏移地址为0,此程序所在的内存区的地址为ds:0;
(2)此内存区的前256个字节中存放的是PSP(程序段前缀——记录了返回地址,程序数据大小等信息,dos用来和程序通信)
(3)从256个字节处向后的空间存放的是程序,物理地址为 ds+10h(ds和cs的值总相差10h,ds=cs+10h)
5. 用t单步执行指令时要注意,到了int 21h时要用p命令执行
6. 程序加载的顺序:(1)command加载debug,debug加载p1.exe;返回的顺序:(2)从p1.exe中的程序返回到debug,从debug返回到command