0

我有以下说明,但我不明白为什么 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, $zero, 0xF000 转换为机器代码,我将拥有

opcode | rs  | rt   | imm val
-------+-----+------+--------------------
0010 01|00 00|0 0100| 1111 0000 0000 0000

应该符合说明

4

1 回答 1

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

于 2016-06-24T04:20:22.390 回答