Chinaunix首页 | 论坛 | 博客
  • 博客访问: 155078
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2016-11-28 14:16
文章分类

全部博文(115)

文章存档

2017年(36)

2016年(79)

我的朋友

分类: LINUX

2017-02-19 16:58:20

原文地址:堆栈平衡 作者:chaohona

面试的时候被问到堆栈平衡,自己以前竟然没听说过这个东西,现在学习总结一下。什么是堆栈平衡。

简单的说就是在函数调用的时候,将函数返回地址, 参数压栈, 在函数执行结束以后恢复堆栈的过程。
实例如下:
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。。。

阅读(756) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~