3

SPARC CPU (および MIPS) で %r0 を読み取ると、常に 0 が返されることは知っていますが、理由を知りたいです。

この背後にある設計上の決定とその理由は何ですか?

4

2 に答える 2

5

それはちょうどCPUが設計された方法です。を常にゼロに設定することr0は、非常に一般的な値に対するコストのかかる可能性のあるメモリ アクセスを回避する方法の 1 つです。

一方 (読み取り) では、ゼロの値を格納するためのレジスタを確保しておくと、それを使用できるようになると便利です。そうしないと、自分でゼロをレジスタにロードする必要があります。

多くの RISC プロセッサは、レジスタでのデータ操作を好む傾向があり、メモリにアクセスするのはロードおよびストア操作のみです。これは RISC の厳格なルールではなく、むしろ傾向です。常にゼロを使用できるようにレジスターを取っておくと便利です。汎用値に使用するレジスターが 1 つ少なくなるため、これはトレードオフですが、MIPS 設計者は明らかにそれが価値があると考えていました。

一方 (書き込み)r0は値 0 に関連付けられているため、そこに必要なものを入れることができ、違いはありません - 値は 0 のままです。つまり、値を捨てたい場合は、それをターゲットとして使用できます。

繰り返しますが、これは RISC の背後にある哲学と関係があります。RMIPSやフォーマット (レジスタ、即時、ジャンプ)などの非常に少数の命令フォーマットを優先する傾向がIあります。J例として、結果を保存するかどうかに応じて複数の命令形式を使用するのではなく、常に結果を保存する 1 つのセットを作成し、r0気にしない場合はそれを保存するだけで済みます。

したがって、2 つのレジスタを追加するとオーバーフローが発生するかどうかを確認したいが、結果をどこにも保存したくない場合は、次のように使用できます。

add $0, $7, $8  ; r0 <- r7 + r8, but r0 remains at 0.

MIPS のドキュメント ではMIPS32 Architecture for Programmers Volume I: Introduction to the MIPS32 Architecture、上記のことが確認されています。

R0 は値 0 に固定されており、結果を破棄する命令のターゲット レジスタとして使用できます。ゼロ値が必要な場合、R0 をソースとして使用することもできます。

于 2013-10-02T06:13:53.500 に答える
1

命令セット設計の観点からの主な理由は、レジスタの存在により、/dev/nullそうでなければ2つ(またはそれ以上)の異なる命令を1つの命令に「凝縮」できるからです。いくつかの例:

  • functioncallreturnは、リンク レジスタを使用して、1 つの命令で実行できます。
    • 関数呼び出し命令として: jmp <tgtreg>,<pc>,<linkreg>
      (SPARCjmpはアトミックですmov <pc>,<linkreg>; mov <tgtreg>,<pc>)、および
    • 関数の戻り命令として:jmp <linkreg>,<nullreg>,<nullreg>
  • cmpまたはtst単純にすることができますsub <a>,<b>,<nullreg>

これらの完全な表は、Oracle のドキュメント、 SPARC 合成命令およびsparcv9 合成命令から見つけることができます。これらのほとんどは%g0どこかに関係しています。

于 2013-10-02T16:28:51.387 に答える