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

局部变量的栈有关问题

2012-06-29 
局部变量的栈问题我是一个初学汇编的菜鸟,调试程序的时候,发现一个问题;程序如下:int _tmain(int argc, _T

局部变量的栈问题
我是一个初学汇编的菜鸟,调试程序的时候,发现一个问题;
程序如下:

int _tmain(int argc, _TCHAR* argv[])
{
int m = 1;
int n = 2;
int i = 3;
return 0;
}

debug下汇编代码,VS2008 XP

int _tmain(int argc, _TCHAR* argv[])
{
0042C510 55 push ebp  
0042C511 8B EC mov ebp,esp 
0042C513 81 EC E4 00 00 00 sub esp,0E4h 
0042C519 53 push ebx  
0042C51A 56 push esi  
0042C51B 57 push edi  
0042C51C 8D BD 1C FF FF FF lea edi,[ebp+FFFFFF1Ch] 
0042C522 B9 39 00 00 00 mov ecx,39h 
0042C527 B8 CC CC CC CC mov eax,0CCCCCCCCh 
0042C52C F3 AB rep stos dword ptr es:[edi] 
int m = 1;
0042C52E C7 45 F8 01 00 00 00 mov dword ptr [ebp-8],1 
int n = 2;
0042C535 C7 45 EC 02 00 00 00 mov dword ptr [ebp-14h],2 //为何不是ebp - 0ch???
int i = 3;
0042C53C C7 45 E0 03 00 00 00 mov dword ptr [ebp-20h],3 //为何不是ebp - 10h????
return 0;
0042C543 33 C0 xor eax,eax 
}
0042C545 5F pop edi  
0042C546 5E pop esi  
0042C547 5B pop ebx  
0042C548 8B E5 mov esp,ebp 
0042C54A 5D pop ebp  
0042C54B C3 ret  

我标出的地方,怎么不连续呢?是因为是debug编译的问题?还是因为什么,期待大家的帮助:)

[解决办法]
看下编译选项?vc2008 直接命令行下 cl 进行编译,没有这些。
[解决办法]
这是因为编译器开启了 缓冲区安全检查,/GS[-]

从VC++ 8开始,如果开启了缓冲区安全检查,则编译器对栈溢出所做的解决方法:
1)变量检查:插入默认局部变量(192字节),在每一个局部变量两端插入栅栏字节(0xCCCCCCCC,8字节)
2)安全Cookie:在栈中紧随栈帧处存放一个随即计算的Cookie值与EBP的异或后的值,既可以检查栈是否下溢,又可检查EBP是否正确.

1只用于调试版,2可用于调试版和发行版.

你的程序编译后,内存中的状态是


0xCCCCCCCC
0x00000003 i
0xCCCCCCCC
0xCCCCCCCC
0x00000002 n
0xCCCCCCCC
0xCCCCCCCC
0x00000001 m
0xCCCCCCCC

关闭缓冲区安全检查就不会出现这些栅栏字节了

热点排行