[汇编学习笔记][第十一章标志寄存器]
第十一章 标志寄存器
作用
- 存储相关指令执行结果
- 用来为CPU执行相关指令提供行为依据
- 用来控制CPU的相关工作方式
这种特殊寄存器在8086CPU
被称为标志寄存器(flag), 8086标志寄存器有16位
其中存储程序状态字。
11.1 ZF标志
-
ZF
(zero flag) 在flag的第6位。 -
它记录相关指令执行后,其结果是否为0.如果结果为0,则
ZF=1
,否则ZF=0
- 要注意,在8086CPU中,有的指令影响标志寄存器,大多数是运算指令
- mov,push,pop,对标志器基本没影响
- 学一条指令,要关注他会对那些标志寄存器产生影响
11.2 PF标志
PF
(Parity flag) 在flag的第2位。奇偶校验位。- 记录相关指令执行后,结果所有bit位中1的个数是否为偶数
- 只判断结果的低8位
11.3 SF标志
PF
(Sign flag) 在flag的第7位。符号标志位。- 记录相关指令执行后,结果是否为负
- 对有符号数起作用
11.4 CF标志
CF
(Carry Flag) 在flag的第0位,进位标志位。- 在进行无符号运算的时候它记录了运算结果的最高有效位向更高位的进位值,或最高位的借位值。
- 对无符号数起作用
11.5 OF标志
OF
(Overflow Flag) 在flag的第7位。符号标志位。- 在进行有符号运算的时候,记录结果是否溢出
- 对有符号数起作用
- 在实际ADD中,既可以看作有符号,也可以看作无符号。CF和OF可能都为1,代表无符号的时候进位了,有符号的时候溢出了。
11.6 adc指令
- 指令格式 adc obj1,obj2
- 作用 obj1=obj1+obj2+CF
11.7 sbb指令
- 指令格式 sbb obj1,obj2
- 作用 obj1 = obj1 - obj2 - cf
11.8 cmp指令
- 指令个事 cmp obj1,obj2
-
作用 计算 obj1 - obj2 但不保存结果,仅仅根据结果对标志寄存器进行设置
-
无符号的运算主要影响
cf
,zf
两个标志寄存器 - 有符号的运算还要涉及到
sf
, 和of
。
- 溢出后为负数,溢出前为正数
- 溢出后为正数,溢出前为负数
以cmp ah,bh为例
sf=1
,of=0
:(ah)<(bh)- ‘sf=1’ ,
of=1
:(ah)>(bh) sf=0
,of=1
:(ah)<(bh)sf=0
,of=0
:(ah)>=(bh)
11.9 检测比较结果的跳转指令
jcxz
: 如果(cx)=0 则跳转
无符号:
je
: 等于则跳转,zf
=1jne
: 不等于则跳转,zf
=0jb
: 低于则跳转,cf
=1jnb
: 不低于则跳转cf
=0ja
: 高于则跳转cf=0
且zf=0
jna
: 不高于则跳转cf=1
或zf=1
e:equal
,n:not
,b:below
,a:above
11.10 DF标志和串传送命令
DF
(Direction Flag) 在flag的第10位。方向标志位。- 当
DF=0
时,si++,di++。DF=1
时,si–,di– -
movsb
将ds:si
所指的一个字节赋值给es:di
-
实际运用
通过
rep
和movsb
(byte)或movsw
(word)来共同使用。cx控制循环次数,DF控制串传送方向。- rep movsb
- rep movsw
- cld 使
df=0
Clear Director - std 使
df=1
Set Director
11.11 pushf和popf
pushf
将标志寄存器的值压栈popf
从栈中弹出数据,送入标志寄存器
11.12 DEBUG中标志寄存器的表示