假设有一段代码:
mov al, 12
mov bl, 4
sub al, bl
在这种情况下,CF = 0 标志,但在我看来它应该等于 1,因为减法运算是在加法运算上实现的,并且处理器不知道我们将其作为输入提供什么,无论是有符号还是无符号数字,它只是完成它的工作。
也就是说,上面的代码相当于下面的代码:
在al寄存器中输入值12,即0000 1100
在bl寄存器中输入值4,即0000 0100
接下来是减法运算,因为第一个操作数是正数,所以没有转换为附加代码。由于第二个也是正数,所以也没有变换,但是由于执行了减法运算,所以第二个操作数被翻译成额外的代码,处理器执行加法运算(减法是通过加法实现的),即:
12: 0000 1100
-4: 1111 1100
12 - 4 = 12 + (-4) = 0000 1100 + 1111 1100 = 1 0000 1000
也就是说,我们得到了正确的结果 - 8,但如果调试它,CF = 0。这是为什么?超出位格的放在CF中,但CF=0。
阅读手册后,CF
标志表示无符号溢出。然而,这并不意味着额外的溢出。
您假设设置的位 8 指示溢出,但是,减法的情况相反。如果未设置,则表明借位发生在位向上。
如果我们更换4
with 16
,这样我们就会看到溢出:
00001100b - 00010000b = 00001100b + 11110000b = 11111100b = 252d
您可以看到,尽管发生了无符号溢出,但直到第 8 位都没有进位。 CF 标志不是进位加负数的结果。它只是表明减法溢出。在这种情况下,这意味着它与溢出位相反。
不同的体系结构对进位标志的处理方式不同。有些人用它来表示发生了借位,而另一些人则用它来表示要借用的位。他们经常有一个指令(sbb
在 x86 中),允许通过使用标志作为输入的一部分进行链接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)