本节内容:8086 CPU内的标志寄存器FLAG为16位寄存器。本节我们将讲述FLAG寄存器各个标志位的使用方法。
■标志寄存器的标志位:标志位可以分为6个状态标志位和3个控制标志位,此外还有7个保留的标志位。状态标志位用来记录算术逻辑运算的结果。控制标志位用来控制计算机的运行。
■标志位的分类:6个状态标志位分别为CF、PF、AF、ZF、SF、OF标志位。3个控制标志位分别为DF、IF、TF标志位。初始状态IF中断标志置1,表示开中断,其余标志位均清零。
6.4.1 标志寄存器的标志位
表6-9列出了8086 CPU内的FLAG标志寄存器的所有标志位。FLAG共有16个标志位,其中包含6个状态标志位、3个控制标志位,第1位、第3位、第5位和第12位至第15位未使用。状态标志位用于记录算术逻辑运算的结果。控制标志位用于控制其计算机的运行。
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OF | DF | IF | TF | SF | ZF | AF | PF | CF |
表6-9 FLAG寄存器的标志位
我们在第五章16位汇编学习环境中学习了Debug调试器内的使用方法。Debug调试器的“r”命令可以显示8086CPU所有寄存器的值,其中FLAG寄存器以标志位的形式显示,如图6-15所示。
图6-15 Debug调试器显示寄存器的值
提示
Debug调试器中,缺省了TF标志位的显示。TF标志位默认置0,Debug调试器单步执行时,TF位置1。
Debug调试器中,FLAG寄存器的标志位使用字母符号表示当前标志位置0或者置1。字母符号含义可以参考表6-1。
6.4.2 标志位的分类
8086CPU的FLAG标志寄存器的标志位可以分为状态标志位和控制标志位两类。下面我们来看这两类标志位的具体含义。
■状态标志位
●进位标志CF
CF标志位用于记录无符号整数算术逻辑运算是否产生进位或借位。如果运算结果的最高位(字操作时的第15位或字节操作时的第7位)产生一个进位或借位,则CF置1,否则CF清零。在进行多字节加减运算时,要使用到该标志;比较无符号数的大小时,也要使用到该标志。
动手实验11:测试CF标志位
如图6-16所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察CF位的变化。
mov al,98h
add al,al ;结果al+al结果保存在al中,al=30H,产生进位1丢弃,CF位置1。
图6-16 测试CF标志位
●零标志ZF
零标志位用于记录算术逻辑运算结果是否为0。如果运算结果为0,ZF置1,否则ZF被清零。常用于判断两个操作数是否相等,或者运算结果是否为0。
动手实验12:测试ZF标志位
如图6-17所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察ZF位的变化。
mov ax,1
sub ax,1 ; 结果ax-1=0,ZF位置1
图6-17 测试ZF标志位
●符号标志SF
符号标志位SF用于记录算术逻辑运算结果的符号位。SF与运算结果的最高位相同,如果运算结果的最高位为1,则SF被置1,否则SF清零。由于在8086/8088系统中,有符号数采用补码的形式表示,所以SF反映了运算结果的符号。如果运算结果为正数,则SF被清零;如果运算结果为负数,否则SF被置1。
动手实验13:测试SF标志位
如图6-18所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察SF位的变化。
mov al,10000001B;16进制数81H
add al,1 ;结果al+1=82H,最高位为1,SF位置1
图6-18 测试SF标志位
●溢出标志OF
溢出标志OF用于记录有符号算术逻辑运算是否引起溢出。如果运算结果超过了8位或16位有符号数的表示范围,即在字节运算时大于127或小于-128,在字运算时大于32767或小于-32768时,称为溢出。如果溢出,则OF被置1,否则OF被清零。通常用于判断有符号数运算结果的正确性。即如果有符号整数运算结果不合理,则OF位置1,否则OF位清零。
正数+正数=负数,不合理,OF位置1;
负数+负数=正数,不合理,OF位置1;
动手实验14:测试OF标志位
如图6-19所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察OF位和CF位。
mov al,98H
add al,99H ;结果al=98H+99H=31H,最高位1溢出,OF位置1,CF位也置1
图6-19 测试OF标志位
思考
为何CF位和OF位会同时被置1?请举例说明。
谨慎
要特别注意,CF位和OF位是两个不同性质的标志,不能混淆。
进位标志CF位用于记录无符号整数算术逻辑运算结果;
溢出标志OF位用于记录有符号整数的算术逻辑运算结果;
●奇偶标志PF
奇偶标志PF用于反映运算结果中“1”的个数。如果“1”的个数为偶数,则PF被置1,否则PF被清零。利用PF可以进行奇偶校验检查,或产生奇偶校验位。在串行通信中,为了提高传送的可靠性,常采用奇偶校验。
动手实验15:测试PF标志位
如图6-20所示,在Debug调试器中输入命令a,输入下面两条语句,并单步执行,注意观察PF位的变化。
mov al,1
add al,10h ;al=1+10h=11h,PF为置1
图6-20 测试PF标志位
注意
奇偶标志判断的是运算结果中 “1”的个数,而不是对奇数或者偶数的判断。
●辅助进位标志AF
在字节操作时,如果发生低半字节向高半字节进位或借位;在字操作时,如发生低字节向高字节进位或借位,则辅助进位标志AF被置1,否则AF被清零。十进制算术运算调整指令自动根据该标志产生相应的调整动作。我们将在第十八章十进制算术调整指令学习十进制算术调整指令。
动手实验16:测试AF标志位
如图6-21所示,在Debug调试器中输入命令a,输入下面三条语句,并单步执行,注意观察AF位的变化。
mov al,34h
add al,47h ;34h+47h=7Bh
daa ;将7Bh调整为十进制数BCD码81h,AF位置1
图6-21 测试AF标志位
我们将在第十八章十进制算术调整指令中详细讲解AF位的使用。
■控制标志位
●方向标志DF
方向标志DF决定字符串操作指令执行时有关指针寄存器调整方向。当DF=1时,字符串操作按减方式改变有关存储器指针值;当DF=0时,串操作按加方式改变有关存储器指针值。8086/8088提供专门用于设置方向标志DF的指令是STD,专门用于清DF的指令CLD。
举例
1.源地址DS:[SI]指向源字符串“0123456789”中的字符’0’。
将源地址处的字符串正序复制到目的地址ES:[DI]处。
cld ;DF位清零
MOVSB ;以字节为单位,循环复制10次
复制后,目的地址ES:[DI]处保存的字符串为“0123456789”。
2.源地址DS:[SI]指向源字符串“0123456789”中的字符’9’。
将源地址处的字符串倒序复制到目的地址ES:[DI]处。
std ;DF位置1
MOVSB ;以字节为单位,循环复制10次
复制后,目的地址ES:[DI]处保存的字符串为“9876543210”。
●中断允许标志IF
中断允许标志决定CPU是否响应外部可屏蔽中断请求。
当IF置1时,CPU能够响应外部的可屏蔽中断请求,例如响应键盘、打印机中断请求;
当IF置0时,则不响应外部可屏蔽中断请求,此时按下键盘按键时不会得到响应。但此标志的状态对于外部非屏蔽中断请求,或内部产生的中断不起作用。我们将在第十六章输入和输出中断中详细学习中断请求。
8086/8088提供的专门用于设置中断允许标志IF的指令是STI,专门用于清IF的指令是CLI。
cli ;IF位清零
sti ;IF位置1
●单步追踪标志TF
当单步追踪标志TF被置1后,CPU进入单步方式。所谓单步方式指在一条指令执行后,产生一个单步中断,这主要用于程序的调试。8086CPU没有专门设置和清除TF标志的指令,要通过其他方法设置或清除TF。我们将在第八章8086指令系统学习设置或清除TF位的方法。
练习
1、请写出下面每条指令执行后,ZF、PF、SF等标志位的值。
sub bl,bl ZF= ? PF=? SF=?
mov al,2 ZF= ? PF=? SF=?
push ax ZF= ? PF=? SF=?
pop bx ZF= ? PF=? SF=?
add al,ah ZF= ? PF=? SF=?
add al,8 ZF= ? PF=? SF=?
mul bl ZF= ? PF=? SF=?
2、请写出下面每条指令执行后,ZF、PF、SF、CF、OF等标志位的值。
CF OF SF ZF PF
sub al,al 0 0 0 1 1
mov al,12h ?
add al,99h ?
mov al,81h ?
add al,80h ?
mov al,0ffh ?
add al,05h ?
mov al,7fh ?
add al,1bh ?
3、请说明CF标志位和OF标志位的区别。
4、8086标志寄存器中定义了哪些标志?这些标志可分为哪两类?如何改变这些标志的状态?
5、请写出如下程序片段中每条算术运算指令执行后标志CF、ZF、SF、OF、PF、AF的状态。
mov al,89h
add al,al
add al,9dh
cmp al,0bch
sub al,al
dec al
inc al
自己动手网上查资料,或者利用debug工具得出结果;
6、请写出如下程序片段中每条逻辑运算指令执行后标志ZF、SF、PF的状态:
mov al,45h
and al,0fh
or al,0c3h
xor al,al
7、请写出如下程序片段中每条移位指令执行后标志CF、ZF、SF、PF的状态:
mov al,86h
sar al,1
shr al,1
ror al,1
rcl al,1
shl al,1
rol al,1
本文摘自编程达人系列教材《X86汇编语言基础教程》。资料下载www.bcdaren.com