我发现这个汇编代码并在分析它时,我意识到我在这里看不到堆栈的清理或平衡.我认为可能像访问堆栈一样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)
您可以手动递增和递减堆栈指针,因此添加/减去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具有可被视为push或pop操作的含义.