x86溢出标志的简洁表达式?

时间:2012-06-28 22:16:28

标签: x86 alu

我需要一种简洁的方法来表达x86溢出标志作为两个操作数的函数。我理解,当两个操作数具有相同的符号但结果具有不同的符号时,核心设置OF。

例如,

ADD SRC[31..0], DEST[31..0]

可以合理地表达为SRC和DEST位的“单线”布尔函数吗?

2 个答案:

答案 0 :(得分:2)

溢出标志是符号位的进位输出的xor 到符号位,可以表示为:

((SRC[31..0] + DEST[31..0]) shr 32) xor ((SRC[30..0] + DEST[30..0]) shr 31)

答案 1 :(得分:1)

这是如何表达有符号溢出标志值以添加两个带符号(2的补码)32位整数:

OV =(( SRC XOR DST )XOR 80000000H)和(( SRC + DST )XOR SRC )AND 80000000H)≠0

SRC DST 是整个32位整数值。

该表达式基本上比较了总和和加数的符号。

仅根据单个位表示溢出是不太实际的,因为您需要有效地复制完整的32位加法器。这不是一个很好的候选人。

如果你想要一个类似的减法表达式,尝试推导它或者只是按照this answer中的Sbb()函数中的加法表达减法。这应该不难。

使用测试确保代码正常工作也是个好主意。您甚至可以为加法/减法编写一个小的汇编程序,它会返回溢出标志并用它来测试单行的正确性。