开发日记-20190915 关键词 汇编语言王爽版 第十一章
第十一章 标志寄存器
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 关键词 汇编语言王爽版 第十一章相关推荐
- 开发日记-20190915 关键词 汇编语言王爽版 第十三章
第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...
- 开发日记-20190915 关键词 汇编语言王爽版 第十章
第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...
- 开发日记-20190915 关键词 汇编语言王爽版 第九章
第九章 转移指令的原理 可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类: 只修改IP时,称为段 ...
- 开发日记-20190915 关键词 汇编语言王爽版 第十二章
第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第四章
第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章
第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第六章
第六章 包含多个段的程序 前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说0:200~0:2FF是相对安全的,可这段空间的容量只有256 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第五章
第五章 [BX]和loop指令 5.2 Loop指令 loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, (cx)=(cx)-1 判断cx中的值,不为零则转至标号处执行 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第三章
第三章 寄存器(内存访问) 3.1 内存中字的存储 CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低八位存放低位字节.在内存存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字 ...
最新文章
- matlab贝塞尔滤波器设计_DSP之窗函数法设计高通滤波器(MATLAB实现)
- PHP之使用网络函数和协议函数
- ZooKeeper入门(一)
- 重拾强化学习的核心概念_强化学习的核心概念
- 哥大计算机专业 世界排名,哥伦比亚大学计算机科学硕士排名第16(2020年TFE Times排名)...
- wind试用版 matlab,免费产品试用 - MATLAB Simulink
- poj 2236 WirelessNetwork 并查集
- “女神节”男性送礼热门商品榜:“求生欲”极强!
- Linux 命令(48)—— stat 命令
- 锁相环环路滤波器计算公式_锁相环和射频振荡器简介
- mysql odbc安装丢失_ODBC驱动程序丢失解决方法--留档记录
- Q4实现盈利,搜狐迎来“疫”外春天?
- PHP学习总结(二)
- 4A 统一安全管理平台解决方案。
- 史上最详细springboot vue UEditor整合(包括遇到的各种坑)
- libuv介绍与编译
- 劫持Linux idle进程做点自己的计算任务
- 世界首例!神经调控成功应用于难治性抑郁症治疗
- Showing All Errors Only Command PhaseScriptExecution failed with a nonzero exit code
- 浅谈分页插件PageHelper
热门文章
- php查询当前session,php查看当前Session的ID方法
- Linux之telnet命令使用详解—网络故障定位(四)
- c语言的语言扩展的数据类型,C语言之数据类型
- php处理微信返回xml数据,php将微信返回的xml格式转换成数组
- mysql 3列索引_mysql多列索引
- java 执行linux命令行_10个高效Linux技巧及Vim命令对比
- 编译 android 内核,编译内核 | Android 开源项目 | Android Open Source Project
- windows下用elasticdump导入json数据到Elasticsearch中
- Java后端职业规划,附学习笔记+面试整理+进阶书籍
- 【深度学习】实战Kaggle竞赛之线性模型解决波士顿房价预测问题(Pytorch)