私はMIPS32ビットを学んでいます。Store Wordの場合、ALUに送信する前に(シングルサイクルデータパスで)16ビットオフセットを符号拡張するのはなぜですか?
6 に答える
今、お役に立てるかどうかはわかりませんが、とにかく投稿します。
非常に一般的な意味で、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です。
お役に立てれば。
16ビットオフセットは符号付き2の補数であるように聞こえます。つまり、正または負のいずれかになります。
32ビットに変換する場合、符号情報を保持するために最上位ビットを上位16ビットにコピーする必要があります。
私の知る限り、ロードまたはストア命令では、オフセット値が一時レジスタの値にtempとして追加されます。レジスタは32ビットで、16ビットと32ビットの加算演算はできません。値は符号拡張されます。
ここであなたのコンセプトが少し間違っていると思います。
ALU内にあると思われる5ビットは、実際にはレジスタメモリ内に入り、32 [2^5]レジスタの1つを選択します。
各レジスタ自体は32ビットです。したがって、レジスタ値にオフセットを追加するには、32ビットに符号拡張する必要があります。
ALU演算は、MIPSのシングルサイクルデータパス内の同じサイズの2つのレジスタ間で常に行われます。
32ビットマシンのハードウェアでは、ほとんどのALUは32ビット入力を受け取り、すべてのレジスタは32ビットレジスタです。
データを処理するには、32ビット幅である必要があります。これが、符号拡張の理由です。ただし、別のアプローチはゼロ拡張ですが、2の補数の符号を保持するために、イミディエートとオフセットを処理する場合はSIGN拡張が使用されます。補体。
符号拡張は、たとえばM68xxxマシンの場合、アドレスレジスタをロードする場合にのみ発生します。データレジスタの場合はそうではありません。
例えば持っている
movea.w addr,a0
move addr,d0
addr:
dc.w $FFFF
データレジスタのロードの場合は$0000FFFFになり、アドレスレジスタのロードの場合は$FFFFFFFFになります。
これを理解するには、符号付き負のプレゼンテーションの2の補数$ FFFFを作成し、数値を32ビットに拡張し、2の補数をやり直して、32ビットで対応する表現を見つけます。
よろしくお願いします、ステファンS。