Assembly 为什么我必须检查签名操作的溢出标志,而不是8086中的进位标志?

Assembly 为什么我必须检查签名操作的溢出标志,而不是8086中的进位标志?,assembly,x86,x86-16,cpu-registers,integer-overflow,Assembly,X86,X86 16,Cpu Registers,Integer Overflow,我正在试图理解标志状态寄存器 我知道,如果算术运算从结果的最高有效位生成进位或借位,则会设置进位标志,但我也知道它仅在两个相加的数字为正数时才起作用 为什么签名操作不起作用?我的意思是,为什么我们必须检查溢出标志呢?进位标志是一个用于加法的“未签名”溢出。如果你想做有符号数学并且担心溢出,你需要使用“有符号溢出”,它的结果不同。二元加法对于无符号和二元补码是相同的。加法器中没有符号数学(也没有减法),但溢出的标志以不同的方式去除。无符号溢出只是msbit的进位,有符号溢出是msbit的进位和进位

我正在试图理解标志状态寄存器

我知道,如果算术运算从结果的最高有效位生成进位或借位,则会设置进位标志,但我也知道它仅在两个相加的数字为正数时才起作用

为什么签名操作不起作用?我的意思是,为什么我们必须检查溢出标志呢?

进位标志是一个用于加法的“未签名”溢出。如果你想做有符号数学并且担心溢出,你需要使用“有符号溢出”,它的结果不同。二元加法对于无符号和二元补码是相同的。加法器中没有符号数学(也没有减法),但溢出的标志以不同的方式去除。无符号溢出只是msbit的进位,有符号溢出是msbit的进位和进位的比较,如果它们匹配,则无符号溢出;如果它们不匹配,则无符号溢出

并非所有硬件都实现有符号溢出标志,您更有可能找到进位标志(无符号溢出)。减法简单地意味着对第二个操作数进行逆变,并对lsbit的进位进行逆变(逆变加1),这就是为什么我们有并关心两个补码的原因,它使硬件变得更容易。不同的处理器系列使用不同的减法实践。有时,如果操作是减法运算,则进位会反转,有时则不是,因此,带进位的加法与带借位的减法(如果您的指令集有一个)的lsbit进位的反转与否直接受此影响。不难理解处理器的功能,有些处理器不太清楚进位集或进位清除是否表明先前的减法运算有借用(无符号溢出)

并非所有硬件都有溢出位(或进位),因此有时必须通过检查操作数的msbits和结果来综合这些溢出位。或者使用其他方法。但这一切归结为两个补码和无符号,对于加法(和减法),它们的计算方式不同


对于乘法和除法,这不是有符号乘法器和无符号乘法器不同的情况,使用错误的乘法器可能会得到错误的答案,同样,如果这些乘法器有溢出标志,则需要将它们与运算进行比较。处理器数据手册应该告诉您这一点,否则您必须做一些简单的实验来找出它。

请参阅有符号溢出与无符号进位。另请参阅中的其他链接。如果有人对此感到困惑,8086(以及一般的x86 ISA)确实实现了CF和OF。一些非x86体系结构甚至根本没有“标志”:有一些有限的比较和分支指令,以及更灵活的比较指令,它们将结果放入整数寄存器(稍后可以进行分支)。MIPS中的进位检测将使用
进位=(a+b)
(无符号比较)和
SLTU
指令完成。