若余相思 发表于 2017-11-28 14:05:12

第十一章 标志寄存器

本帖最后由 若余相思 于 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:36



若余相思 发表于 2017-11-28 21:15:40

兰陵月 发表于 2017-11-28 14:59


非常感谢!{:10_257:}
页: [1]
查看完整版本: 第十一章 标志寄存器