用汇编语言编写的源程序不能直接在其目标计算机上执行,必须通过翻译或汇编将其转换为可执行代码.

汇编-链接-执行周期:

  • 编程者用文本编辑器(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

 

 

 

 

 

分类: 编程