8086cpu中的标志寄存器与比较指令
在8086CPU中有一个特殊的寄存器——标志寄存器,该寄存器不同于其他寄存器,普通寄存器是用来存放数据的读取整个寄存器具有一定的含义,但是标志寄存器是每一位都有固定的含义,记录在运算中产生的信息,标志寄存器的机构如下图:
寄存器中的第1、3、5、 12、 13、 14 、15位在8086CPU中没有使用,其他位置代表不同的含义,各个位置的意思如下(该表截自百度知百科中的标志寄存器):
一般我们常用到的是如下几个标志
1)CF:CF标志表示进位,我们知道对于8086CPU来说,寄存器只能存储16位二进制数,但是有些指令产生的结果可能大于16位,比如:
mov ax,200h
add ax, 0fffffh
产生的结果已经超过16位,由于ax寄存器只能保存16位数据,因此高位产生的数据必然被丢弃,但是也不是简单的丢弃,这个时候CF标志位会变成1,表示结果产生了进位;
2)PF:表示标志,这个奇偶不是数字本身是奇数或者是偶数,表示的是某个数据中有奇数个1或者是偶数个1;
3)ZF:0标志:表示计算结果是否为0;
4)SF:符号标志记录相关计算结束后得到的结果是否为负,若为负则标志位为1,否则标志位为0;
5)方向标志:方向标志用于内存单元的拷贝,我们在将一段内存单元拷贝到另一段内存中去时使用循环一个字节一个字节的拷贝,但是8086CPU提供了一个指令movsb 、movsw分别是按字节拷贝和按字拷贝,这两个指令所对应的源内存地址只能用
ds:[si],目的地址只能用es:[di]表示,其中DF标志指明我们是从低到高字节拷贝还是从高到低字节拷贝,当df = 1时,地址递减, = 0时地址递增;
6)OF:溢出标志,它的作用与CF相同,当得到的操作数大于16位的时候,该标志置为1,但是OF用于有符号数,而CF用于无符号数。
7)IF:在DEBUG中使用,当我们启动DEBUG模式的时候,一条指令执行完后,该寄存器被置为1,这个时候会调用相应的中断程序,使我们的代码在该位置停止执行,以便我们查看相应的结果;
CMP指令
CNP指令使用的格式为CMP 操作数1,操作数2;
cmp指令的作用是将两个操作数相减,并根据结果改变标志寄存器的值,但是并不保存计算结果,当两个数都为正时,如果ZF = 0则说明两个数相等,这个指令一般用于判断两个数据的大小关系,如果我们只是使用它,那么在判断两个数字的大小关系上,可能还会判断其他内容,假设我们使用了cmp n1, n2这样的指令的话,那么可能出现三种情况:
1)n1 = n2:要判断是不是出现这种情况只需要判断ZF是否为0,当ZF为0时两数相等;
2)n1 >n2:我们知道大数减去小数结果一定为正,是不是只需要判断SF呢?不是!在数学上大数减去小数结果一定为正这是肯定的,但是在计算机中确并不一定是这样的,我们需要考虑到是否溢出的问题比如“ffffh - (-2)”这个结果在数学上肯定是负数,但是在计算机上结果却为正,,这个时候除了要校验SF还需要校验OF,当溢出产生的时候结果正好与我们使用SF校验的相反;
3)n1 < n2:这个结果的校验与上述的校验类似;
然而幸运的是,在我们实际比较两个数据大小的时候我们并不需要这样,80886CPU为我们提供了一系列指令用来做这个工作:
指令 含义
检测的相关标志位
je:(jmp equal) 当两数相等时跳转;ZF = 1
jne(jmp not equal): 当两数不相等的时候跳转;ZF = 0
jb(jmp blow); 小于时跳转;CF = 1
jnb(jmp not blow) 不小于时跳转;CF = 0
ja(jmp above) 大于时跳转;CF= 0且ZF = 0
jna(jmp not above) 不大于时跳转;CF = 1或ZF = 0
以上指令指示检测标志寄存器中相应位置的值来判断,至于在它的前面是否使用了cmp指令CPU并不关心,在执行这些指令的时候只要CPU检测到相关的标志满足条件则会自动跳转,比如执行下面的指令:
mov ax,0
add ax,ax
je s1
inc ax
s1:
inc ax
CPU执行到je的时候检测到ZF寄存器为0,这个时候会自动跳转到s1处的代码中执行,不会执行je的下一行代码。为了实现比较功能最好将cmp与这些指令配套使用。高级语言中的if语句正是用着一套指令实现的
一般在破解时可能需要修改某些标识,以达到跳转或者不跳转的目的,下面是我从小甲鱼网站上找到的图片,记录了各个跳转指令实现所需要的条件,根据这个表中的内容,修改相应标识,就可以控制程序执行流程
8086cpu中的标志寄存器与比较指令的更多相关文章
- 《汇编语言(第三版)》pushf 和 popf 指令,以及标志寄存器在 Debug 中的表示
pushf 和 popf pushf 的功能是将标志寄存器的值压栈,而 popf 是从栈中弹出数据,输入标志寄存器. pushf 和 popf,为直接访问寄存器提供了方法. 格式 pushf popf ...
- 标志寄存器在Debug中的表示
在Debug中,标志寄存器是按照有意义的各个标志位单独表示的. 下面列出Debug对我们已知的标志位的表示.
- CPU标志寄存器
这个标志寄存器似乎很重要,不干掉它,中断这玩意还进行不下去了,但是过于复杂,都是一些跟计算结果相关的位,头痛 (这是别人写的一篇非常好的关于标志寄存器的文章http://blog.csdn.net/w ...
- 汇编 OD 标志位 置位相关指令
知识点: l 标志位 置位相关指令 l 标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志. ...
- 标志寄存器PSW和汇编条件转移指令解释
标志寄存器PSW 标志寄存器PSW(程序状态字寄存器PSW) 标志寄存器PSW是一个16为的寄存器.它反映了CPU运算的状态特征并且存放某些控制标志.8086使用了16位中的9位,包括6个状态标志 ...
- Uboot中start.S源码的指令级的详尽解析【转】
本文转载自:http://www.crifan.com/files/doc/docbook/uboot_starts_analysis/release/html/uboot_starts_analys ...
- DF标志和串传送指令
DF标志和串传送指令 flag的第10位是DF,方向标志位.在串处理指令中,控制si.di的递减. df = 0 每次操作后si.di递增 df = 1 每次操作后si.di递减 串传送指令 格式1: ...
- DF标志和串移动指令(movsb/movsw)
1.标志寄存器的第10位DF,方向标志位.在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si.di添加 DF=1,每次操作后,si.di减小 我们能够用汇编语法描写叙述movs ...
- EFLAGS寄存器(标志寄存器)
这篇文章不是从0开始的,前面还有一些汇编基础指令以及进制,我都没写,时间问题,还是今天空闲,我才想补一下博文,后面我陆续会把前面知识点渐渐补上.我不会重0基础讲起,中间会以.汇编.C.C++交叉的形式 ...
随机推荐
- hdu1181 变形课(vector容器+dfs)
变形课 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Submi ...
- BIRT实现组内跨行计算
问题来源:http://developer.actuate.com/community/forum/index.php?/topic/36160-dealing-with-previous-rows- ...
- SpringMVC实现JSON与前台交互
这几天忙着做学校的项目,感觉好久没有更新博客了,来整理一下. 由于要实现的功能是表单联动,只能自己去写ajax来实现提交给后台接口了,好久没有写前端,好多东西都忘记了,只能可怜巴巴的用原生的js去实现 ...
- (转)解决jdk1.8中发送邮件失败(handshake_failure)问题
解决jdk1.8中发送邮件失败(handshake_failure)问题 作者 zhisheng_tian 2016.08.12 22:44* 字数 1573 阅读 2818评论 6喜欢 9 暑假在家 ...
- 为eclipse离线安装hibernate tools插件
工具/原料 eclipse luna jboss hibernate tools 方法/步骤 下载hibernate tools插件 在eclipse根目录下创建myplugins和l ...
- [转载]ArchLinux 添加 archlinuxcn 源 密钥错误
http://www.jianshu.com/p/8ed688b0a096 杜龙少 正在检查密钥环里的密钥 [######################] 100% 正在下载所需的密钥...... ...
- 腾讯WeTest《2017中国移动游戏质量白皮书》开放预约,再为国内手游把把脉
产品为王,质量先行.如果说2016年是爆款手游相继崛起的一年,那么2017年则更像是打磨精品.建立生态的高手切磋之年.守住一个游戏的质量生命线,方能建立健康生态,方能在如火如荼的行业竞争中角逐到最后. ...
- 9.python面向对象编程
面向对象的几个核心特性如下 Class 类一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一 ...
- Pycharm配置(二)
1.主题 这部分教程主要介绍如何创建一个Python工程并使其具有Pycharm的代码风格.你将会看到Pycharm使你的源码变得非常简洁美观,带有合适的缩进.空格等等,因此Pycharm也是一款代码 ...
- 学习ABP ASP.NET Core with Angular 环境问题
1. 前言 最近学习ABP架构 搭建ASP.NET Core with Angular遇到了些问题,折腾了一个礼拜最终在今天解决了,想想这个过程的痛苦就想利用博客记录下来.其实一直想写博客,但因为 时 ...