我已经发现,对于两个无符号整数,我可以这样做:
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,但因为这是签名。这变成负整数。我只是检查号码是否有变化的迹象?对于两个负整数,我可以检查它是否是未签名的?
答案 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,然后加上这三个项目,看看进位是否相同或者不同,需要更多指示)。