2013-03-07 125 views
0

我意识到addi指令会导致溢出异常。我目前使用Bluespec HDL来模拟导致异常并适当处理它们的处理器。MIPS的“addi”指令溢出 - 示例

任何方式,我正在写一些测试用例来触发溢出异常,尤其是使用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

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

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

你也可以从内存中带入一个32位的值。

+0

我对装配不是很熟悉,请举个例子。谢谢 – 2013-03-07 18:37:08

+0

我不明白你如何使用HDL,模拟处理器,编写实现溢出检测的代码,但你无法理解汇编指令。 – NovaDenizen 2013-03-07 18:40:19

+0

恩。我是测试处理器体系结构项目的一部分。 Bluespec的思维水平非常高,您只需定义规则即可管理处理器而无需了解组件细节。不要问我以前的问题,我明白你的意思。 – 2013-03-07 18:47:24