汇编04:第一个汇编程序
第一个程序
一个汇编语言程序要执行要进行以下几步:
1、编写汇编源程序,这个过程可以用记事本来完成
2、对源程序进行编译产生目标文件,然后用连接程序对目标文件进行连接,最终生成可执行文件
可执行文件包含两部分:
1、程序(机器指令)和数据(源程序中定义的程序)
2、相关的描述信息(程序大小、占用的内存信息等)
源程序
我们分析一段简单汇编语言程序:
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执行的指令)。
先来介绍上述程序中的几个伪指令:
1、xxx segment 。。。xxx ends:
这个一对伪指令代表定义一个程序段,他们分别标识程序段的开始和结束,上述程序中的codesg就是段名。
2、end:它是汇编程序结束的标志,编译器在编译的过程中如果遇到end指令,就结束对源程序的编译。
3、assume指令:它将有特定用途的段和相关的段寄存器关联起来,上述程序中代表将段codesg和寄存器cs联系起来。
程序要想结束必须有返回的动作,如在执行P1程序的时候一定有P2程序在运行,这个P2程序可以是某种显示程序也可以是别的,当P1程序执行时,CPU的控制权交给P1,当P1运行完毕后,应该将控制权交还给P2,这种将CPU控制权还给那个使它得以运行的程序的过程称之为程序返回。(在windows中的dos执行程序时,是一个叫command的程序负责将输入的程序加载进内存并执行的,它就是DOS系统的shell,当程序结束后CPU的控制权又交给command)
上述程序中的:
mov ax,4c00H
int 21H
可以让汇编程序实现程序返回。
debug过程
可以直接在命令行中用debug命令执行可执行文件,debug可以观察程序的运行过程,但是它不放弃对CPU的控制权,可以用相关命令单步执行程序。
对于上述程序生成的可执行文件而言,执行debug命令执行后可以用r命令查看各寄存器的设置情况,可以发现cx寄存器中存放着该程序的长度(机器码的字节数)。运行后,计算机找到一段容量足够的空闲内存区,然后加载程序的可执行文件,这个内存区的前一段部分是PSP,它专门用来进行DOS和程序的通信,它的大小在这里是256字节,PSP的段地址在DS寄存器中,且PSP的偏移量为0,所以从DS寄存器的值和该段程序的大小就能推算PSP结束的位置,也就是程序的开始。
CS和IP寄存器指向程序的第一条指令,这两个寄存器的值和对应的指令会显示在debug模式的最后一行,u命令可以查看程序中的其他指令。t命令可以单步执行程序中的指令,而且观察指令的执行结果(各寄存器的值),p命令可以快速结束loop循环直到cx中的数据为0,用"g 0016"代表跳转到偏移地址为16的位置开始执行。到了int 21,我们要用P命令执行,程序正常结束。结束后回到debug模式,q命令退出debug返回command中。