8

私はMIPS32ビットを学んでいます。Store Wordの場合、ALUに送信する前に(シングルサイクルデータパスで)16ビットオフセットを符号拡張するのはなぜですか?

4

6 に答える 6

12

今、お役に立てるかどうかはわかりませんが、とにかく投稿します。

非常に一般的な意味で、C ++の命令の配列、つまりA [0]、A [1]、A[2].....任意の2つの命令間の「比喩的な」距離は1UNITです。

これをMIPSに例えましょう。MIPSでは、比喩的にすべての命令は「1 UNIT」で区切られますが、MIPSでは1 UNIT=4バイトです。すべての命令は4バイトの長さであり、これが命令から命令に移動するときにPCが4、つまりPC+4だけインクリメントされる理由です。したがって、命令iと命令i + 2の間のギャップは「比喩的に」2ですが、実際には2 * 4 = 8、つまりPC + 4+4です。

分岐命令で指定されたオフセットに戻ると、オフセットは次の命令(分岐に続く命令)からの「比喩的な」距離を表します。したがって、「実際の」距離を取得するには、オフセットに4を掛けます。これが、オフセットを「LEFT」に2ビット「符号拡張」するように指示されている理由です。 nビットを使用すると、その値に2^nが乗算されます。この場合、2 ^ 2 = 4

したがって、分岐命令の実際のターゲットアドレスはPC + 4 + 4*Offsetです。

お役に立てれば。

于 2011-10-21T02:11:45.160 に答える
8

16ビットオフセットは符号付き2の補数であるように聞こえます。つまり、正または負のいずれかになります。

32ビットに変換する場合、符号情報を保持するために最上位ビットを上位16ビットにコピーする必要があります。

于 2011-09-18T14:12:43.073 に答える
0

私の知る限り、ロードまたはストア命令では、オフセット値が一時レジスタの値にtempとして追加されます。レジスタは32ビットで、16ビットと32ビットの加算演算はできません。値は符号拡張されます。

于 2013-10-27T06:19:58.527 に答える
0

ここであなたのコンセプトが少し間違っていると思います。

ALU内にあると思われる5ビットは、実際にはレジスタメモリ内に入り、32 [2^5]レジスタの1つを選択します。

各レジスタ自体は32ビットです。したがって、レジスタ値にオフセットを追加するには、32ビットに符号拡張する必要があります。

ALU演算は、MIPSのシングルサイクルデータパス内の同じサイズの2つのレジスタ間で常に行われます。

于 2014-03-08T15:28:28.447 に答える
0

32ビットマシンのハードウェアでは、ほとんどのALUは32ビット入力を受け取り、すべてのレジスタは32ビットレジスタです。

データを処理するには、32ビット幅である必要があります。これが、符号拡張の理由です。ただし、別のアプローチはゼロ拡張ですが、2の補数の符号を保持するために、イミディエートとオフセットを処理する場合はSIGN拡張が使用されます。補体。

于 2014-03-09T13:43:38.507 に答える
0

符号拡張は、たとえばM68xxxマシンの場合、アドレスレジスタをロードする場合にのみ発生します。データレジスタの場合はそうではありません。

例えば持っている

movea.w addr,a0
move    addr,d0
addr:
dc.w $FFFF

データレジスタのロードの場合は$0000FFFFになり、アドレスレジスタのロードの場合は$FFFFFFFFになります。

これを理解するには、符号付き負のプレゼンテーションの2の補数$ FFFFを作成し、数値を32ビットに拡張し、2の補数をやり直して、32ビットで対応する表現を見つけます。

よろしくお願いします、ステファンS。

于 2016-08-12T14:24:00.117 に答える