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

时间:2014-01-22 00:28:15

标签: assembly x86 x86-16 cpu-registers integer-overflow

我正在尝试理解FLAGS状态寄存器。

我知道如果算术运算从结果的最高有效位生成进位或借位,则进位标志置位,但我也知道只有当两个数字相加时才有效。

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

1 个答案:

答案 0 :(得分:3)

进位标志是用于添加的“无符号”溢出。如果你想做有符号的数学并且担心溢出,你需要使用“有符号溢出”,这是不一样的结果。对于无符号和二进制补码,二进制加法是相同的,在加法器中没有带符号数学这样的东西(也没有减法这样的东西),但是标志是以不同的方式从溢出中取出的。无符号溢出只是执行msbit,有符号溢出是进位和进位msbit的比较,如果它们匹配则没有符号溢出,如果它们不匹配则签名溢出。

并非所有硬件都实现了有符号溢出标志,您更有可能找到进位标志(无符号溢出)。减法只是意味着反转第二个操作数并反转lsbit的进位(反转并加1),这就是为什么我们有并且关心二进制补码它使得硬件变得如此简单。不同的处理器系列使用不同的实践进行减法。如果操作是减法,有时不是反转,则执行是反转的,所以lsbit中的进位的反转与否与进位和借位的减去(如果你的指令集有一个)直接受此影响。有些处理器没有很好地证明你的处理器是做什么的,有些处理器没有完全记录进位设置或进位清除指示先前的减法是否有借位(无符号溢出)

并非所有硬件都有溢出位(或执行),因此有时您必须通过检查操作数的msbits和结果来合成这些。或者通过使用其他方法。但这一切都归结为二元补充与无符号相比,而对于加法(和减法),它们的计算方式不同。

对于乘法和除法,这不是有符号乘法器和无符号乘数不同的情况,使用错误的一个你可以得到错误的答案,同样如果那些有溢出标志,那么你需要将它们与操作进行比较。处理器数据手册应该告诉你这个,否则你必须做一些简单的实验才能搞清楚。