第六节 2、标志寄存器

记住知识点:

1、各个标志寄存器的名称和对应的编号。
2、哪些是条件标志,哪些是控制标志(TID是控制标志,其他全是条件标志)。
3、不同标志寄存器的作用。
4、CF与OF的区别,如果做无符号数运算,关注CF标志位(CF标志位与无符号数运算有关);如果做有符号数运算,关注OF标志位(OF标志位与有符号数运算有关)。
5、使用标志位前,先要确认数据是有符号还是无符号,确认数据宽度。

——————

巧记方法:CF、PF、AF、ZF

C-P-A-Z——> 产品安装(0,2,4,6)

SF、TF、IF、DF、OF

stido——>对应stdio.h头文件,将di互换就是标志寄存器顺序(7,8,9,10,11)

0、CF进位标志:

用于反映运算是否产生进位或借位。如果运算结果最高位产生一个进位或借位,则CF置1,否则置0。运算结果的最高位包括双字操作的第32位字操作的第16位字节操作的第8位。移位指令也会将操作数的最高位或最低位移入CF。

如果eax:FFFF2222
add eax,10000执行后,进位---注:操作的是32位数据宽度,所以进位看第32位是否进位
add ax,0x1执行后,不会进位
add ax,0xDDDC执行后,进位---注:操作的是16位数据宽度,所以进位看第16位是否进位
add al,0xDC执行后,进位---注:操作的是8位数据宽度,所以进位看第8位是否进位

2、PF奇偶标志:

解释1:用于反映运算结果低8位中“1”的个数。“1”的个数为偶数,则PF置1,否则置0。

4、AF辅助进位标志:

算数操作结果的第三位(从0开始计数)如果产生了进位或者借位则将其置为1,否则置为0,常在BCD(binary-codedecimal)算术运算中被使用。


6、ZF零标志:

用于判断结果是否为0。运算结果0,ZF置1,否则置0。

案例对比:

XOR EAX,EAX 修改ZF零标志位的值。
MOV EAX,0 不修改ZF零标志位的值。

7、SF符号标志:

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。

该标志被设置为有符号整型的最高有效位
(0表示结果为正,1表示结果为负)
意思其实就是,运算完之后看下符号位 是0(正)还是1(负)
当然如果是无符号数运算就不用看了

11、OF溢出标志:

一、学习CF与OF,要始终牢记一点。CF是无符号数溢出标志OF是有符号数溢出标志
二、判断OF是否溢出定理:
正 + 正 = 正 ;如果结果是负数,则说明有溢出
负 + 负 = 负 ;如果结果是正数,则说明有溢出
正 + 负   ;永远不会溢出
三、快速判断CF标志位的值是1或者0
(方法1)
加数1加数2,和 结果数3的符号位即可。
1 1 0 或者 0 0 1发生溢出,OF = 1。

(方法2)
加数1 ⊕ 加数2 ⊕ 结果数3 ⊕ 最高进位数4