众所周知,BEQ定义为以下几种:
if($x == $y) PC = PC + 4 + 4*(offset) else PC = PC+4
。
我们也知道使用2补偿方法的ALU减法。考虑到这一点:
BEQ是否可能导致溢出?
嗯,我说是的;我们举个例子:$x = 01...1$
和$y = 10...01
(十进制减1)。当然结果是无效的,并且有溢出。
我是对的,还是我在这个问题上缺少什么?
答案 0 :(得分:1)
没有BEQ 不能导致MIPS32 ISA溢出。
根据评论我假设您在MIPS32 ISA中讨论BEQ。查看MIPS32 Architecture For Programmers Volume II: The MIPS32 Instruction Set表明BEQ不会导致任何异常。
确实,通常通过从另一个值中减去一个值来实现比较,并且在MIPS实现中,可以使用相同的ALU来实现该指令。因此ALU将产生溢出信号(由高位的进位引起),但如果CPU正在执行BEQ指令,它将忽略溢出。然而,如果它正在执行SUB指令,那么它将触发异常。
有关替代示例,您可以查看SPARC V8。在SPARC V8中:
通常是整数算术指令 计算结果的三元寄存器地址指令 两个源操作数的功能,并将结果写入 目的地寄存器r [rd]或丢弃它。 。 。 大多数这些说明都有双版本;一个版本 将整数条件代码(icc)设置为副作用;另一个 版本不会影响条件代码。
在这两种情况下,CPU将使用相同的ALU来计算算术运算,如果发生溢出,则将设置来自ALU的指示此信号的信号。但如果指令未设置为更新条件代码,则CPU不会对该值执行任何操作。
MIPS32没有条件代码寄存器,但如果它在BEQ中使用相同的ALU操作进行比较,则适用相同的原则,对于SUB,它可以自由地忽略BEQ的溢出,但对于SUB溢出信号会触发异常。