MIPSを勉強している間、私はこの部分について混乱しました。
ジョン・L・ヘネシー教授が書いた教科書には、大きな定数をロードする場合は、
lui $s0, upper(big)
ori $s0, $s0, lower(big)
しかし、なぜ私たちはただやらないのですか
addi $s0, $zero, big
レジスタは32ビットなので、これはもっと簡単ですね。
MIPSを勉強している間、私はこの部分について混乱しました。
ジョン・L・ヘネシー教授が書いた教科書には、大きな定数をロードする場合は、
lui $s0, upper(big)
ori $s0, $s0, lower(big)
しかし、なぜ私たちはただやらないのですか
addi $s0, $zero, big
レジスタは32ビットなので、これはもっと簡単ですね。
渡される直接引数addi
はわずか16ビットです。16ビット値の範囲外にある32ビットの即値をロードするには、教科書の例のように、2回に分けてロードする必要があります。
(さらなる質問を予想して、32ビットの即時値をとる即時ロードまたは即時命令の追加がない理由は、MIPS ISAが固定サイズの32ビット命令を使用するため、命令引数に常に<32ビットが使用可能であるためです。 -これはRISCアーキテクチャでは非常に一般的です。)
はい、レジスタは32ビットですが、32ビットの命令で32ビットの数値を指定するにはどうすればよいですか?命令は、オペコードとデータで構成されます。したがって、単一のaddiでオペコード+32ビットデータを圧縮することはできません。
または、 .dataと.textを使用します
.data
word32bits: .word 0xFFFFFFFF
.text
lw $t0, word32bits # $t0 now contains your 32 bit word.