_AddPS函數不平衡堆棧,並且打算是StdCAll。我沒有更多的信息,而這只是我的第二段彙編代碼(我的第一個是模擬cdecl函數調用的測試.exe)。我的stdcall彙編代碼不平衡堆棧
.386
.MODEL FLAT, STDCALL
option casemap :none ; case sensitive
.CODE
_LibMain proc instance:dword, reason:dword, unused:dword
mov EAX, 1 ;
ret
_LibMain endp
_AddPS proc a:dword, b:dword
push ebp ;
mov ebp, esp ; // ebp << esp
push EAX ;
push EBX ;
mov EAX, [ebp+8] ;
mov EBX, [ebp+4] ;
add EAX, EBX ;
pop EBX ;
pop EAX ;
mov esp, ebp ;
pop ebp ;
RET 8
_AddPS endp
END _LibMain
使用MASM和下面的命令行編譯:
c:\Asm\Test.asm /coff /Gz /FeC:\Asm\Test.dll /FoC:\Asm\Test.obj /link /SUBSYSTEM:WINDOWS /link /DLL
編輯:下面的代碼工作,但我爲什麼朦朧:
_Test proc a:dword, b:dword
push ebp ; Store the stack frame.
push EAX ; Store EAX. Probably not needed.
mov EAX, a ; Move a into EAX.
add EAX, b ; Add b to EAX.
add esp, 4 ; Move past the stored EAX without popping.
pop ebp ; pop the stack frame.
RET 8 // dword is 4 bytes in .386. We return past the parameters.
_Test endp // Marks where to stop compiling the function.
您是否嘗試刪除「mov esp,ebp」?該指示不應該是必要的,並且(現在我猜測)可能是不平衡堆棧的原因。 – 2013-03-09 21:32:01
你能解釋爲什麼沒有必要嗎?恢復指令指針似乎很重要。 – 2013-03-09 21:44:18
「mov esp,ebp」恢復堆棧指針。但是,如果push和pop匹配的次數不足,則堆棧指針不必恢復。 ebp被用作基址指針來訪問堆棧中的局部變量和參數。例如。在「mov EAX,[ebp + 8]」和「mov EBX,[ebp + 4]」中,它是執行堆棧平衡的「RET 8」指令。 – 2013-03-09 22:00:32