私はまだアセンブリと 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にその矢印がある理由は、ブレークポイントです。したがって、メインの機能は、他の人がebp bla bla blaを押すように開始されますが、これは理解できません:
0x080483f9 <+3>: sub $0x10,%esp => 0x080483fc <+6>: movl $0xa,-0x4(%ebp)
なぜespでサブをやっているのですか?スタック上の変数 'a' は、スタック ポインターのオフセットが -0x4 ですか?
ここでアイデアをクリアするためだけに:D
前もって感謝します!