Asm和VC混合編程_數據傳送(2)

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,基址指針寄存器,行使棧幀指針
espextended 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章