Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1472201
  • 博文数量: 150
  • 博客积分: 65
  • 博客等级: 民兵
  • 技术积分: 3415
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 10:30
个人简介

游戏后台开发

文章分类

全部博文(150)

文章存档

2020年(1)

2019年(4)

2017年(3)

2016年(6)

2015年(4)

2014年(45)

2013年(86)

2012年(1)

分类: LINUX

2014-03-08 23:46:12

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

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

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