免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2381 | 回复: 3
打印 上一主题 下一主题

关于C函数调用反汇编代码中的疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-29 10:48 |只看该作者 |倒序浏览
我是一菜鸟,刚接触到汇编,在观察一个简单的函数调用的反汇编代码的时候对EBP和ESP的变化始终没弄清楚,下面是截取的一小部分代码
---------------------------------------------------------------
17:   int main(){
00401100   push        ebp
00401101   mov         ebp,esp
00401103   sub         esp,4Ch
00401106   push        ebx
00401107   push        esi
00401108   push        edi
00401109   lea         edi,[ebp-4Ch]
0040110C   mov         ecx,13h
00401111   mov         eax,0CCCCCCCCh
00401116   rep stos    dword ptr [edi]
18:       int a = 1,b = 2;
00401118   mov         dword ptr [ebp-4],1
0040111F   mov         dword ptr [ebp-8],2
------------------------------------------------------------------
一.push ebx,push esi,push edi后此时ebp和esp存放的内容分别指向什么地方?
二. int a =1,b =2;的反汇编代码 mov dword ptr[ebp-4],1 这里,mov dword ptr[ebp-4]为什么没有把开始push的ebx覆盖掉,那此时ebp中的内容指向的位置是什么地方呢?ebp在寄存器值push的过程中也在改变?

论坛徽章:
0
2 [报告]
发表于 2008-10-29 10:58 |只看该作者
一、ebp指向esp原来的位置,即old ebp存放位置的下一个
esp 经过了sub esp 4Ch,指向了栈延伸4Ch处
二、push的ebx是不和[ebp-4]在一个位置啊,ebx应该是在[ebp-4Ch-4]的位置处,在push过程中,改变的是esp,不是ebp

我是这么看的,不知道有没有什么不完善的地方

论坛徽章:
0
3 [报告]
发表于 2008-10-29 12:45 |只看该作者
这是标准的x86栈帧结构。
para2
para1
ret address
ebp   <-----在一个函数调用过程中ebp始终指向这儿
。。。。
0x4c的空间
。。。。
ebx
esi
edi <------esp指向这儿,可能会随时改变

因为一个函数运行中esp是可能改变的,所以关于栈的寻址都是以ebp为基准进行的。返回时,会mov esp ,ebp,然后pop ebp,这是ebp就回到调用方的栈帧位置了。

因为有个sub esp,0x4c,所以ebp -4并非指向保存的ebx处,而是一个函数局部变量处

论坛徽章:
0
4 [报告]
发表于 2008-10-29 13:21 |只看该作者
原帖由 CMAX 于 2008-10-29 10:58 发表
一、ebp指向esp原来的位置,即old ebp存放位置的下一个
esp 经过了sub esp 4Ch,指向了栈延伸4Ch处
二、push的ebx是不和[ebp-4]在一个位置啊,ebx应该是在[ebp-4Ch-4]的位置处,在push过程中,改变的是esp,不 ...

谢谢两位的解答,刚画了一下图,开始有点慢慢体会了,晚上上课的时候再想一下 谢谢了:wink:
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP