我仍然在學習彙編語言和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