设置溢出标志的说明

Boo*_*Boo 5 x86 assembly masm

在Kip Irvine的书中,他谈到了设置溢出标志的机制,他写道:

在加法或减法操作之后,CPU使用一种有趣的机制来确定Over fl ow fl ag的状态.Carry fl ag与结果的高位进行异或运算.结果值放在Over fl ow fl ag中.

我写了一个简单的程序,显示在al寄存器中添加5到127设置溢出标志:

0111 1111 + 0000 0101 = 1000 0100 carry flag = 0, high bit = 1, overflow = 1
Run Code Online (Sandbox Code Playgroud)

但是,在al寄存器中添加5到255不会设置溢出标志:

1111 1111 + 0000 0101 = 0000 0100 carry flag = 1, high bit = 0, overflow = 0
Run Code Online (Sandbox Code Playgroud)

为什么第二个例子中设置的溢出标志不是满足的条件语句ie; 进位标志= 1,高位= 0?

Wea*_*ane 7

在第二个示例中未设置溢出标志的原因255 + 5是因为它涉及有符号算术.你添加的-1 + 5是4.没有溢出:结果是正确的.正如@Jester评论的那样,你的书中一定有错误.

我的8086书中提到了溢出标志:

如果从第6位到第7位(符号位)有内部进位且没有外部进位,则将置位.当从第6位到第7位没有内部进位且存在外部进位时,它也将被置位.

编辑

该段继续:

对于具有技术意识的读卡器,溢出标志是通过对进位和进位7(符号位)进行异或来设置的.

在第二个例子中,执行1(到进位标志),并且因为所有位都被置位,所以在内部加法期间必须有内部进位,即使结果b7为0.