什么条件设置溢出和进位标志?
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
为什么 CF
和 OF
设置为 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 — 如果整数结果是太大的正数或太小的负数(不包括符号位)以适应目标操作数;否则清除。此标志指示有符号整数(二进制补码)算术的溢出条件。
我一直在阅读和观看教程,但我只会越来越困惑,因为我的讲师没有对此进行详细介绍,或者她的解释很含糊。
(标志中的值仅由我们指定。)
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
为什么 CF
和 OF
设置为 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 — 如果整数结果是太大的正数或太小的负数(不包括符号位)以适应目标操作数;否则清除。此标志指示有符号整数(二进制补码)算术的溢出条件。