编程(Edit) → 1.asm → 编译(masm) → 1.obj → 连接(link) → 1.exe → 加载(command) → 内存中的程序 → 运行(CPU)

可执行文件包含两部分内容:程序(从源程序的汇编指令翻译来的机器码)和数据(源程序中定义的数据),相关的描述信息(程序有多大、要占用多少内存空间)。

伪指令+汇编指令

1.定义一个段

<段名> segment

<段名> ends

  1. 结束编译

end

  1. 假设

assume,假设某一段寄存器和程序中某一个segments...ends定义的段相关联

assume cs:codesg ;将代码段codesg和CPU的段寄存器相关联

codesh segment ;伪指令是给编译器来处理
	
	mov ax,0123H ;程序由源程序中的汇编指令经编译连接转变为机器码,存储在可执行文件中。
	mov bx,0456H
	add ax,bx
	add ax,ax

	mov ax,4c00H ;这两句
	int 21H ;不用理解,实现程序返回

codesg ends

end

对于编译器来说,汇编命令的逻辑错误编译时候是发现不了的,除非是伪指令出错的语法错误,才可以发现。

c:\\masm>masm
Mircrosoft <R> Macro Assmebler Version 5.00
Copyright <C> Microsoft Corp 1981-1985, 1987. All rights reserved.

Source filename [.ASM]: c:\\1.asm
Object filename [1.OBJ]:          ;编译出的目标文件,最终结果
Source listing [NUL.LST]:         ;让输入列表文件的名称,是中间结果,可以直接回车跳过
Cross-reference [NUL.CRF]:        ;让输入交叉引用文件的名称,是中间结果,可以直接回车跳过

	51522 + 422654 Bytes symbol space free
	
		0 Warning Errors
		0 Severe Errors

#简化方式编译
c:\\masm>masm c:\\1;
c:\\masm>link
Mircrosoft <R> Overlay Linker Version 3.60
Copyright <C> Microsoft Corp 1981-1987. All rights reserved.

Object Modules [.OBJ]: 1                  ;要连接的目标文件
Run File [1.EXE]:                         ;目标连接后的结果
List File [NUL.MAP]:                      ;让输入映像文件的名称,中间结果,可以跳过
Libraries [.LIB]                          ;让输入库文件的名称,没有调用任何子程序的话,可以跳过
LINK : warning L4021: no stack segment    ;告警,提示没有栈段,可以忽略

#简化方式连接
c:\\masm>link c:\\1;

连接的作用是:

  1. 当源程序很大时候,可以分为多个源程序文件来编译,再分成多个目标文件,最后连接在一起。
  2. 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接在一起,成为可执行文件
  3. 存有机器码的目标文件,有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。
  1. 在DOS中,是正在运行的command,将1.exe中的程序加载进入内存。
  2. command设置CPU的CS:IP指向程序的第一条指令。
  3. 程序运行结束,返回到command中,CPU继续运行command。