C ++
int main(void)
{
int a = 3;
int b = 10;
int c;
c = a + b;
return 0;
}
008C1353 sub esp,0E4h
......
008C135C lea edi,[ebp+FFFFFF1Ch]
008C1362 mov ecx,39h
008C1367 mov eax,0CCCCCCCCh
008C136C rep stos dword ptr es:[edi]
3: int a = 3;
008C136E mov dword ptr [ebp-8],3
4: int b = 10;
008C1375 mov dword ptr [ebp-14h],0Ah
5: int c;
6: c = a + b;
我不明白的一些事情。
(1)G ++将堆栈对齐16个字节,在Visual Studio中执行此操作是228字节??
(2)在Windows上执行此操作,堆栈是向上还是向下增长?我很迷惑。我知道堆栈应该是什么样子
[Parameter n ]
...
[Parameter 2 ]
[Parameter 1 ]
[Return Address ] 0x002CF744
[Previous EBP ] 0x002CF740 (current ebp)
[Local Variables ]
那么最低地址是向下的吗?
(3)当我们将变量a推送到堆栈时,它是ebp - 8.它是8个字节? (4)同样,为什么int b ebp - 14?
有人可以向我解释一下吗? (-4,-8,分别)
使用GDB,偏移对我来说更有意义。
感谢。
答案 0 :(得分:4)
在 debug 模式下编译时,Microsoft编译器会在生成的代码中添加大量填充和其他安全检查代码。使用0xCC字节填充堆栈是其中一项检查。与生成的gcc代码相比,这可能会使您的解释混淆。
在发布模式下,通常会关闭这些安全检查,但会启用优化。优化可能会使您的汇编代码更难以遵循。
为了获得最佳效果,您可以尝试从发布模式开始创建新配置,特别是关闭优化。