【问题标题】:MIPS, ADDIU out of range in PCSPIMPCSPIM 中的 MIPS、ADDIU 超出范围
【发布时间】:2016-06-24 02:37:46
【问题描述】:

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

应该符合说明

【问题讨论】:

    标签: mips instruction-set pcspim


    【解决方案1】:

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

        addiu    $a0,$zero,0xF000
    

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

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

    您的值 0xF000 是 61440 [十进制],超出了指令的允许范围。在这两种情况下,您都会得到一个 sign extended0xFFFFF000

    spim 看到 0xF000 并认识到您想添加 0x0000F000not 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 也对重写感到满意

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多