标志寄存器

查看 DTDEBUGEFLAGS中的的值,然后转换成二进制的形式,并取出CF / PF / AF / ZF / SF / OF 的值

1.进位标志CF

进位标志CF(Carry Flag):如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0

# 最高位没有进位
MOV AL,0xEF 
ADD AL,2

# 最高位进位
MOV AL,0xFE  
ADD AL,2 

# 最高位借位
MOV EAX,0x00000001
SUB EAX,0x10000010

2.奇偶标志PF

奇偶标志PF(Parity Flag):奇偶标志PF用于反映运算结果中最后一个字节“1”的个数的奇偶性。 如果“1”的个数为偶数,则PF的值为1,否则其值为0

mov al,3  初始值为3
add al,3  加3变为6(0110),1的个数为偶,PF=1
add al,2  加2变为8(1000),1的个数为奇。PF=0

3.辅助进位标志AF

辅助进位标志AF(Auxiliary Carry Flag): 在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;

(2)、在字节操作时,发生低4位向高4位进位或借位时。

MOV EAX, 0x55EEFFFF
ADD EAX, 2

MOV AX, 5EFE
ADD AX, 2 

MOV AL, 4E
ADD AL, 2

4.零标志ZF

零标志ZF(Zero Flag):零标志ZF用来反映运算结果是否为0

如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

xor eax,eax

mov eax,2
sub eax,2

5.符号标志SF(Sign Flag)

符号标志SF(Sign Flag):符号标志S用来反映运算结果的符号位,它与运算结果的最高位相同。

MOV AL,7F 
ADD AL,2

5.溢出标志OF

溢出标志OF(Overflow Flag):溢出标志OF用于反映有符号数加减运算所得结果是否溢出。

如果运算结果超过当前运算位数所能表示的范围则称为溢出,OF的值被置为1,否则,OF的值被清为0

最高位进位与溢出的区别:

进位标志表示无符号数运算结果是否超出范围

溢出标志表示有符号数运算结果是否超出范围

溢出主要是给有符号运算使用的

在有符号的运算中

正 + 正 = 正 如果结果是负数,则说明有溢出

负 + 负 = 负 如果结果是正数,则说明有溢出

正+负永远都不会有溢出

1、无符号、有符号都不溢出 
MOV AL, 8 
ADD AL, 8 

2、无符号溢出、有符号不溢出 
MOV AL, 0FF 
ADD AL, 2 

3、无符号不溢出、有符号溢出 
MOV AL, 7F 
ADD AL, 2 

4、无符号、有符号都溢出 
MOV AL, 0FE 
ADD AL, 80

计算机如何判断溢出

比如80-40
mov al,80
sub al,40

相当于
mov al,80
add al,0C0

1000 0000
1100 0000
----------

符号位有进位:1
最高有效数值位向符号位进位:0
1 eor 0 = 1
OF = 1

hhhhh