2017-03-14 8 views
0

私は見てきたいくつかの情報によれば、マシン命令は32ビットであり、即値はマシン命令に格納されているため、32ビットの即値を32ビットのミップで使用することはできません。私が知る限り、即座にできる最大のものは16ビットであり、残りの命令のための余裕を残しています。しかし、MARS 4.5 MIPSで、この命令は、(デフォルトの設定を使用して)正常に動作します:MARSが32ビット即時に可能なのはなぜですか?

.text 
ori $t1, $0, 0xffffffff #load 32-bit pattern into $t1 

これは、組み立てと正常に動作、私が思うように私をバッフルそれべきではありません以上の理由(どのようにすることができ、32ビットマシンコードについて32ビットのイミディエイトを保持しますか?)。 MARSのoriは、即時フィールドが0xffffより大きい場合は疑似命令を実行しますが、luiとoriは定期的にロードされますが、わかりません。誰かがこれにいくつかの光を当てることができますか?

+0

バイナリを逆アセンブルして自分で確認します。確かにそれは動作しません。 'addi'のようないくつかの命令は即値を拡張するので、' addi $ t1、$ 0、0xffffffff'は動作します。ちなみに、これはアセンブラがここで 'ori'の代わりに使用できる命令です。 – Jester

答えて

0

あなたは火星4.5でその命令を組み立てるときに気付いた場合、あなたはまだ少し紛らわしいですが、基本的にそれはあなたのためにそれを修正した3つの命令

lui $1,0xFFFFFFFF 
ori $1,$1,0x0000FFFF 
or $9,$0,$1 

を取得します。

+0

これをさらに強調するために、あなたのori命令の前後にnopを入れてから組み立てて、それが何を生成するかを見てください。 –

関連する問題