首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

问一个栈的有关问题

2012-03-12 
问一个栈的问题在VC下上一级函数和下一级函数的栈之间有一段空间,全部填充为0xcc,这个空间的大小是有规律

问一个栈的问题
在VC下上一级函数和下一级函数的栈之间有一段空间,全部填充为0xcc,这个空间的大小是有规律的吗?
这个是由写编译器的人制定的吗?

[解决办法]
0xcc 是int 3中断指令的机器码

From: Wikipedia

The INT 3 instruction is defined for use by debuggers to temporarily replace an instruction in a running program, in order to set a breakpoint. Other INT instructions are encoded using two bytes. This makes them unsuitable for use in patching instructions (which can be one byte long).

[解决办法]
大小一般是留够你局部变量所用的大小,vc默认为0x44个字节,既是sub esp,44h
但是如果你局部变量多于44h字节的话,它就会多分配些空间
总之,是要分配够给局部变量的空间
[解决办法]
0xcc 如二楼说的是一条有用的指令
防止程序出错飞走,属于一个陷阱
不知道楼主用过51的汇编没有都会使用一些nop来实现这个陷阱
[解决办法]
===========================
你的意思是release下栈是顺序存放的?
===========================
不明白你的意思,堆栈当然是顺序的了

debug模式下,编译器会加入很多东西方便调试
但是在release版本一般为发布版本,现在这些调试信息就是垃圾,都会被去掉

比如函数
void f()
{
cout < <0;
}
debug版本:
4: void f()
5: {
00401550 55 push ebp
00401551 8B EC mov ebp,esp
00401553 83 EC 40 sub esp,40h //这里分配了0x40h字节的空间
00401556 53 push ebx
00401557 56 push esi
00401558 57 push edi
00401559 8D 7D C0 lea edi,[ebp-40h]
0040155C B9 10 00 00 00 mov ecx,10h //10h
00401561 B8 CC CC CC CC mov eax,0CCCCCCCCh
00401566 F3 AB rep stos dword ptr [edi] //全部初始化为cc
6: cout < <0;
00401568 6A 00 push 0 //这里才是执行cout < <0;的开始
0040156A B9 E0 67 47 00 mov ecx,offset std::cout (004767e0)
0040156F E8 86 FB FF FF call @ILT+245(std::basic_ostream <char,std::char_traits <char> > ::operator < <) (004010fa)
7: }

release版本:
00401000 /> /6A 00 push 0 //前面的垃圾全部没了
00401002 |. |B9 884C4100 mov ecx, 00414C88
00401007 |. |E8 14000000 call 00401020
0040100C |. |C3 retn

某些程序在debug版本运行没有问题,但是release版本却出错,一个可能的原因就是:程序某个地方有越界错误,但是越界后写入到为debug而分配的一部分栈中,程序还不至于崩溃,但是,在正式发布时的release版本中,没有再分配这些不必要的栈内存了,这时越界写入的很可能就会导致程序崩溃。
[解决办法]
顶,这些东西写了挺多程序也没怎么关注过,惭愧

热点排行