MIPS“addi”指令溢出 - 实例

时间:2013-03-07 18:22:23

标签: assembly mips inline-assembly bluespec

我意识到 addi 指令会导致溢出异常。我目前正在使用Bluespec HDL来模拟导致异常的处理器并适当地处理它们。

无论如何,我正在编写一些测试用例来触发溢出异常,特别是使用MIPS的addi命令。

注意:我正在测试的处理器是基于SMIPS的,但我支持一些MIPS指令,例如异常和中断。

我知道检测溢出的逻辑是正确的(下面的伪代码):

if (function == Addi) begin
  if(( a < 0 && b < 0 && result >= 0) || (a >0 && b > 0 && result < 0))
    return True;
  else 
   return False;
end

问题 :溢出的示例是什么:我正在尝试以下操作:(使用__asm__进行内联汇编)

 addi $2, $0, 0x7fff
 addi $3, $2, 0x000f

这不会引发异常。如果我试试这个:

 addi $2, $0, 0x7fffffff
 addi $3, $2, 0x0000000f

我收到汇编错误,因为立即数必须是16位。如何从andi获得溢出?你能举出好的例子......我是否需要使用其他指令来填补高位?

谢谢

1 个答案:

答案 0 :(得分:1)

您的第一个序列不会导致溢出异常,因为寄存器是32位的。 32767 + 15 = 32782,完全在32位之内。

您无法在MIPS中的单个指令中加载大量的immediates。首先使用LUI指令加载前16位,然后加载低16位的ADDI(或ORI或XORI)。

您也可以LW从内存中获取32位值。