i8086汇编:CF vs OF和SF

时间:2015-05-24 16:15:34

标签: assembly flags

我查看了很多主题,但无法弄清楚我是否理解这些。

我将使用未签名/签名的符号。

所以,假设我们有一系列单字节数字,[0..255] / [0 ..- 1](2的补码),它是否正确:

    当打破127到128/127到-128的屏障(范围的中间)时设置
  • OF
  • CF如果设置为突破255到256 / -1到0障碍(范围的结束)
  • 因此,CF只是给定8的额外二进制数字(如果是256个数字范围) Together these flags make the whole range of ADD operation results, from -256 (-128+(-128)) to 510 (255+255), interpretable, instead of, for instance, just having 255+1=0? - 好吧,那不是真的。

UPD:例如,如何在C编程语言中保留符号?是否执行了一些额外的操作来分别存储标志信息?换句话说,为什么它没有做任何奇怪的事情,如下面用0x80 + 0x80?

所示

2 个答案:

答案 0 :(得分:0)

你是对的,但最后一件事并不是他们的目的。

让我们以Carry Flag为例,在32位机器上添加两个64位数字。

; adds EDX:ECX to EBX:EAX
add eax, ecx
adc ebx, edx

对于第二个双字,第一个操作的进位再次被馈送到加法器。这就像在纸上做的那样保持添加的溢出:3 + 9使2,你记得1为下一个数字。 sbb(借用减法)是带有进位加法的减法替代。

溢出标志告诉您添加的带符号数字已超过二进制补码边界,并且无法再依赖结果。

负标志与OF一起用于比较两个带符号的数字。

这里已经多次描述了所有标志及其用途。您可以查看this

答案 1 :(得分:0)

"随身携带" in carry flag具有与学习添加多位数字时相同的含义"携带一个"当添加数字的个别数字的结果为10或更高时。在8位加法的情况下,当操作导致"携带一个"时,设置进位标志。进入不存在的第九位结果。所以,是的,您可以使用进位标志将结果解释为9位值。

当将源操作数解释为有符号值时,当加法的结果不能表示为有符号值时,设置溢出标志。因此,对于8位有符号加法,这意味着结果超出了-128到127的范围。(在8位加法的情况下,溢出标志由XOR实现,从第8位到第9位进位从第七位到第八位的进位。)

然而对于有符号算术,它不是表示结果第九位的溢出标志本身。如果设置了溢出标志,那么进位标志将成为9位有符号值的符号位,否则它将成为第9位的符号标志。

例如,当您执行8位带符号计算-128 + -128(1000 0000b + 1000 0000b)时,结果为0且设置了进位和溢出标志。如果您假设进位标志是9位有符号值的第9位,则计算结果为-256(1 0000 0000b)。