我仍然在学习汇编语言和C语言,但现在我正试图理解编译器是如何工作的。我这里有一个简单的代码:调试C程序(int声明)
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有箭头的原因。 因此,主要的功能开始别人推EBP唧唧歪歪等,然后我不明白这一点:
0x080483f9 <+3>: sub $0x10,%esp => 0x080483fc <+6>: movl $0xa,-0x4(%ebp)
为什么在ESP做子?是栈上的变量'a',堆栈指针的偏移量为-0x4?
只是为了清除这里的想法:D
在此先感谢!
出于好奇,你使用gcc吗?如果是,哪个版本? – BlackBear
gcc版本4.7.3(Ubuntu/Linaro 4.7.3-1ubuntu1) – int3