为什么VS下一个int总是从ebp-8开始,ebp-4对应的4个字节干吗用了?

dpdp_2012 2012-10-10 05:11:30
RT
...全文
507 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
dpdp_2012 2012-10-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
1 我记不清了,你可以查一下vc用了防止stackoverflow 机制,在返回地址前插一个checkval。
我不确定是不是这玩意,你可以搜一下。
[/Quote]我也是在想留出这四个字节,是不是和什么缓冲区溢出有关。
大熊猫侯佩 2012-10-10
  • 打赏
  • 举报
回复
ebp+4是返回地址鸟
swlilike 2012-10-10
  • 打赏
  • 举报
回复
ebp-4 是不是存放 ret 的返回地址了?
大熊猫侯佩 2012-10-10
  • 打赏
  • 举报
回复
1 我记不清了,你可以查一下vc用了防止stackoverflow 机制,在返回地址前插一个checkval。
我不确定是不是这玩意,你可以搜一下。
大熊猫侯佩 2012-10-10
  • 打赏
  • 举报
回复
你说的是函数局部变量是吧?这个没有绝对。

因为在函数进入序言后,

ebp->old ebp
ebp+4->ret addr
ebp+8->1st parm

所以ebp-4是可以使用的,至于vc为啥不用,2种可能:

1 做vc专有用途

2 简单无视他,就是不用
学习汇编的一个重要的方法就是将汇编代码和c代码之间进行转换练习,这样的练习做的越多,对汇编就越熟悉,同时对c代码的理解也更加深刻。很多时候,拿到一个程序的反汇编代码,虽然可能每一行汇编代码都知道什么意思,但却发现对于整个程序干了什么却不知道,原因在于一个简单的程序,翻译成汇编的代码量相对于c程序而言多了好多,而且因为汇编代码和人的思维差别比较大,所以,对于整个逻辑的理解就很困难。然而如果经常做一些将汇编翻译成c代码的练习,那么你渐渐就会发现,汇编代码其实也很都有规律,看到这一段汇编代码,你就很自然的联想到它对应的c代码。 下面我们就开始做一下这样的练习,首先看一下下面的汇编代码: ##### 第一段第代码 00401020 push ebp ; 保存epb 00401021 mov ebp,esp ; 将ebp指向栈顶 00401023 sub esp,4Ch ;为局部变量分配空间,sub esp, xxx相当于多个push 00401026 push ebx ; 保存ebx 00401027 push esi ; 保存esi 00401028 push edi ; 保存edi, 上面3个寄存器在使用之前必须保存 00401029 lea edi,[ebp-4Ch] ; 将刚刚分配的局部空间的地址送到edi 0040102C mov ecx,13h ; ecx这里是循环次数=4ch/4h =13h 00401031 mov eax,0CCCCCCCCh ; 将4个int 3指令放入eax 00401036 rep stos dword ptr [edi] ; 将分配的局部变量空间都用int 3指令填充 .....

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