首页
社区
课程
招聘
关于main函数{那一段汇编代码
发表于: 2009-11-15 17:17 4220

关于main函数{那一段汇编代码

2009-11-15 17:17
4220
最近研究c是怎么调用函数的。写了一个测试代码:
int main (void)
{

  int x = 1;

  return 0 ;

}

vc下生成的汇编代码如下:
1:    int main (void)
2:    {
00401010   push        ebp
00401011   mov         ebp,esp
00401013   sub         esp,44h
00401016   push        ebx
00401017   push        esi
00401018   push        edi
00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]

3:
4:        int x = 1;
00401028   mov         dword ptr [ebp-4],1
5:
6:        return 0 ;
0040102F   xor         eax,eax
7:
8:    }
00401031   pop         edi
00401032   pop         esi
00401033   pop         ebx
00401034   mov         esp,ebp
00401036   pop         ebp
00401037   ret

========================================================

红色部分执行完之后,堆栈应该如下图



其中红色那段一共0x40个字节的空间是做什么用的啊?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
debug 还是 release版本的啊
在调试原理里面有讲到,为了帮助检查错误和支持调试,保证函数返回时栈指针的值与进入函数时一致。以便万一cpu意外执行到该区域时,可以中断到调试器。0xCC 就是INT3 指令
2009-11-15 18:16
0
雪    币: 46
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
等高手解答吧,我也不知道!
2009-11-15 18:18
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
回答2楼
是debug版本的。
能不能详细一点说说0xCC?
2009-11-15 18:20
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
断点异常INT 3指令的机器码为11001100b 就是 0xCC
2009-11-15 18:26
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]

就是这几句代码的作用吧

我以前看有人回答过,想不起回答了,反正我觉得没必要去理他
2009-11-15 18:30
0
雪    币: 2362
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
sub         esp,44h
把栈顶抬高44H(开辟一段栈空间供使用)

00401019   lea         edi,[ebp-44h]
0040101C   mov         ecx,11h
00401021   mov         eax,0CCCCCCCCh
00401026   rep stos    dword ptr [edi]

把这段栈内存全部填充为CC(int 3)

当然,这段代码用到的栈空间只有变量x的4个字节
开辟这么多,就是编译器的效果了
2009-11-15 19:08
0
雪    币: 65
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
CC就是INT 3的机器码,这边是开辟变量内存空间,
初始化为cc,这样如果变量区被其他指令调用的时候,
就会调用int 3中断(一般来说,变量区不应该被调用的)
2009-11-15 19:13
0
雪    币: 157
活跃值: (10)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
了解。有点类似于代码陷阱(我的单片机书里写的)。。为了防止esp由于干扰而指到堆栈中的一种方式是吧。
2009-11-15 20:00
0
雪    币: 71
活跃值: (10)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
10
编译器给main分配足够的局部变量c debug下
0xCC  对应汇编指令 int 3 ,stack上的空间填充值
oxCD  是CRT运行库填充的值,heap的空间
debug状态,为初始化的内存都是0xcc,释放过的内存都是0xdd。
具体看下:http://fpcfjf.blog.163.com/blog/static/5546979320091434614870/
2009-11-19 23:05
0
游客
登录 | 注册 方可回帖
返回
//