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

函数栈不平衡,该怎么解决

2012-02-22 
函数栈不平衡Main函数中定义了一个变量, 四字节的变量str按照道理[ebp-4]保存的就是这个str, 结果 反汇编

函数栈不平衡
Main函数中定义了一个变量, 四字节的变量 str

按照道理[ebp-4]保存的就是这个str, 结果 反汇编后,[ebp-8]保存了str!!!!!

[ebp-4]却木有保存,是怎么回事呢???

看反汇编吧:



C/C++ code
int _tmain(int argc, _TCHAR* argv[]){00A614D0  push        ebp  00A614D1  mov         ebp,esp 00A614D3  sub         esp,0CCh 00A614D9  push        ebx  00A614DA  push        esi  00A614DB  push        edi  00A614DC  lea         edi,[ebp-0CCh] 00A614E2  mov         ecx,33h 00A614E7  mov         eax,0CCCCCCCCh 00A614EC  rep stos    dword ptr es:[edi]         char const* const str="xx";00A614EE  mov         dword ptr [str],offset string "xx" (0A66800h)     std::cout<<str;00A614F5  mov         eax,dword ptr [str] 00A614F8  push        eax  00A614F9  mov         ecx,dword ptr [__imp_std::cout (0A69310h)] 00A614FF  push        ecx  00A61500  call        std::operator<<<std::char_traits<char> > (0A61159h) 00A61505  add         esp,8     return 0;00A61508  xor         eax,eax 





 EBP = 0023F73C ,按照堆栈平衡,那么[ebp-4]的值是00A66800 即0023F738的值才是00A66800 ,而不是0023F734的值是00A66800 !!!






[解决办法]
哪个文件规定要从EBP-4开始分配变量空间?

编译器爱在哪里就放那里。。不要研究这种无聊的问题
[解决办法]
是不是把函数 局部变量 和 参数变量 搞混了?
参数变量[esp + 4](第一个参数)固定
局部变量在栈的偏移位置不固定
参数变量 才和 堆栈平衡 有点联系

热点排行