8086标志寄存器描述:
8086标志寄存器(flag)有16位,其中存储的信息称为程序状态字(PSW),flag是按位起作用的,也就是说它的每一位都有专门的含义,记录特定的信息,0-15都意义
flag的1,3,512,13,14,15在8086CPU 没有使用,不具有任何含义,而 0,2,4,6,7,8,9,,10,11都有特殊含义
8086CPUflag寄存器的结构位如下图:
1 ZF标志位:
ZF 是flag的第6位,零标志位,它记录相关指令执行后,结果是否为0,如果为0,ZF=1,结果不为0,ZF=0,
注意:在8086cpu指令集中,有的指令执行时影响flag的,比如:add,sub,mul,div,inc,or,and等,它们大都是运算指令(进行逻辑运算或算术运算),有道指令执行对flag无影响
比如:mov,push,pop等,它们都是传送指令,所以,在使用一条指令时,注意这条指令执行结果对哪些flag造成影响
2 PF标志位
PF是flag的第2位,奇偶标志位,它记录指令执行后,结果的二进制数是否为偶数,为偶数,PF=1,奇数PF=0
例子:mov al, 1
add al ,10
结果为00001011,二进制数有3个,奇数,PF=0
3 SF标志位
SF是flag的第7位,符号标志位,它记录指令执行后,结果是否为负数,为负数SF=1,不是负数SF=0,CPU可以当成有符号和无符号数两种方式运算,结果看SF标志位
4 CF标志位
CF是flag的第0位,进位标志位,它记录指令执行后,结果是否有借位和进位,有进位或者借位保存在CF中,
例子:mov al 98H
mov al,al
结果为(a)l=30H,CF=1,CF记录了最高位向更高位进位值
5 OF标志位
OF是flag的第11位,溢出标志位,一般情况下,它判断有符号数是否产生溢出(进位也算是溢出),如果溢出,OF=OV=1,没有溢出OF=NC=0,(溢出是相对于有符号数,进位是相对于无符号数)
abc指令:abc是带进位加法指令,它利用了CF位上的记录的进位值
格式; abc 操作对象1, 操作对象2
功能: 操作对象1=操作对象1+操作对象2+CF
有了abc指令可以对任意大小的数据进行加法计算,多长的数据都可以分开算,先算低位,在用abc算高位,这样有进位也可以计算正确
例子:有两个128位的数据进行相加,ds:si指向第一个数据的内存空间,ds:di指向第二个数据的内存空间,用abc指令完成
;伪代码子程序
add:sub ax,ax ;将CF设置为0
mov cx,8 ;循环128位有8个字单元,一个寄存器可以算 ;一个字单元,计算8次就算完了
s:mov ax,[si]
abc ax,[di] ;低位一旦有进位,CF会保存,第二次计算时会计算进去
mov [si],ax
inc si
inc si
inc di
inc di
loop s
格式:sbb 操作对象1, 操作对象2
功能: 操作对象1=操作对象1-操作对象2-CF
有了sbb指令可以对任意大小的数据进行减法计算,低位相减,sbb高位相减
cmp指令:比较指令,相当于减法,但不保存计算结果,只修改标志寄存器的值
通过cmp看标志位可以比较两个数是否相等,是否大于,是否小于
结论:看sf标志位(实际结果)和of标志位(逻辑结果),如果of=0,那逻辑结果==实际结果,就可以看出实际结果比较是正确的 of=1,逻辑结果!=实际结果,看出实际结果比较是相反的
检测比较结果的条件转移指令,和cmp指令搭配使用
格式:指令 转移的标号
指令 含义 检测的相关标志位
je 等于则转移 ZF=1
jne 不等于则转移 ZF=0
jb 低于则转移 CF=1
jnb 不低于则转移 CF=0
ja 高于则转移 CF=0且ZF=0
jna 不高于则转移 CF=1或ZF=1
例子:
cmp ax,bx 比较ax bx,相等ZF=1
je s 检测是否ZF=1,是就转到S标号处执行代码
add ax,bx
s:sub ax=bx
6 DF是flag的第10位,方向标志位
在串处理指令中,控制每次操作后,si,di的增减
DF=0,每次操作后si,di递增
DF=1,每次操作后si,di递减
movsb指令
功能:是将ds:si指向的内存单元以字节为单位传送到es:di内存单元中,然后根据DF标志位将SI和DI递增或递减
mov byte ptr es:[di],ds:[si] ;这只是用汇编描述,8086汇编没有这样的指令
DF=0, add di,1
add si,1
DF=1 sub si,1
sub di,1
movsw指令
功能:是将ds:si指向的内存单元以字为单位传送到es:di内存单元中,然后根据DF标志位将SI和DI递增或递减
mov byte ptr es:[di],ds:[si] ;这只是用汇编描述,8086汇编没有这样的指令
DF=0, add di,2
add si,2
DF=1 sub si,2
sub di,2
一般来说,movsb/movsw和rep配合使用,格式:rep movsb/movsw
rep是根据cx的值,重复执行2后面的串传送指令,
汇编解释:s:movsb
loop s
8086提供两条指令对DF设置
CLD 全称 Clear Director :清除DF DF=0
STD 全称 Set Director :设置DF DF=1
Pushf:将标志寄存器压栈
popf:将标志寄存器出栈
标志寄存器在debug中的表示
标志 值为1的标志 值为1的标志
of OV NV
sf NG PL
zf ZR NZ
pf PE PO
cf CY NC
df DN UP