Visual studio 有人能解释一下这两条装配线吗?
C++ 有几件事我不明白 (1) G++将有16个字节的堆栈对齐,在VisualStudio中这样做是228个字节 (2) 在Windows上执行此操作时,堆栈是向上增长还是向下增长?我很困惑。我知道堆栈应该是什么样子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
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 ]