什么条件设置溢出和进位标志?

what conditions set the overflow and carry flags?

我一直在阅读和观看教程,但我只会越来越困惑,因为我的讲师没有对此进行详细介绍,或者她的解释很含糊。

(标志中的值仅由我们指定。)

Example 1:


  1010 1010 0100 0101
- 0100 0110 0111 1000
  ___________________
  0110 0011 1100 1101

SF = 0
ZF = 0
PF = 0
CF = 1
OF = 1
AF = 1

为什么 CFOF 设置为 1?据我了解,AF 是在 执行 借入 时设置的它,意味着它是需要借钱的人。我说得对吗?

Example 2:

  0110 0111 1011 0100
+ 1111 1010 1100 1110
_____________________
1 0110 0010 1000 0010

SF = 0
ZF = 0
PF = 0 
CF = 1 
OF = 1 
AF = 1

在这里,设置 AF 是因为......?我以为AF只有在有进位(或者需要借位的时候)才设置? 此外,据我所知,对于 CF,如果 MSB 有一个进位,则不能设置它,也有一个进位。它像 XOR 一样工作,只有一个条件可以为真。

这让我困惑了好几天。是的,我仍然对这些标志的工作方式的差异感到困惑,这取决于数字是有符号的还是无符号的,因为我的老师从未向我们提到过这一点。

示例 1:

mov     ax, 1010101001000101b
mov     bx, 0100011001111000b
sub     ax, bx
  • CF = 0: CF 未设置,因为没有从最高有效位(第 15 位)借位到下一个更高位(第 16 位)。
  • OF = 1: OF 用于 2k 数。当您将示例 1 中的 2 个数字解释为 2k 个数字时,第一个数字是负数,第二个数字是正数。从一个负数中减去一个正数就像加上 2 个负数。结果应该是负数,但它不是 => OF 已设置。
  • AF = 1: 你有一个从最低半字节(最低4位)到下一个半字节(从第3位到第4位)的借位,当您将最低有效位称为第 0 位时)

       0101
     - 1000 
     ______
      11101
    

示例 2:

mov     ax, 0110011110110100b   
mov     bx, 1111101011001110b   
add     ax, bx
  • CF = 1 CF 被设置,因为你添加两个 16 位数字,结果对于 16 位来说太大了。它是 17 位长(寄存器的大小为 8、16、32、64 位)。
  • OF = 0 OF没有设置,因为你加了正负2k数。因此,您的结果自动位于这 2 个数字之间,这样它就不会太大或太负 2k 数字 -> 不可能溢出。
  • PF = 1最低有效字节有偶数个1(有两个1)。
  • AF = 1你从第3位到第4位有一个进位:

      0100
    + 1110
    ______
     10010
    

这里是intel手册中的解释:

EFLAGS 寄存器的状态标志(位 0、2、4、6、7 和 11)指示算术指令的结果, 例如 ADD、SUB、MUL 和 DIV 指令。状态标志函数是:
CF(位 0)进位标志 — 如果算术运算从结果的最高位产生进位或借位,则设置;否则清除。此标志指示无符号整数算术的溢出条件。它也用于多精度算术。
PF(位 2)奇偶校验标志 — 如果结果的最低有效字节包含偶数个 1 位,则设置;否则清除。
AF(第 4 位)调整标志 — 如果算术运算从结果的第 3 位产生进位或借位,则置位;否则清除。此标志用于二进制编码的十进制 (BCD) 算术。
ZF(位 6)零标志 — 如果结果为零则置位;否则清除。
SF(位 7)符号标志 — 设置为等于结果的最高有效位,即有符号整数的符号位。 (0 表示正值,1 表示负值。)
OF (bit 11) Overflow flag — 如果整数结果是太大的正数或太小的负数(不包括符号位)以适应目标操作数;否则清除。此标志指示有符号整数(二进制补码)算术的溢出条件。