鱼C论坛

 找回密码
 立即注册
查看: 2678|回复: 2

[学习笔记] 第十一章 标志寄存器

[复制链接]
发表于 2017-11-28 14:05:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 若余相思 于 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寄存器各标志位的值的符号:
TT截图未命名.bmp


下面讨论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是从栈中弹出数据,送入到标志寄存器中

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-28 14:59:36 | 显示全部楼层
001.png

002.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-28 21:15:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 14:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表