MIPS,ADDIU在PCSPIM中超出范围

时间:2016-06-24 02:37:47

标签: mips isa pcspim

我有以下指示,我不明白为什么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

应符合指令

1 个答案:

答案 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也很满意重写