私は MIPS 命令を学んでいますが、即値を拡張する必要がある I タイプの命令をテストすると、次の結果について混乱します (それらはすべて MARS で実行されます)。
- ソース コード行 があるとします
ori $s1, $s2, 0xfd10
。MARS は基本的なアセンブラ命令ori $17, $18, 0x0000fd10
を提供します。これは、16 ビットの即値ori
をゼロ拡張する必要があるためです。機能を変更するだけori
でandi
、つまりソース コードの行andi $s1, $s2, 0xfd10
だけを変更すると、MARS はほぼ同じ基本的なアセンブラ命令andi $17, $18, 0x0000fd10
を提供します。ただし、 とは異なりori
、符号拡張andi
を使用する必要があります。したがって、基本的なアセンブラ命令は.andi $17, $18, 0xfffffd10
andi
また、ゼロ拡張を使用する必要があります。最初の質問は無視してください。
slti rt, rs, imm
たとえば、を使用しようとするとslti $s1, $s2, 0x8000
、MARS は行の実行を拒否し、エラー メッセージは"0x8000": operand is out of range
. 即時が範囲外である理由はわかりません。即時を少し下に変更すると、たとえば 、slti $s1, $s2, 0x7fff
機能し、即時が に拡張され0x00007fff
ます。私の期待は、0x8000
に拡張する必要があること0xffff8000
です。私の理解に何か問題がありますか?