1. ホーム
  2. c

[解決済み] x86_64アセンブラのRBPレジスタは何のためにあるのですか?

2022-03-05 06:47:07

質問

コンピュータアーキテクチャーの授業で必要なので、アセンブリを少し勉強しようと思っています。フィボナッチ数列を表示するようなプログラムをいくつか書きました。

関数を書くときは必ずこの3行を使うことを認識しました。 gcc をその C と等価)。

pushq   %rbp
movq    %rsp, %rbp
subq    $16, %rsp

それについて2つ質問があります。

  1. まず第一に、なぜ私が %rbp ? もっとシンプルに %rsp に移動し、そのコンテンツは %rbp を2行目に書いてください。
  2. から何かを差し引かなければならないのはなぜですか? %rsp ? つまり、常に 16 私が printf のような、7つか8つの変数を使用します。 24 または 28 .

私は仮想マシン(4GB RAM)、インテル64ビットプロセッサ上でManjaro 64ビットを使用しています。

解決方法を教えてください。

rbp はx86_64のフレームポインタです。 あなたの生成したコードでは、スタックポインタのスナップショットを取得します( rsp を調整することができます。 rsp (ローカル変数のためのスペースを確保したり) push から一定のオフセットでアクセスできます。 rbp .

多くのコンパイラは最適化オプションとしてフレームポインタの省略を提供しています。 rsp を解放し、代わりに rbp を、関数で使用するための別の汎用レジスタとして使用します。

AT&Tのアセンブラ構文から推測すると、GCCの場合、このスイッチは次のようになります。 -fomit-frame-pointer . このスイッチを使ってコンパイルし、どのようなアセンブリコードが得られるか見てみましょう。 からの相対的な値にアクセスするときに、おそらく気づくでしょう。 rsp ではなく rbp この場合、ポインタからのオフセットは関数全体で変化します。