注:下面说到的标志寄存器都是缩写,C就是CF,其他也一样
标志寄存器:C、P、A、Z、S、T、D、O的内容只会是0或1,0表示假,1表示真
- O:溢出标志
一个寄存器如果存放的值超过所能表示的范围,就称为溢出,O溢出时被置为1,否则,O的值被清为0。
比如说EAX存放的最大值是11111111…(32个)转成16进制是7FFFFFFF,如果再加一就会溢出,我们用OD,修改当前的EAX值为7FFFFFFF,在执行add eax,1
就会溢出,观察O标志位。
执行,O标志位为1了,表示发生了溢出
- P:奇偶标志位,偶数为1,奇数为0,
一条指令的结果转为二进制,偶数个1,P=1,奇数个1,P=0.
当前EAX的值为0,0个1,所以P=1
我们让eax加1,十六进制的1转为二进制,1的个数为奇数,所以P=0
- Z:0标志,如果一条语句的计算结果是0,Z=1,不是0,Z=0
EAX修改成-1,再加1
我们可以看到,结果为0,Z=1
- S:符号标志位,如过指令运算结果是负数,S=1,反之,S=0
我们看到现在的EAX是-8,我们让EAX加1,结果是-7,S=1
- C:进位标志位,无符号运算的结果超过寄存器存放的最大值,C=1,没有超过,C=0
设置EAX为FFFFFFFF,此时为EAX存放的最大值,再让EAX加一,C=1
A、T、D基本用不到,A是辅助进位标志位,T是定时器溢出标志,D是方向标志位,就不详细介绍了