如前所述,有符号整数溢出发生时,加数是相同的,当它们的和的符号不同时。
例子(与简洁的8位数字):
0x7F (+127) + 0x00 (+0) = 0x7F (+127)
0x7F (+127) + 0x01 (+1) = 0x80 (-128) overflow
0x80 (-128) + 0x7F (+127) = 0xFF (-1)
0x80 (-128) + 0xFF (-1) = 0x7F (+127) overflow
督察,
overflow = (sign1 is equal to sign2) AND (sign of sum is NOT equal to sign1)
可以使用XOR表达平等:
0 XOR 0 = 0 - equal
0 XOR 1 = 1 - not equal
1 XOR 0 = 1 - not equal
1 XOR 1 = 0 - equal
然后:
overflow = (NOT(sign1 XOR sign2)) AND (sign of sum XOR sign1)
你可以这部分代码是这样的:如果你想R10的31位扩展到寄存器的所有其他位(这样你会得到全零或全一,
addu $10,$8,$9 # bit 31 of r10 = sign of sum
xor $10,$10,$8 # bit 31 of r10 = sign of sum XOR sign1
xor $2,$8,$9 # bit 31 of r2 = sign1 XOR sign2
nor $2,$2,$2 # bit 31 of r2 = NOT(sign1 XOR sign2)
and $10,$10,$2 # bit 31 of r10 = (NOT(sign1 XOR sign2)) AND (sign of sum XOR sign1)
现在在R10),你可以使用算术右移指令:
sra $10,$10,31
谢谢,但我可以执行它,而无需使用标签(如BLZ $ T4,溢出),只是用简单的逻辑运算??? – XXXXX 2013-02-14 11:25:45