我需要一种简洁的方法来表达x86溢出标志作为两个操作数的函数。我理解,当两个操作数具有相同的符号但结果具有不同的符号时,核心设置OF。
例如,
ADD SRC[31..0], DEST[31..0]
可以合理地表达为SRC和DEST位的“单线”布尔函数吗?
答案 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()
函数中的加法表达减法。这应该不难。
使用测试确保代码正常工作也是个好主意。您甚至可以为加法/减法编写一个小的汇编程序,它会返回溢出标志并用它来测试单行的正确性。