1

こんにちは、ARM アーキテクチャに関する本を読んでいます。(私は初心者です)CPUのレジスタファイルについて読んでいました。

C ++で変数を作成すると、これはバスRMを介してレジスタファイルに送信され、CPUのALUに送信されるデータですか? 例: (int a = 1 + 1;)

そして、アドレスバスを介してメモリアドレスを返すのはアドレスレジスタですか?(例: &a)

この本では C++ については言及されていませんが、私は疑問に思っています。

これを正しく理解しているかどうかを確認したいだけです。回答ありがとうございます。

4

4 に答える 4

3

C++をレジスタファイルやアドレスバスなどのハードウェアに直接関連付けようとするのはおそらく良い考えではありません。中間レベルとしてアセンブリ言語を挿入する方が理にかなっています。したがって、C ++がアセンブリコードにどのように変換されるか、そしてそのアセンブリコードがハードウェアをどのように制御するかを考えてください。ARMに関する本では、アセンブリとハードウェアの関係について説明しています。C ++とアセンブリの関係を理解するには、コンパイラの出力を確認するのがおそらく最善です。

コンパイラオプションを使用して、C++コンパイラのアセンブリ出力を調べることができます。たとえば、g ++の場合:

$ cat -n test.cc

 1  int a;
 2  
 3  void f() {
 4      a = a + 1;
 5  }

$ arm-elf-c ++-4.6 -O2 -c -g -Wa、-ahl = test.s test.cc

$少ない+/4:test.cc test.s

  [...]
   4:test.cc       ****         a = a + 1;
  16                            .loc 1 5 0
  17 0000 0C309FE5              ldr     r3, .L2
  18 0004 002093E5              ldr     r2, [r3, #0]
  19 0008 012082E2              add     r2, r2, #1
  20 000c 002083E5              str     r2, [r3, #0]
  [...]

(と呼ばれるのアドレスが17行目.L2でレジスタに移動され、18行目でaがメモリから取得され、19行目でインクリメントされ、最後に20行目で再びメインメモリに格納されていることがわかります。r3

于 2012-07-13T20:54:11.997 に答える
1

int a = 1 + 1;2で変数をロードするだけですa。しかし、実際には、変数のアドレスはメモリ内の実際のアドレスであるため、アドレスバスに送られるアドレスです。

aこれは、グローバルに宣言された場合にのみ当てはまることを付け加える必要があります。ローカル変数はスタック上に存在するため、アドレスは一時的なスタックの場所になります。

于 2012-07-13T18:36:28.970 に答える
1

コンパイラーは、変数の内容をレジスターに入れることによってコードを最適化する場合があります (レジスターは RAM よりも高速であるため) が、一般的に、変数はスタック上の RAM に格納され、RAM 内&variableの変数の (仮想) アドレスを提供します。(あなたが言及した「アドレスレジスタ」はこれとは無関係です - 「プロセッサレジスタのアドレス」を与えることは意味がありません.RAMバイトだけがアドレスを持っています。)

于 2012-07-13T18:36:03.363 に答える
1

データを処理するには、まずデータをレジスタにロードする必要があります。算術演算を行う場合、値をレジスタにロードすると、命令によって CPU が 1 つまたは複数のレジスタに演算を適用します。算術演算は通常、入力として 2 つのレジスタを使用し、値を 3 つ目のレジスタに格納します。CPU は、計算を実行して ALU をマーシャリングします。この値は、すぐにメモリに戻される場合がありますが、コンパイラの裁量でそうでない場合もあります。addressof 操作は、プログラムのメモリ内のレイアウトを認識しているが、プログラムは認識していないため、ほとんどの場合コンパイラによって処理されます。

于 2012-07-13T18:39:37.063 に答える