关于VC++的函数调用堆栈问题

RomanticProgrammer 2004-06-25 10:45:07
为什么VC在生成函数的汇编时要在堆栈上放0x40bit的空白。这样的话我在fc嵌入的汇编中如果要找得函数返回的地址需要从ESP减去局部变量,然后再前去44h。

看看下面的这个FC函数生成的汇编:
void fc()
{
printf("call");
}
//////////////////////////////////////////////
30: printf("call");
void fc()
29: {
00401080 push ebp
00401081 mov ebp,esp
00401083 sub esp,40h //看看这里
00401086 push ebx
00401087 push esi
00401088 push edi
00401089 lea edi,[ebp-40h]
0040108C mov ecx,10h
00401091 mov eax,0CCCCCCCCh // 填充
00401096 rep stos dword ptr [edi]
00401098 push offset string "call" (00423ff8)
0040109D call printf (004010c0)
004010A2 add esp,4
31: }
...全文
319 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
RomanticProgrammer 2004-09-07
  • 打赏
  • 举报
回复
各位大哥,这个帖子有问题,揭帖时看不到一些人,所以只能这样,望见谅!
addylee 2004-06-29
  • 打赏
  • 举报
回复
.NET好像空出了128个字节。
PiggyXP 2004-06-28
  • 打赏
  • 举报
回复
我试了一下debug里面确实是这样的,但是release的就没有了

我想 FengYuanMSFT(袁峰 www.fengyuan.com) 说得有道理^_^
RomanticProgrammer 2004-06-28
  • 打赏
  • 举报
回复
up
flyelf 2004-06-28
  • 打赏
  • 举报
回复
gz
tabris17 2004-06-28
  • 打赏
  • 举报
回复
debug版的关系
sunrui 2004-06-25
  • 打赏
  • 举报
回复
似乎是debug用的,release版作优化以后就没了
lianglp 2004-06-25
  • 打赏
  • 举报
回复
楼主这里根据参数不一样是有点区别的。
但是它的返回值是放到EBP里的。FengYuanMSFT说得对
SeekTruth 2004-06-25
  • 打赏
  • 举报
回复

C++Builder6无此现象,在我的VC7上上述代码为:

push ebp
mov ebp,esp
sub esp,0C0h-------->看这里
push ebx
push esi
push edi
lea edi,[ebp-0C0h]
mov ecx,30h
mov eax,0CCCCCCCCh
rep stos dword ptr [edi]
...........

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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