MIPS、ADDIU 在 PCSPIM 中超出范围

MIPS, ADDIU out of range in 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, $zero, 0xF000 转换成机器码,我会得到

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

哪个应该符合说明

我假设你的意思是这样的:

    addiu    $a0,$zero,0xF000

这是 spim 的怪癖,因为它 没有 将其视为伪操作。但是,鉴于此,正确 标记它。

无论您使用 addi 还是 addiu,它们 两者 具有相同的 signed 范围 -32768 to 32767。唯一的区别是指令是否会在整数溢出时产生异常。也就是说,两条指令都将对立即值进行符号扩展,notaddi 进行符号扩展,对 addiu.

进行零扩展

您的值 0xF000 是 61440 [十进制],超出了指令允许的范围。在这两种情况下,您都会得到 符号扩展 0xFFFFF000

spim 看到 0xF000 并认识到您想要添加 0x0000F000not 0xFFFFF000 但不会自动生成代码,因为它将 addiu 视为低级文字指令。

另一方面,mars 确实将其视为伪操作并生成:

    lui    $at,0
    ori    $at,$at,0xF000
    addu   $a0,$zero,$at

它识别出您需要 unsigned 运算,因此它必须使用 addu

生成产生真正无符号加法的指令

但是,如果您将原来的重写为:

    addu    $a0,$zero,0xF000

现在,spim 将其视为伪操作并生成:

    ori     $a0,$zero,-4096

而且,mars 对重写也很满意