1.源程序
assume cs:codesg codesg segment mov ax,0123h mov bx,0456h add ax,bx add ax,ax mov ax,4c00h int 21h codesg ends end
①伪指令:没有对应的机器指令,最终不被CPU所执行
如上述程序segment和ends是一对成对使用的伪指令,可以用来定义一个段;一个有意义的汇编程序中至少有一个段,这个段用来存放代码。
②end
end是一个汇编程序结束的标记,ends是“end segment”这里要记清楚
③assume
假设某一段寄存器和程序中的 某一segment...ends定义的段相关联。
2. 源程序中的“程序”
汇编指令:指源程序中最终由计算机执行、处理的指令或数据(汇编指令经编译、连接后转变为机器码)
3. 标号
一个标号指代了一个地址。例如code在segment的前面作为一个段的名称,此名称最终会被编译、连接处理为一个段的段地址
4. 程序的结构
①先定义一个段,名称为code
②在此段中写入汇编指令
③指出程序在何处结束,利用end
④用assume将段和其功能相关联的段寄存器联系起来
5. 程序返回
一个程序结束后,将CPU的控制权交还给使它得以运行的程序
上述程序中的
mov ax,4c00h
int 21h
这两条指令实现的功能就是程序的返回
6.程序编辑,编译,连接和执行
以上述程序为例:
①编写源程序,保存为test.asm:
②编译,打开masm汇编编译器,进入目录运行上述保存文件:
③我们已经通过编译得到obj文件,再通过连接得到exe文件:
④最后执行这个文件:
7.程序执行过程的跟踪
① 使用debug观察程序运行过程:debug p1.exe
②用r查看各个寄存器:CX存放的是程序的长度
③dos系统中.exe文件加载的过程:
(1)程序加载后,ds保存程序所在内存区的段地址,偏移地址为0,此程序所在的内存区的地址为ds:0;
(2)此内存区的前256个字节中存放的是PSP(程序段前缀——记录了返回地址,程序数据大小等信息,dos用来和程序通信)
(3)从256个字节处向后的空间存放的是程序,物理地址为 ds+10h(ds和cs的值总相差10h,ds=cs+10h)
④可以用U命令查看其他指令
⑤用t单步执行,会显示“Program terminated normally”
⑥程序加载的顺序:(1)command加载debug,debug加载p1.exe;返回的顺序:(2)从p1.exe中的程序返回到debug,从debug返回到command