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

x86溢出标志的简明表达式?,x86,alu,X86,Alu,我需要一种简洁的方法将x86溢出标志表示为两个操作数的函数。我理解,当两个操作数都有相同的符号,但结果有不同的符号时,的核心集 比如说, ADD SRC[31..0], DEST[31..0] 添加SRC[31..0],DEST[31..0] 可以合理地表示为SRC和DEST位的“一行”布尔函数吗?由于溢出标志是符号位的进位与符号位的进位的异或,因此可以表示为: ((SRC[31..0] + DEST[31..0]) shr 32) xor ((SRC[30..0] + DEST[30..0])

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

比如说,

ADD SRC[31..0], DEST[31..0] 添加SRC[31..0],DEST[31..0]
可以合理地表示为SRC和DEST位的“一行”布尔函数吗?

由于溢出标志是符号位的进位与符号位的进位的异或,因此可以表示为:

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

由于溢出标志是符号位的进位与符号位的进位的异或,它可以表示为:

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

这是表示两个有符号(2的补码)32位整数相加的有符号溢出标志值的方式:

OV=((SRCXORDST)XOR 8000000小时)和(SRC+DST)XORSRC)和8000000小时)≠ 0

SRCDST是整个32位整数值

这个表达式本质上比较了和和和和的符号

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

如果您想要一个类似的减法表达式,请尝试推导它,或者仅根据中的
Sbb()
函数中的加法来表示减法。这应该不难


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

这就是如何表示两个有符号(2的补码)32位整数相加的有符号溢出标志值:

OV=((SRCXORDST)XOR 8000000小时)和(SRC+DST)XORSRC)和8000000小时)≠ 0

SRCDST是整个32位整数值

这个表达式本质上比较了和和和和的符号

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

如果您想要一个类似的减法表达式,请尝试推导它,或者仅根据中的
Sbb()
函数中的加法来表示减法。这应该不难


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

前面回答过,您可能也感兴趣。前面回答过,您可能也感兴趣。也许我不应该对这个答案投赞成票,因为文本是正确的,但代码并非如此。您无法仅从一对独立位的和(或逻辑AND)确定进位。这样你就失去了随身携带的东西。正确的实现是。@Alexey Frunze是的,我意识到我的表达式没有考虑低位。我将修改我的答案。我认为同一表达式的布尔表示太长,没有任何用处。没错,如果用单个位来表示,它将太长。顺便说一句,你的纠正仍然不能解决问题。@Alexey Frunze我的换档量搞错了,但我不知道现在有什么问题。我们将对此进行一些实验。我不完全理解你的公式,但它看起来可能是只分布在xor而不是add上的同一表达式。也许我不应该对这个答案进行投票,因为文本是正确的,但代码不是。您无法仅从一对独立位的和(或逻辑AND)确定进位。这样你就失去了随身携带的东西。正确的实现是。@Alexey Frunze是的,我意识到我的表达式没有考虑低位。我将修改我的答案。我认为同一表达式的布尔表示太长,没有任何用处。没错,如果用单个位来表示,它将太长。顺便说一句,你的纠正仍然不能解决问题。@Alexey Frunze我的换档量搞错了,但我不知道现在有什么问题。我们将对此进行一些实验。我不完全理解你的公式,但看起来它可能是只分布在xor而不是add上的同一个表达式。