0

_AddPS 函数使堆栈不平衡,并且旨在成为 StdCAll。我没有更多信息,这只是我的第二段汇编程序代码(我的第一段是模拟 cdecl 函数调用的测试 .exe)。

.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.
4

2 回答 2

2

您正在创建2 个堆栈帧!当您PROC在 MASM 中使用关键字创建过程时,MASM 会创建标准的序言和尾声!前 2 行是 MASM 生成的序言,最后 2 行是你的序言。

PUSH    EBP
MOV     EBP, ESP
PUSH    EBP
MOV     EBP, ESP

如果您想以您的方式编写代码并使用 MASM 创建手动堆栈帧并继续使用 MASM procs,您需要关闭序言/尾声创建并在完成后将其重新打开。

这应该有效:

option prologue:none ; turn off default prologue creation
option epilogue:none ; turn off default epilogue creation
_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  
option prologue:PrologueDef ; turn on default prologue creation
option epilogue:EpilogueDef ; turn on default epilogue creation   

如果需要,您甚至可以让 MASM 使用您自己的特殊序言/尾声。

如果您在 olly 之类的调试器中查看您的 exe,您可能会发现错误。

于 2013-03-10T04:59:43.653 回答
1
include masm32rt.inc
.code
start:
    int 3
    ret
        
_AddPSOrg 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

_AddPSOrg endp  

option prologue:none ; turn off default prologue creation
option epilogue:none ; turn off default epilogue creation
_AddPSGood 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
_AddPSGood endp  
option prologue:PrologueDef ; turn on default prologue creation
option epilogue:EpilogueDef ; turn on default epilogue creation     
end start

运行时,int 3将在您的程序中显示 olly。这是olly中的代码: 在此处输入图像描述

你能看到差别吗?????

所以,堆栈不是不平衡的,参数只是不是你期望的。

如果你想知道堆栈是否真的不平衡,esp在函数调用之前和之后打印值,如果值不同,那么堆栈是不平衡的。

于 2013-03-10T16:48:36.827 回答