第十一章 标志寄存器

CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下三种作用.
(1)用来存储相关的指令的某些执行结果
(2)用来为CPU执行相关的指令提供行为依据
(3)用来控制CPU的相关工作方式

这种特殊的寄存器在8086CPU中,被称为标志寄存器.8086CPU的标志寄存器有16位,其中存储的信息通常被称为程序状态字(PSW).我们已经使用过8086CPU的ax,bx,cx,dx,si,di,bp,sp,IP,cs,ss,ds,es等13个寄存器了.

flag和其他寄存器不一样,其他寄存器是用来存放数据的,都是整个寄存器具有一个含义.而flag寄存器是按位起作用的,也就是说,他的每一位都有专门的含义,记录特定的信息.

11.1 ZF标志

flag的第6位是ZF,零标志位.它记录相关指令执行后,其结果是否为0.如果结果为0,那么zf=1;如果结果不为0,那么zf=0;

注意,在8086CPU的指令中,有的指令的执行是影响标志寄存器的,比如,add,sub,mul,div,inc,or,and等,他们大多数都是运算指令(进行逻辑和算术运算);有的指令的执行对标志寄存器没有影响,比如,mov,push,pop等,他们大多是传送指令.在使用一条指令的时候,要注意这条指令的全部功能,其中包括,执行结果对标志寄存器的那些标志位造成影响.

11.2 PF标志

flag的第二位是PF,奇偶标志位.它记录相关指令执行后,其结果的所有bit位中1个个数是否为偶数.如果1的个数为偶数,pf=1,如果为奇数,那么pf=0

11.3 SF标志

flag的第七位是SF,符号标志位.它记录相关指令执行后,其结果是否为负.如果结果为负,sf=1;如果非负,sf=0.

计算机中通常用补码来表示有符号数据,计算机中的一个数据可以看作是有符号数,也可以看成是无符号数.
比如:

00000001B,可以看做无符号数1,或有符号数+1;
10000001B,可以看作为无符号数129,也可以看作有符号数-127;

不管我们如何看待,CPU在执行add等指令的时候,就已经包含了两种含义,也将得到用同一种信息来记录的两种结果.关键在于我们的程序需要那一种结果.

SF标志,就是CPU对有符号数运算结果的一种记录,它记录数据的正负.在我们将数据当做有符号数来运算的时候,可以通过它来得知结果的正负.如果,我们将数据当做无符号数来运算,SF的值则没有意义,虽然相关的指令影响了它的值.

11.4 CF标志

flag的第零位是CF,进位标志位.一般情况下,在进行无符号数运算的时候,它记录了运算结果的最高有效位向更高位的进位制,或从更高位的借位值.

11.5 OF标志

在有符号数运算的时候,如果结果超过了及其所能表示的范围称为溢出.

一定要注意CF和OF的区别:CF是对无符号数运算有意义的标志位,而OF是对有符号数运算有意义的标志位

11.6 adc指令

adc是带进位加法指令,它利用了CF位上记录的进位值.
指令格式:adc 操作对象1,操作对象2
功能:操作对象1=操作对象1+操作对象2+CF
比如指令adc ax,bx实现的功能是:(ax)=(ax)+(bx)+CF

adc指令执行后,也可能产生进位值,所以也会对CF位进行设置.由于有这样的功能,我们就可以对任意大的数据进行加法运算

11.7 sbb指令

sbb是待借位减法指令,它利用了CF位上记录的借位值.
指令格式:sbb 操作对象1,操作对象2
功能:操作对象1=操作对象1-操作对象2-CF
比如指令sbb ax,bx实现的功能是:(ax)=(ax)-(bx)-CF

11.8 cmp指令

cmp是比较指令,cmp的功能相当于减法指令,只是不保存结果.cmp指令执行后,将对标志寄存器产生影响.其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果.

cmp指令格式:cmp操作对象,操作对象2
功能:计算操作对象1-操作对象2但并不保存结果,仅仅根据计算结果对标志寄存器进行设置.
下面的指令:

mov ax,8
mov bx,3
cmp ax,bx
执行后:(ax)=8,zf=0,pf=1,sf=0,cf=0,of=0

指令cmp ax,bx的逻辑含义是比较ax和bx中的值,如果执行后:
zf=1,说明(ax)=(bx)
zf=0,说明(ax)!=(bx)
cf=1,说明(ax)<(bx)
cf=0,说明(ax)>=(bx)
cf=0并且zf=0,说明(ax)>(bx)
cf=1或zf=1,说明(ax)<=(bx)

11.9 检测比较结果的条件转移指令

