编写汇编源程序
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所执行。伪指令没有对应机器码,不会被cpu所执行,但会被编译器执行,进行相关编译工作。
1. 伪指令(上例1,2,10,11行)
(1)段名 segment
:
:
段名 ends
这是一对成对使用的伪指令,其功能是定义一个段。XXX segment表示定义一个段名为“XXX”的段,该段从此开始。XXX ends表示段名为“XXX”的段到此结束。
一个汇编程序由多个段组成,这些段用来存放代码,数据或当做栈空间来使用。
一个有意义的汇编程序至少要有一个段,这个段用来存放代码。
(2)end
汇编语言的结束标志,告诉编译器此处结束编译,程序结束。
(3)assume
假设某一段寄存器和程序中的某一个用segment..ends定义的段相关联。assume cs:codesg表示将CS寄存器与codesg相关联,将codesg段作为程序的代码段来使用。
2. 汇编指令(上例3-9行)
经编译,连接后转变为机器码,存储在可执行文件中
程序结束运行后,将cpu的控制权交还给使它得以运行的程序(常为dos系统)。由mov ax,4c00h int 21h进行实现
编译与连接
编辑好的.asm源文件,通过masm+路径及文件名进行编译(不加路径即对当前文件夹下的asm文件进行编译),生成.obj文件
通过link+路径及文件名进行连接(不加路径即对当前文件夹下的obj文件进行连接),生成.exe文件
.exe文件的执行
直接在dos系统下输入文件路径加文件名进行执行
由于源程序中没有要显示的内容,此处屏幕上没有运行结果
程序的运行与追踪
1. 用debug装载程序
(1)程序加载后,ds存放程序所在内存区的段地址,该内存区德地址为ds:0
(2)内存区的前256(100h)个字节为程序段的前缀(PSP),DOS用来和程序进行通信,该段作为数据区
(3)从第256字节处往后的空间存放的是程序,cs的值为ds+10h
(4)程序加载后,cx是存放代码的长度(字节)
2. 用debug单步执行指令
-t 命令单步执行
-p 命令类似t命令,逐条执行指令,显示结果,但遇子程序,中断等时,直接执行,然后显示结果
-g 命令从指定地址处开始运行程序,直到遇到断点或程序结束