标志寄存器FR(Flag Register)
8086有一个18位的标志寄存器FR,在FR中有意义的有9位,其中6位是状态位,3位是控制位。
按顺序是:CF PF AF ZF SF TF IF DF OF
OF(Overflow Flag): 溢出标志位OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被置为0。
DF(Direction Flag):方向标志DF位用来决定在串操作指令执行时有关指针寄存器发生调整的方向。控制每次操作后si,di的增减,0增1减
SF(Sign Flag):符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。
ZF(Zero Flag):零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。
PF(Parity Flag):奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。
CF(Carry Flag):进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。)
CF和OF的区别: CF对无符号数运算有意义,而OF对有符号数运算有意义。
AF:下列情况下,辅助进位标志AF的值被置为1,否则其值为0:
(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。
IF:中断允许标志IF位用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:
(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;
(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。
TF:跟踪标志TF。该标志可用于程序调试。TF标志没有专门的指令来设置或清楚。
(1)如果TF=1,则CPU处于单步执行指令的工作方式,此时每执行完一条指令,就显示CPU内各个寄存器的当前值及CPU将要执行的下一条指令。
(2)如果TF=0,则处于连续工作模式。
Debug中标志位的表示:
标志位 值为1 值为0
OF OV NV
SF NG PL
ZF ZR NZ
PF PE PO
CF CY NC
DF DN UP
提示:
adc (c - carry) 带进位加法指令。它利用了CF位上记录的进位值。
sbb (b - borrow) 带借位减法指令。它利用了CF位上记录的借位值。
cmp (compare) 比较指令。它的功能相当于减法指令,只是不保存结果。
je (e - equal) ZF=1则转移
jne (ne - not equal) ZF=0则转移
jb (b - below) CF=1则转移
jnb (nb - not below) CF=0则转移
ja (a - above) CF=0且ZF=0则转移
jna (na - not above) CF=1或ZF=1则转移
将cmp指令和je等条件转移指令配合使用,可以实现根据比较结果进行转移的功能。
movesb (b - byte) 传送一个字节。
movesw (w - word) 传送一个字。
rep movesb (rep - repeat) 循环执行字节串传送指令。
rep movesw (rep - repeat) 循环执行字串传送指令。
cld (clear DF) 将DF置0。
std (set DF) 将DF置1。
pushf (push flag) 将标志寄存器的值压栈。
popf (pop flag) 从栈中弹出数据送入标志寄存器。