标志寄存器

发布时间 2023-04-24 19:34:01作者: TFOREVERY

flag寄存器(16位)

flag的1.3.5.12.13.14.15在8086CPU中没有使用,不具有任何意义

CF(flag的第0位)进位标志位

有进位/借位 CF = 1

没有进位/借位 CF = 0

PF(flag的第2位)奇偶标志位

如果结果为偶数,PF = 1

如果结果为奇数,PF = 0

ZF(flag的第6位)零标志位

如果结果为0,ZF = 1

如果结果不为0,ZF = 0

如:mov ax,1 --> sub ax,1 --> 结果为0,所以ZF = 1
mov ax,2 --> sub ax,1 --> 结果不为0,所以ZF = 0

SF(flag的第7位)符号标志位 --> 记录数据的正负

如果结果为负,SF = 1

如果结果为正,SF = 0

(计算为0的时候,SF = 0)

OF标志()溢出标志位

如果出现溢出 OF = 1

如果没有出现溢出 OF = 0

标志 值为1的标记 值为0的标记

DF标志(flag的第10位)方向标志位

在串处理指令中控制si,di的增减

DF = 0:每次操作后si,di递增;

DF = 1:每次操作后si,di递减;

DF的值由:cld指令和std指令决定

cld指令(将DF设置为0)

std指令(将DF设置为1)

格式:movsb

功能:(以字节位单位进行传送)

(1)es:di = ds:si
(2)如果DF = 0:si,di递增1;如果DF = 1:si,di递减1;
将ds:si中的值送入es:di指向的内存中,然后根据DF的值进行增减

格式:movsw

功能:(以字单位进行传送)

(1)es:di = ds:si
(2)如果DF = 0:si,di递增2;如果DF = 1:si,di递减2;
将ds:si中的值送入es:di指向的内存中,然后根据DF的值进行增减

一般来说是跟rep一起使用

rep指令(根据cx的值,重复执行后面的传送指令)

格式:rep movsb/movsw

OF   OV         NV
SF   NG         PL
ZF   ZR         NZ
PF   PE         PO
CF   CY         NC
DF   DN         UP
怎么看呢?打开dosbox --> debug --> -r 右下角就是它了


adc 指令(带进位的加法指令),利用CF位上记录的进位值

格式:adc 操作对象1,操作对象2

作用:操作对象1 = 操作对象1 + 操作对象2 + CF

sbb 指令(带进位的减法指令),利用CF位上记录的进位值

格式:adc 操作对象1,操作对象2

作用:操作对象1 = 操作对象1 - 操作对象2 - CF

cmp 指令(比较指令)

格式:cmp 操作对象1,操作对象2

计算操作对象1 - 操作对象2,但不保存结果,仅仅根据计算结果对标志寄存器进行设置

作用:相当于减法指令,但是不保存结果

会对标志寄存器产生应影响

注意:这里是对flag中的所有标志寄存器产生影响

指令  含义 检测的相关标志位(满足条件)

 je  等于则转移     ZF=1

jne 不等于则转移 ZF=0

 jb  低于则转移     CF=1

jnb 不低于则转移 CF=0

 ja  高于则转移     CF=0,ZF=0

jna 不高于则转移 CF=1或ZF=1

记忆方法:

  e:表示equal

ne:表示not equal

  b:表示below

nb:表示not below

  a:表示above

na:表示not above

pushf 指令:将标志寄存器的值压入栈中

popf 指令:从栈中拿出数据送入标志寄存器中