我有以下指示,我不明白为什么PCSPIM给了我以下警告:
spim:(parser) immediate value (61440) out of rainge (-32768..32767)
on line 88 of file
addiu $a, $zero, 0xF000
^
我根据ISA,我应该
Description: Adds a register and a sign-extended immediate value and
stores the result in a register
Operation: $t = $s + imm; advance_pc(4);
Syntax: addiu $t, $s, imm
Encoding: 0010 01ss ssst tttt iiii iiii iiii iiii
如果我将addiu $ a0,$ 0,0xF000转换为机器码,我会
opcode | rs | rt | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000
应符合指令
答案 0 :(得分:3)
我认为你的意思是这样的:
addiu $a0,$zero,0xF000
这是spim
的怪癖,因为不将此视为伪操作。但是,鉴于此,标记为正确。
无论您使用的是addi
还是addiu
,他们都具有相同的签名范围-32768 to 32767
。唯一的区别是指令是否会在整数溢出时生成异常。也就是说,两个指令都会对立即值进行符号扩展,不对addi
进行符号扩展,对addiu
进行零扩展。
您的值0xF000
是61440 [十进制],超出了指令的允许范围。在这两种情况下,您都会获得符号扩展值0xFFFFF000
spim
看到了0xF000
并认出您要添加0x0000F000
而不是 0xFFFFF000
但不会自动生成代码,因为它将addiu
视为低级文字指令。
另一方面,mars
将此视为伪操作并生成:
lui $at,0
ori $at,$at,0xF000
addu $a0,$zero,$at
它识别出您需要无符号操作,因此必须生成使用addu
生成真正无符号加法的指令
但是,如果您将原件重写为:
addu $a0,$zero,0xF000
现在,spim
将视为伪操作并生成:
ori $a0,$zero,-4096
而且,mars
也很满意重写