【发布时间】:2013-10-13 03:39:31
【问题描述】:
我仍在学习汇编和 C,但现在,我正在尝试了解编译器的工作原理。我这里有一个简单的代码:
int sub()
{
return 0xBEEF;
}
main()
{
int a=10;
sub();
}
现在我已经知道 CPU 是如何工作的,跳入帧和子程序等。 我不明白程序“存储”它们的局部变量的位置。在这种情况下在主框架中?
这是调试器的主框架:
0x080483f6 <+0>: push %ebp
0x080483f7 <+1>: mov %esp,%ebp
0x080483f9 <+3>: sub $0x10,%esp
=> 0x080483fc <+6>: movl $0xa,-0x4(%ebp)
0x08048403 <+13>: call 0x80483ec <sub>
0x08048408 <+18>: leave
0x08048409 <+19>: ret
我在 "int a=10;"一个断点,这就是偏移量 6 有那个箭头的原因。 所以,main的功能开始就像其他人推动ebp bla bla bla一样,然后我不明白这一点:
0x080483f9 <+3>: sub $0x10,%esp => 0x080483fc <+6>: movl $0xa,-0x4(%ebp)
为什么要在 esp 中做 sub?堆栈指针的偏移量为-0x4的变量'a'是否在堆栈上?
只是为了清除这里的想法:D
提前致谢!
【问题讨论】:
-
只是出于好奇,您使用的是 gcc 吗?如果是,哪个版本?
-
gcc 版本 4.7.3 (Ubuntu/Linaro 4.7.3-1ubuntu1)
标签: c debugging assembly stack