我意识到 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获得溢出?你能举出好的例子......我是否需要使用其他指令来填补高位?
谢谢
答案 0 :(得分:1)
您的第一个序列不会导致溢出异常,因为寄存器是32位的。 32767 + 15 = 32782,完全在32位之内。
您无法在MIPS中的单个指令中加载大量的immediates。首先使用LUI指令加载前16位,然后加载低16位的ADDI(或ORI或XORI)。
您也可以LW从内存中获取32位值。