我正在学习 MIPS 指令,当我测试需要签署扩展立即数的 I 型指令时,我对以下结果感到困惑(它们都在 MARS 中运行):
- 假设我们有源代码行
ori $s1, $s2, 0xfd10
,MARS 给出了基本的汇编指令ori $17, $18, 0x0000fd10
。这是期望,因为零ori
应该扩展16 位立即数。如果我们只将函数更改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
. 我的理解有什么问题吗?