1. 编译时产生汇编译列表文件
在VS2017中,编译时生成汇编列表文件的步骤如下:
1.1 项目右键->属性->Microsoft Macro Assembler->
Enable Assembly Generated Code Listing 选是(/Sg)
1.2 Assembled Code Listing File
写入生成文件名称,比如
$(ProjectName).list
2. 汇编译列表文件说明
2.1 格式为
offset [code]
offset:自本段首开始的偏移。
code:生成的二进制机器码。
例如(2.2介绍的符号也参看这个例子):
00000000 .data ;这里数据段开始,其后面的数据段内的偏移相对于这里为0开始增长。
00000000 74 68 69 73 20 str_Caption BYTE "this is a caption", 0
69 73 20 61 20
63 61 70 74 69
6F 6E 00
00000012 74 68 69 73 20 str_Output BYTE "this is a message", 0
69 73 20 61 20
6D 65 73 73 61
67 65 00
00000024 0002 value1 word 2
00000026 FFFFFFFB value2 sdword - 5
0000002A 00000000 mulvalue dword 0
0000002E 0000000A [ array1 real8 10 dup(? )
0000000000000000
]
0000007E 000A 0014 001E num word 10, 20, 30
00000084 8001 sum1 sword - 32767
00000086 7FFF sum2 sword 32767
00000088 0000 total sword 0
0000008A 00000000 shang sdword 0
0000008E 00000000 yu sdword 0
00000092 00 var1 sbyte 0
00000000 .code ; ;这里代码段开始,其后面的数据段内的偏移相对于这里为0开始增长。
00000000 AddMethod proc uses ebx edx
; PUSHAD
00000000 53 * push ebx
00000001 52 * push edx
00000002 03 C3 ADD EAX, EBX
00000004 03 C2 ADD EAX, EDX
; POPAD
RET
00000006 5A * pop edx
00000007 5B * pop ebx
00000008 C3 * ret 00000h
00000009 AddMethod endp
00000009 _start PROC
00000009 A0 00000092 R MOV AL,var1
; invoke MessageBox, NULL, offset str_Output, offset str_Caption, MB_OK
0000000E E8 00000000 E call ExitProcess
00000013 _start endp
;end the _start proc,it is not the part of the main.
end _start
2.2 列表中的符号和缩写的含义
C 表示此行来自于包含文件
= EQU或者相当于赋值的号(=)的指令
nn[xx] DUP 表示达: nn次xx值的副本
---- 段/组地址(链接器必段解决)
R 重定位表地址 (链接器必须解决)
* 由汇编器产生的代码
E 外部地址 (链接器必须解决)
n 宏扩展的嵌入层次 (如果超过9层)
| 运算符大小重写
& 地址大小重写
nn: 表达式中的段重写
nn/ REP 或 LOCK 前缀指令
2.3 顺便说一下过程后面的end main
常常在main过程后面跟一句end main,其实这个end main不是main过程的一部分,只是告诉程序函数执行,以main结束,因常写在main后面,以为是main的一部分。
_start PROC
MOV AL,var1
call ExitProcess
_start endp
;end _start不是过程_start的一部分,只是必段放在文件尾,告诉汇编程序从这里结束运行,很多时间恰好放在了入口过程后面。
end _start