第一个程序
一个源程序从写出到执行的过程
-
写出汇编源程序,产生了一个存储源文件的文本文件。
-
对源程序进行编译连接
- 先用编译器将源文件进行编译,得到目标文件
- 再用连接器对目标文件进行连接,得到可执行文件
可执行文件包含两个部分:一部分是程序和数据,另一部分是相关的描述信息(比如,程序有多大,要占用多少内存空间)
- 执行可执行文件
- 操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存中,并进行相关的初始化(比如设置CS:IP)
- CPU执行程序
第一个程序
assume cs:code
code segment
mov ax, 0123h
mov bx, 0456h
add ax, bx
add ax, ax
mov ax, 4c00h
int 21h
code ends
end
伪指令
在汇编语言程序中,包含两种指令
- 汇编指令,可以翻译为机器指令,这个交由CPU进行执行,
- 伪指令,不会翻译为机器指令,由编译器进行执行,编译器会根据伪指令来进行编译。
上面有几类伪指令
-
assume 伪指令
这条指令假设某一段寄存器和程序中某一个段相关联。在编程的时候,记得用assume来将有特定用途的段和相关的段寄存器关联起来即可。
-
XXX segments ... XXX ends
段定义伪指令,两条伪指令要成对使用。不仅使程序结构更加清晰,也能让这一段在编译之后起始地址为16的倍数(之前我们总说,段这一概念是程序员在编写过程中自己内心想的,但段的起始地址为16的倍数这一条件需要明确,此时就需要用到这一伪指令。)
一个汇编程序是由多个段组成的,指令、数据、栈被划分到不同的段中。
-
end汇编指令
end就是一个汇编程序的结束标记,编译器在编译汇编程序的时候,如果碰到了指令end,就结束源程序的编译。
指令
指令是源程序中真正会被编译连接生成机器程序的部分,最终会被CPU执行。指令的功能详情看指令总结部分。
标号
汇编程序中,我们往往能够见到许多标号,例如这里的code就是一个标号,一个标号指代一个地址。这里的code在segment前面,作为段的名字,最终被编译、连接程序处理为一个段的段地址。
程序返回
我们可以看到程序最后两条指令。
mov ax, 4c00h
int 21h
这两条指令实现了程序返回的功能。
在DOS(单任务操作系统)中运行可执行程序的步骤是:一个正在运行的程序P1将P2加载入内存,然后将CPU控制权交给P2,P2才能得以运行,此时P1暂停运行。当P2运 行完毕后,应该将CPU的控制权交还给P1,此后,P1继续运行。
程序的编译连接与执行
完成对源文件的编辑之后,就会得到一个源文件。我们需要对源文件进行编译和连接之后才能生成可执行文件
编译
我们利用masm5.0汇编编译器来进行编译,文件名为masm.exe

我们在命令行中输入masm是调用了masm.exe,后面的t1.asm是我们提供的参数,是masm将要进行编译的文件。
接下来两行告诉我们masm编译器的基本信息
目标文件
Object filename 指的是我们要生成的目标文件名称。**在输入文件名的时候一定要指明它所在的路径。**如果文件在当前目录,那么就可以只输入文件名称,如果文件在其他目录,就需要指定目录。后续所有文件名都是如此
这里我们可以看到有[t1.OBJ],这代表默认生成的目标文件名称为t1,当我们没有进行输入直接回车的时候,就按照默认名称生成目标文件。