面试的时候被问到堆栈平衡,自己以前竟然没听说过这个东西,现在学习总结一下。什么是堆栈平衡。
简单的说就是在函数调用的时候,将函数返回地址, 参数压栈, 在函数执行结束以后恢复堆栈的过程。
实例如下:
sub proc c _var1, _var2
mov eax, _var1
mov ebx, _var2
ret
sub endp
编译后再进行反汇编:
:00401000 55 push ebp
:00401001 8BEC mov ebp, esp
:00401003 8B4508 mov eax, dword ptr [ebp + 08]
:00401006 8B5D0C mov ebx, dword ptr [ebp + 0C]
:00401009 C9 leave
:0040100A C3 ret
压入参数
:00401003 8B4508 mov eax, dword ptr [ebp + 08]
:00401006 8B5D0C mov ebx, dword ptr [ebp + 0C]
一个函数的执行过程如下:
ebp用来存取局部变量
push _var2
push _var1
push 函数的返回地址
push ebp
mov ebp, esp
push 局部变量2
push 局部变量1
_var1的地址就是[ebp+08]
_var2的地址就是[ebp+0c]
[ebp]存放的就是原来ebp的值
[ebp+04]存放的就是函数返回地址
这里使用leave来实现堆栈平衡,即将esp+0c。。。
阅读(791) | 评论(0) | 转发(0) |