用汇编语言编写的源程序不能直接在其目标计算机上执行,必须通过翻译或汇编将其转换为可执行代码.
汇编-链接-执行周期:
- 编程者用文本编辑器(text editor)创建并编写一个文本文件,称之为源文件.
- 汇编器读取源文件,并生成目标文件,即对程序的机器语言翻译.或者,它也会生成列表文件.
- 链接器读取并检查目标文件,以便发现该程序是否包含了任何对链接库中过程的调用.链接器从链接库中复制任何被请求的过程,将它们与目标文件组合,以生成可执行文件.
- 操作系统加载程序将执行文件读入内存,CPU到该程序的起始地址,开始执行
列表文件(listing file)包含了程序源文件的副本,再加上行号、每条指令的数字地址、每条指令的机器代码字节(16进制表示)以及符号表.符号表中包含了程序中所有标识符的名称、段和相关信息.高级程序员有时会利用列表文件来获取程序的详细信息.比如如下程序:
.386 ; 表示这是一个32位程序 能访问32位寄存器和地址
;内存模式flat,并确定了子程序的调用规范(stdcall)
.model flat,stdcall
.stack 4096 ; 定义栈段,每个程序必须拥有(不写也能编译过)
; 声明ExitProcess函数 dwExitCode为参数DWORD类型
ExitProcess PROTO,dwExitCode:DWORD
.data
; 不区分大小写
sum DWORD 0 ; 定义变量 双字32位
; 尽量不要以 _,$,@开头定义变量名
.code
main PROC
mov eax,5
add eax,6
mov sum,eax
invoke ExitProcess,0
main endp
end main
生成的列表文件如下(去除注释):
Microsoft (R) Macro Assembler Version 14.16.27025.1 12/26/18 23:14:03
main.asm Page 1 - 1
.386
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
; 我们定义的变量的相对地址,程序加载后,这个地址会转化为绝对地址
00000000 .data
00000000 00000000 sum DWORD 0
; 指令相对位置,程序加载后,这个地址会转化为绝对地址
00000000 .code
00000000 main PROC
00000000 B8 00000005 mov eax,5
00000005 83 C0 06 add eax,6
invoke ExitProcess,0
; 注意 invoke 伪指令的调用
00000008 6A 00 * push +000000000h
0000000A E8 00000000 E * call ExitProcess
0000000F main endp
end main
Microsoft (R) Macro Assembler Version 14.16.27025.1 12/26/18 23:14:03
main.asm Symbols 2 - 1
Segments and Groups:
N a m e Size Length Align Combine Class
FLAT . . . . . . . . . . . . . . GROUP
STACK . . . . . . . . . . . . . 32 Bit 00001000 DWord Stack 'STACK'
_DATA . . . . . . . . . . . . . 32 Bit 00000004 DWord Public 'DATA'
_TEXT . . . . . . . . . . . . . 32 Bit 0000000F DWord Public 'CODE'
Procedures, parameters, and locals:
N a m e Type Value Attr
ExitProcess . . . . . . . . . . P Near 00000000 FLAT Length= 00000000 External STDCALL
main . . . . . . . . . . . . . . P Near 00000000 _TEXT Length= 0000000F Public STDCALL
Symbols:
N a m e Type Value Attr
@CodeSize . . . . . . . . . . . Number 00000000h
@DataSize . . . . . . . . . . . Number 00000000h
@Interface . . . . . . . . . . . Number 00000003h
@Model . . . . . . . . . . . . . Number 00000007h
@code . . . . . . . . . . . . . Text _TEXT
@data . . . . . . . . . . . . . Text FLAT
@fardata? . . . . . . . . . . . Text FLAT
@fardata . . . . . . . . . . . . Text FLAT
@stack . . . . . . . . . . . . . Text FLAT
sum . . . . . . . . . . . . . . DWord 00000000 _DATA
0 Warnings
0 Errors