Asm和VC混合編程 局部變量
masm符號
@@
@F即(forward),指令後第一個@@標號
@B即(before),指令前第一個@@標號局部變量
TestProc proc
local @local:DWORD
local @local2:WORD
local @local3:BYTE
mov eax, @local
mov ax, @local2
mov al, @local3
ret
TestProc endp
反彙編
00401000 /$ 55 push ebp
00401001 |? 8BEC mov ebp,esp
00401003 |? 83C4 F8 add esp,-0x8
00401006 |? 8B45 FC mov eax,[local.1]
00401009 |. 66:8B45 FA mov ax,word ptr ss:[ebp-0x6]
0040100D |? 8A45 F9 mov al,byte ptr ss:[ebp-0x7]
00401010 |? C9 leave
說明
TestProc
爲一個函數,反彙編後對應爲棧幀
push ebp
mov ebp,esp
...
...
mov esp,ebp
pop ebp
retn
ebp
: extended base pointer
,基址指針寄存器,行使棧幀指針
esp
: extended stack pointer
,棧頂指針
函數調用,原則就是esp指向下一個(函數)ebp (esp -> ebp)
,這樣使得不同的代碼塊(函數)指向獨立的內存空間。(這樣就像C數據結構的*next
指針,尾指針總指向下一個頭結點,把圖畫出來就很清晰了。),ebp的入棧與恢復過程可以看出一個簡單的數學問題。這就好像有兩個班的學生一起跑步,1班在前,2班在後,只要保證1班的最後一個永在2班第一個前面,兩個班就分隔開(獨立),在圖上標出ebp和esp。
push ebp
: ebp 32bit 4byte,ebp內容入棧,esp-4,文字如果不好理解,可以借用數學描述符/僞指令,按下面來看
f(‘push’,‘ebp’) = esp(esp-4,(ebp)) 或者數對 f(push,reg) = (addr(esp-4), content(reg))
mov ax,word ptr ss:[ebp-0x6]
ebp偏移量減小 <==> 爲變量開闢/分配空間
leave
<==> mov esp,ebp
+ pop ebp