第十一章 标志寄存器
本帖最后由 若余相思 于 2017-11-28 14:05 编辑标志寄存器有如下三个作用
(1)用来存储相关指令的某些执行结果
(2)用来为CPU执行相关的指令提供行为依据
(3)用来控制CPU的相关工作方式
11.1节 ZF标志
ZF在flag 寄存器的第六位(0位开始算起),他记录相关指令执行后,其结果是否为0,
如果结果为0,则ZF = 1;如果结果不为0,则ZF = 0
其实你只要记住它是0标志就可以啦^_^
11.2节 PF标志
PF在flag 寄存器的第2位(0位开始算起),他记录相关指令执行后,其结果的所有的bit位中1的个数是否为偶数,
如果1的个数是偶数,则PF = 1;如果为奇数,则PF = 0
提示:0个1也是偶数哦
其实你只要记住它是偶数标志就可以啦^_^
11.3节SF标志
SF在flag 寄存器的第7位(0位开始算起),他记录相关指令执行后,其结果是否为负数,
如果为负数,SF = 1;如果非负,则SF = 0
其实你只要记住它是偶数标志就可以啦^_^
11.4 CF标志
CF在flag 寄存器的第0位(0位开始算起),一般情况下,在进行无符号运算时,
他记录运算结果的最高有效位向更高位的进位值,或者从更高位的错位值。
例如:
mov al, 98H
add al, al
执行后,(al) = 30H,CF = 1
add al, al 执行后,(al) = 60H,CF = 0,CF记录了从最高有效位向更有效位的进值
又例如:
move al, 97H
sub al, 98H
执行后,(al) = FFH, CF = 1, CF记录了向更高位的错值
sub al, al
执行后,(al) = 0, CF = 0, CF记录了向更高位的错值
我记它为进错值标志
11.5节OF标志
OF在flag 寄存器的第11位(0位开始算起),一般情况下,OF记录了有符号数运算的结果是否发生了溢出。
如果发生溢出,则OF = 1,没有溢出,则OF = 0
11.6节adc指令
指令格式:adc 操作对象1, 操作对象2
功能:操作对象1 = 操作对象1 + 操作对象2 + (CF)
比如指令 adc ax, bx实现的功能是: (ax)= (ax) + (bx) + CF
11.7节sbb指令
指令格式:adc 操作对象1, 操作对象2
功能:操作对象1 = 操作对象1 - 操作对象2 - (CF)
比如指令 adc ax, bx实现的功能是: (ax)= (ax) - (bx) - CF
11.8节cmp指令
cmp格式:cmp操作对象1,操作对象2
功能:计算操作对象1- 操作对象2 但并不保存结果,仅仅根据计算的=对标志寄存器进行设置
比如:cmp ax, ax 做(ax) - (ax) 的运算,结果为0,但并不保存在ax中,仅影响flag的相关各位。指令执行后,ZF = 1,PF = 1, SF = 0, CF = 0, OF = 0
这里补充下在debug中flag寄存器各标志位的值的符号:
下面讨论cmp指令的影响。
(1)对于无符号来说
cmp ax, bx
zf = 1, 说明 ax = bx
zf = 0, 说明 ax != bx
cf = 1, 说明ax < bx
cf = 0, 说明 ax>= bx,当然看他是不是等于要看ZF是否 等于0
cf = 0并且zf = 1,说明ax <= bx
(2)对于有符号来说
cmp ah, bh
1、如果sf = 1,而of = 0
则 ah < bh
2、如果sf = 1,of = 1
则 ah > bh
3、如果sf = 0,of = 1
则 ah < bh
4、如果sf = 0, of = 0
ah > bh
11.9节检测比较结果的条件转移指令
下面是常用无符号的比较结果进行条件转移指令
指令 含义 检测的相关标志位
je 等于则转移 zf = 1
jne 不等于则转移 zf = 0
jb 低于则转移 cf = 1
jnb 不低于则转移 cf = 0
ja 高于则转移 cf = 0 且 zf = 0
jna 不高于则不转移 cf = 1 或 zf = 1
11.10 DF标志和串传送指令
flag的第10位是DF,在串处理中控制每次操作后si,di的增减
df = 0 每次操作后si,di 递增
df = 1 每次操作后si,di递减
传送指令:movsb和movsw
执行movsb相当于执行以下的几步操作
(1)(ex*16 + di) = (di * 16 + si)
(2)如果df = 0则:(si) = (si)+ 1
(di) = (di) + 1
如果df = 1则:(si) = (si)- 1
(di) = (di) - 1
11.11 pushf和popf
pushf指令的功能是将标志寄存器的值压栈,而popf是从栈中弹出数据,送入到标志寄存器中
兰陵月 发表于 2017-11-28 14:59
非常感谢!{:10_257:}
页:
[1]