MIPS で 2 進数の MSB を 1 にするにはどうすればよいですか? マスキングでやろうとしたのですがエラーが出てしまうので、他に方法はありますか?
エラーが発生しているマスキングによってMSB = 1にするコード。
srl $s3,$s3,1
// error out of range
ori $s3,$s3,2147483648 # making MSB = 1
よろしく
MIPS で 2 進数の MSB を 1 にするにはどうすればよいですか? マスキングでやろうとしたのですがエラーが出てしまうので、他に方法はありますか?
エラーが発生しているマスキングによってMSB = 1にするコード。
srl $s3,$s3,1
// error out of range
ori $s3,$s3,2147483648 # making MSB = 1
よろしく
即値オペランドを持つ命令の MIPS オペコード形式では、即値定数に使用できるのは 16 ビットのみです。
これらの 16 ビットは通常、論理演算 (ここなど) の符号なし 16 ビット値 (つまり、0 ~ 65535、または 16 進数で 0x0000 ~ 0xFFFF ori
)、または符号付き 16 ビット値 (-32768 ~ 32767、算術演算の場合は 0xFFFF8000 ~ 0x00007FFF)。
したがって、ここでは 2147483648 (0x80000000) を即値として直接使用することはできません。したがって、「範囲外」エラーが発生します。
ただし、レジスタの上位lui
16 ビットに 16 ビットの即値をロードする (下位ビットを 0 に設定したままにする) 命令があります: (上位即値をロード)。
したがって、そのようなレジスタに 0x80000000 をロードしてからor
、値をロードできます。
lui $t0, 0x8000
or $t0, $t0, $s3