10

MIPSを勉強している間、私はこの部分について混乱しました。

ジョン・L・ヘネシー教授が書いた教科書には、大きな定数をロードする場合は、

lui $s0, upper(big)
ori $s0, $s0, lower(big)

しかし、なぜ私たちはただやらないのですか

addi $s0, $zero, big

レジスタは32ビットなので、これはもっと簡単ですね。

4

4 に答える 4

10

渡される直接引数addiはわずか16ビットです。16ビット値の範囲外にある32ビットの即値をロードするには、教科書の例のように、2回に分けてロードする必要があります。

(さらなる質問を予想して、32ビットの即時値をとる即時ロードまたは即時命令の追加がない理由は、MIPS ISAが固定サイズの32ビット命令を使用するため、命令引数に常に<32ビットが使用可能であるためです。 -これはRISCアーキテクチャでは非常に一般的です。)

于 2012-10-31T15:06:35.423 に答える
6

はい、レジスタは32ビットですが、32ビットの命令で32ビットの数値を指定するにはどうすればよいですか?命令は、オペコードとデータで構成されます。したがって、単一のaddiでオペコード+32ビットデータを圧縮することはできません。

于 2012-10-31T15:07:48.797 に答える
1

または、 .data.textを使用します

.data
   word32bits: .word 0xFFFFFFFF

.text
   lw $t0, word32bits # $t0 now contains your 32 bit word.
于 2018-03-29T02:39:52.187 に答える
0

多数の定数をロードする必要がある場合は、リテラルプールを使用できます。その場合、各定負荷は1つの負荷命令のみを消費します。ここここの詳細情報

于 2013-08-01T13:52:33.377 に答える