有谁知道进入main函数后初始化64字节空间是干什么用的?

liuxmzc 2010-01-08 11:44:15
11: int main()
12: {
004015C0 push ebp
004015C1 mov ebp,esp
004015C3 sub esp,40h
004015C6 push ebx
004015C7 push esi
004015C8 push edi
004015C9 lea edi,[ebp-40h]
004015CC mov ecx,10h
004015D1 mov eax,0CCCCCCCCh
004015D6 rep stos dword ptr [edi]

...

}

跟踪了下,就没发现被用!

大家尽情说说,尽量给依据。分的上限只能给100了。
...全文
348 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixumolin 2011-02-28
  • 打赏
  • 举报
回复
虽然都结帖了,我还是说一下我的看法。初始化的这64个字节是用0xcch来初始化的。而0xcch对应的汇编码就是int 3,一个软中断码。我估计是用来防止栈不平衡时溢出时执行到栈上面去了。而在栈上执行代码是不安全的。所以在调试版本可以检查出这一个溢出问题。而release版本的可以认为是作者检查认为没有这些问题的好程序所以就不需要进行这些设置了。
liuxmzc 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 tanmeining 的回复:]
[/Quote]
首先说明:
1. 你没有看清我的题意:
我说的是64字节(vc6.0是64字节,而更高版本是多少就没有试过,看你的反汇编代码是192字节)的空间怎么用?用到哪?——我没发现(这片空间)被用,如果你能回答“在什么情况下被用,当然我需要的是代码证明,而不是 贫嘴说说。”那才回答了我的我问题。
而你所说的“保存栈底指针,开辟栈空间,等等一系列操作”是对的吗? 你就没有真的高清,保存在那里!可能你说的唯一对的是“开辟空间”。
2. 我也没有看清你的回复:理解为保存堆栈,所以我才用了一个内嵌汇编来改变堆栈指针寄存器,看看是不是会发生错误,结果是不会。如果把ESP的值改在[0012FF40, 0012FF79]就会出错。

总之,你只要证明你的

...
0042D672 mov ecx,30h
0042D677 mov eax,0CCCCCCCCh
0042D67C rep stos dword ptr es:[edi]
...

这一片区域用在哪?能不能用实例证明! 其他的区域我并不需要你的解释!
liuxmzc 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 jernymy 的回复:]
学习
[/Quote]
首先说明:
1. 你没有看清我的题意:
我说的是64字节(vc6.0是64字节,而更高版本是多少就没有试过,看你的反汇编代码是192字节)的空间怎么用?用到哪?——我没发现(这片空间)被用,如果你能回答“在什么情况下被用,当然我需要的是代码证明,而不是 贫嘴说说。”那才回答了我的我问题。
而你所说的“保存栈底指针,开辟栈空间,等等一系列操作”是对的吗? 你就没有真的高清,保存在那里!可能你说的唯一对的是“开辟空间”。
2. 我也没有看清你的回复:理解为保存堆栈,所以我才用了一个内嵌汇编来改变堆栈指针寄存器,看看是不是会发生错误,结果是不会。如果把ESP的值改在[0012FF40, 0012FF79]就会出错。

总之,你只要证明你的

...
0042D672 mov ecx,30h
0042D677 mov eax,0CCCCCCCCh
0042D67C rep stos dword ptr es:[edi]
...

这一片区域用在哪?能不能用实例证明! 其他的区域我并不需要你的解释!
tanmeining 2010-01-12
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 liuxmzc 的回复:]
引用 24 楼 tanmeining 的回复:
保存栈底指针,开辟栈空间,等等一系列操作


呵呵,你说的不对。。。
C/C++ codeint main()
{
__asm{
mov esp,0x00122F00
};return0;
}
[/Quote]


int main()
{
0042D660 push ebp ;保持栈底指针
0042D661 mov ebp,esp ;将栈顶指针赋值给栈底指针
0042D663 sub esp,0C0h ;移动栈顶指针
0042D669 push ebx ;基址寄存器
0042D66A push esi ;源变址寄存器
0042D66B push edi ;目地变址寄存器
0042D66C lea edi,[ebp-0C0h] ;开辟空间存放main函数中的参数部分
0042D672 mov ecx,30h
0042D677 mov eax,0CCCCCCCCh
0042D67C rep stos dword ptr es:[edi]


return 0;
0042D67E xor eax,eax
}

而你所写的程序,内嵌汇编,仅仅是将一个地址赋值给esp,同样为开辟栈空间,我就不知道你为什么会说我写的那个不正确,或许你可以尝试着写个内嵌汇编ebp然后给个址,看看你还能不能调用到相应的函数,就知道了。
liuxmzc 2010-01-08
  • 打赏
  • 举报
回复
看雪这篇帖子说法不太正确!
Debug版本才有?release有没有还不知道,晚上下班用OD试试。
但是如果只有Debug才有的话,软件发行版本基本是Release,也就不妨堆栈溢出吗?
为什么要防?不是有__chkesp()吗?
aozhi 2010-01-08
  • 打赏
  • 举报
回复
将堆栈指针下移,即随后的堆栈操作不破户的变量区
xixiaoliu 2010-01-08
  • 打赏
  • 举报
回复
是 Debug 版才有的

http://bbs.pediy.com/showthread.php?t=1723
z569362161 2010-01-08
  • 打赏
  • 举报
回复
是暂时没用的东西
liuxmzc 2010-01-08
  • 打赏
  • 举报
回复
不是,是任何一个VC6.0写的console程序。
2010-01-08
  • 打赏
  • 举报
回复
这个……
是 Debug 里面用来检查溢出的吧……
liuxmzc 2010-01-08
  • 打赏
  • 举报
回复
LS :你自己试试,随便一个main函数一样! 可见你没有想过这个问题啊。
sandyandy 2010-01-08
  • 打赏
  • 举报
回复
不懂汇编, 友情帮顶
xixiaoliu 2010-01-08
  • 打赏
  • 举报
回复
不对不对,看错了,不定义也有的,不知道什么用
xixiaoliu 2010-01-08
  • 打赏
  • 举报
回复
给出源代码吧, 你应该定义过局部变量
jernymy 2010-01-08
  • 打赏
  • 举报
回复
学习
jue222 2010-01-08
  • 打赏
  • 举报
回复

学习了
z15881328993 2010-01-08
  • 打赏
  • 举报
回复
OD跟踪至此,我知道前面有段程序时VC编译器的程序,执行完编译器程式再交给main执行
东大坡居士 2010-01-08
  • 打赏
  • 举报
回复
学习了~~~~~~~~~~~~
FrankSun80 2010-01-08
  • 打赏
  • 举报
回复
学习了~
jx8904020853 2010-01-08
  • 打赏
  • 举报
回复
开始是要保存ebp,后面的空闲内存主要是对齐,以期提升访存速度。
加载更多回复(22)

69,379

社区成员

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

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