8086标志寄存器笔记

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指令:sbb是带借位的减法,它利用了CF位上的记录的借位值

格式: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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值