当像<dword ptr [ebp-8]>那样访问堆栈帧时,它是否被认为是弹出的?

srh*_*snl 3 assembly masm

我发现这个汇编代码并在分析它时,我意识到我在这里看不到堆栈的清理或平衡.我认为可能像访问堆栈一样dword ptr [ebp-8]等同于弹出内容.我是否正确,如果不是,那么为什么下面的代码没有显示任何pop指令或add esp, whatever??

_AddMe:
push ebp
mov ebp, esp
sub esp, 0ch
mov eax, dword ptr [ebp+0ch]
mov dword ptr [ebp-4], eax
mov eax, dword ptr [ebp+8]
mov dword ptr [ebp-8], eax
mov eax, dword ptr [ebp-8]
add eax, dword ptr [ebp-4]
mov dword ptr [ebp-0ch], eax
mov eax, dword ptr [ebp-0ch]
jmp AddMeEpilogue
AddMeEpilogue:
mov esp, ebp
pop ebp
ret
Run Code Online (Sandbox Code Playgroud)

Dev*_*lus 7

您可以手动递增和递减堆栈指针,因此添加/减去esp基本上类似于推送和弹出操作.

mov eax, 2134
push eax
mov ebx, [esp]
add esp, 04    <-- This is the actual pop operation.
mov ecx, [esp-4]
ret
Run Code Online (Sandbox Code Playgroud)

您可以看到我在推送后没有弹出,但代码仍然执行正确并且类似于.

push eax
pop ebx
mov ecx, ebx
Run Code Online (Sandbox Code Playgroud)

访问堆栈不会改变它的正确性.因此,如果你这样mov eax, dword ptr [ebp-0ch]做并不意味着堆栈将是正确的或不正确的,因为它只是从内存中取出一些恰好是堆栈的值.仅增加或减少ESP具有可被视为pushpop操作的含义.