Visual studio 有人能解释一下这两条装配线吗?

Visual studio 有人能解释一下这两条装配线吗?,visual-studio,debugging,assembly,stack,.net-assembly,Visual Studio,Debugging,Assembly,Stack,.net Assembly,C++ 有几件事我不明白 (1) G++将有16个字节的堆栈对齐,在VisualStudio中这样做是228个字节 (2) 在Windows上执行此操作时,堆栈是向上增长还是向下增长?我很困惑。我知道堆栈应该是什么样子 int main(void) { int a = 3; int b = 10; int c; c = a + b; return 0; } 008C1353 sub esp,0E4h ...... 008C135C l

C++

有几件事我不明白

(1) G++将有16个字节的堆栈对齐,在VisualStudio中这样做是228个字节

(2) 在Windows上执行此操作时,堆栈是向上增长还是向下增长?我很困惑。我知道堆栈应该是什么样子

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;
那么最低的地址是向下的地址吗

(3) 当我们把变量a推到堆栈中时,它是ebp-8。为什么它是8个字节? (4) 同样,为什么int b ebp-14是

有人能给我解释一下吗?(-4,-8,分别)

使用GDB,偏移对我来说更有意义

谢谢。

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

在释放模式下,这些安全检查通常关闭,但优化打开。优化可能会使您的汇编代码更难遵循

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

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

在释放模式下,这些安全检查通常关闭,但优化打开。优化可能会使您的汇编代码更难遵循


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

在x86上,堆栈总是向下增长。堆栈过大是因为/ZI,允许在调试时编辑代码和添加局部变量。本地地址和0xCCCC分配是因为/RTC,支持运行时检查。在x86上,堆栈总是向下增长。超大的堆栈是因为/ZI,允许在调试时编辑代码和添加局部变量。本地地址和0xCCCC分配是因为/RTC,支持运行时检查。Hewgill谢谢。这就是为什么我们有228个字节。但是ebp-8呢?应该是-4吗?INTB偏移量是ebp-14,编译器可以将局部变量放在堆栈框架中任何需要的地方。看起来它可能会在变量之间留出一些空间来检测意外的覆盖。Hewgill,是的。实际上我把它放在了发行版上,并关闭了选项。看起来很有希望。谢谢我稍后会再检查。谢谢你,这真的很有帮助。谢谢你。这就是为什么我们有228个字节。但是ebp-8呢?应该是-4吗?INTB偏移量是ebp-14,编译器可以将局部变量放在堆栈框架中任何需要的地方。看起来它可能会在变量之间留出一些空间来检测意外的覆盖。Hewgill,是的。实际上我把它放在了发行版上,并关闭了选项。看起来很有希望。谢谢我以后再查。谢谢你,这真的很有帮助。
[Parameter n          ]
...
[Parameter 2          ]
[Parameter 1          ]
[Return Address       ]   0x002CF744
[Previous EBP         ]   0x002CF740  (current ebp)
[Local Variables      ]