"转移"指的是他能够修改IP,而条件指的是他可以根据某种条件,决定是否修改IP.

11.10 DF标志和串传送指令

flag的第10位是DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减

df=0 每次操作后si,di递增;
df=1 每次操作后si,di递减;

我们来看一下下面一个串传送指令.
格式:movsb
功能:执行movsb指令相当于进行下面几步操作.
(1) ((es)*16+(di))=((ds)*16+(si))
(2) 如果df=0 则:
(si)=(si)+1
(di)=(di)+1
如果df=1,则:
(si)=(si)-1
(di)=(di)-1

格式:movsw
movsw的功能是将ds:si指向的内存字单元送入es:di中,然后根据标志寄存器df位的值,将si和di递增2或递减2

格式:rep movsb
用汇编语言来描述rep movsb的功能就是:
s:movsb
loop s
可见,rep的作用是根据cx的值,重复执行后面的串传送指令.

8086CPU提供下面两条指令对df位进行设置
cld指令:将标志寄存器的df位置0
std指令:将标志寄存器的df位置1

11.11 pushf和popf

pushf的功能是将寄存器的值压栈,而popf是从栈中弹出数据,送入标志寄存器中.

11.12 标志寄存器在Debug中的表示

开发日记-20190915 关键词 汇编语言王爽版 第十一章相关推荐

  1. 开发日记-20190915 关键词 汇编语言王爽版 第十三章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  2. 开发日记-20190915 关键词 汇编语言王爽版 第十章

    第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...

  3. 开发日记-20190915 关键词 汇编语言王爽版 第九章

    第九章 转移指令的原理 可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类: 只修改IP时,称为段 ...

  4. 开发日记-20190915 关键词 汇编语言王爽版 第十二章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  5. 开发日记-20190914 关键词 汇编语言王爽版 第四章

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...

  6. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章

    第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...

  7. 开发日记-20190914 关键词 汇编语言王爽版 第六章

    第六章 包含多个段的程序 前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说0:200~0:2FF是相对安全的,可这段空间的容量只有256 ...

  8. 开发日记-20190914 关键词 汇编语言王爽版 第五章

    第五章 [BX]和loop指令 5.2 Loop指令 loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, (cx)=(cx)-1 判断cx中的值,不为零则转至标号处执行 ...

  9. 开发日记-20190914 关键词 汇编语言王爽版 第三章

    第三章 寄存器(内存访问) 3.1 内存中字的存储 CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低八位存放低位字节.在内存存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字 ...

最新文章

  1. matlab贝塞尔滤波器设计_DSP之窗函数法设计高通滤波器(MATLAB实现)
  2. PHP之使用网络函数和协议函数
  3. ZooKeeper入门(一)
  4. 重拾强化学习的核心概念_强化学习的核心概念
  5. 哥大计算机专业 世界排名,哥伦比亚大学计算机科学硕士排名第16(2020年TFE Times排名)...
  6. wind试用版 matlab,免费产品试用 - MATLAB Simulink
  7. poj 2236 WirelessNetwork 并查集
  8. “女神节”男性送礼热门商品榜:“求生欲”极强!
  9. Linux 命令(48)—— stat 命令
  10. 锁相环环路滤波器计算公式_锁相环和射频振荡器简介
  11. mysql odbc安装丢失_ODBC驱动程序丢失解决方法--留档记录
  12. Q4实现盈利,搜狐迎来“疫”外春天?
  13. PHP学习总结(二)
  14. 4A 统一安全管理平台解决方案。
  15. 史上最详细springboot vue UEditor整合(包括遇到的各种坑)
  16. libuv介绍与编译
  17. 劫持Linux idle进程做点自己的计算任务
  18. 世界首例!神经调控成功应用于难治性抑郁症治疗
  19. Showing All Errors Only Command PhaseScriptExecution failed with a nonzero exit code
  20. 浅谈分页插件PageHelper

热门文章

  1. php查询当前session,php查看当前Session的ID方法
  2. Linux之telnet命令使用详解—网络故障定位(四)
  3. c语言的语言扩展的数据类型,C语言之数据类型
  4. php处理微信返回xml数据,php将微信返回的xml格式转换成数组
  5. mysql 3列索引_mysql多列索引
  6. java 执行linux命令行_10个高效Linux技巧及Vim命令对比
  7. 编译 android 内核,编译内核  |  Android 开源项目  |  Android Open Source Project
  8. windows下用elasticdump导入json数据到Elasticsearch中
  9. Java后端职业规划,附学习笔记+面试整理+进阶书籍
  10. 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)