0

私はまだアセンブリと 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

前もって感謝します!

4

1 に答える 1