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