如何检查两个带符号的32位整数是否会导致MIPS溢出?

时间:2017-03-08 16:18:59

标签: overflow mips bits low-level spim

我已经发现,对于两个无符号整数,我可以这样做:

sll $a0, $a0, 31                          #a0 is integer 1 to be added

sll $a1, $a1, 31 #a1 is integer 2

add $t0, $a0, $a1 #result in $t0

addi $t1, $0, 2

beq $v0, $t0, $t1

这样做是将两个整数的第32位移位到第一个位并加上它们。如果这两个数字都是1,那么$ t1中的答案将是2(01 + 01 = 10)。因此,发生了溢出。

但对于有符号整数,前导符号表示负整数。我已经排除了溢出的可能性,两个整数都是相反的符号,但假设它们是相同的符号。然后010 + 011(两个正整数)将给我101,但因为这是签名。这变成负整数。我只是检查号码是否有变化的迹象?对于两个负整数,我可以检查它是否是未签名的?

1 个答案:

答案 0 :(得分:0)

所以你在谈论签名溢出?如果进位与执行不匹配,那么它就是有符号的溢出。

abi or
000 00
001 01 signed overflow
010 01
011 10
100 01
101 10
110 10 signed overflow
111 11

a和b是操作数,i是进位,o是执行,r是结果。

注意a,b和r之间的关系吗?您只需查看两个操作数的msbits和结果即可确定有符号溢出。

这与mips完全无关,它是基本的二进制补码加法(和减法)。要将它应用于指令集,您需要隔离操作数的msbits以及它们是否与结果匹配。可以使用测试/并且可以使用,移位31位,假设它填充已知的东西(如零和不符号扩展,或者可能符号扩展帮助)。添加零检查z标志。 mips不使用标志,或者转移到隔离然后比较,如果相同或不是一个很好的通用解决方案。也可以测试进位输入和执行(然后两个操作数都加上0x7FFFFFFF,然后右移31,或者隔离进位输入和两个操作数msbits,然后加上这三个项目,看看进位是否相同或者不同,需要更多指示)。