有人可以解释这些装配线吗?

时间:2011-10-03 19:23:36

标签: visual-studio debugging assembly stack .net-assembly

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,偏移对我来说更有意义。

感谢。

1 个答案:

答案 0 :(得分:4)

debug 模式下编译时,Microsoft编译器会在生成的代码中添加大量填充和其他安全检查代码。使用0xCC字节填充堆栈是其中一项检查。与生成的gcc代码相比,这可能会使您的解释混淆。

发布模式下,通常会关闭这些安全检查,但会启用优化。优化可能会使您的汇编代码更难以遵循。

为了获得最佳效果,您可以尝试从发布模式开始创建新配置,特别是关闭优化。