0

我意识到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 获得溢出?你能给我很好的例子吗...我需要使用其他指令来填充高位吗?

谢谢你

4

1 回答 1

1

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

您不能在 MIPS 中的单个指令中加载大立即数。首先使用 LUI 指令加载高 16 位,然后再加载低 16 位的 ADDI(或 ORI,或 XORI)。

您还可以 LW 从内存中引入 32 位值。

于 2013-03-07T18:36:15.400 回答