汇编基础--CMP汇编指令
来源:互联网 发布:ip与mac绑定怎么取消 编辑:程序博客网 时间:2024/05/01 18:25
cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位。其他的指令通过识别这些被影响的标志位来得知比较结果。
cmp指令格式: cmp 操作对象1, 操作对象2
计算 操作对象1 - 操作对象2 但不保存结果,只是根据结果修改相应的标志位。
举例假如此时eax = 0h
那么cmp eax, eax (eax - eax = 0)
此时我们的指令执行后, ZF标志位 = 1, PF = 0, SF =0 , CF =0 , OF = 0 。
(因为我们结果为0,所以ZF标志位为1 . 前提是在PF操作数为0的情况下执行
ps:其实PF标志位无关紧要)
在继续举例
mov ebx, 05h
mov eax, 08h
cmp eax, ebx (eax - ebx = 03h)
此时我们的指令执行后(ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0)
因为此时我们就可以通过标志位判断出eax 是否大于ebx。 我们有时候想问题,可以逆序的想。
可以这样想,如果它小于的话会发生什么。。 举例假如al = 05h, bl = 08h (为了更直观,所以我采用低8位寄存器)
mov al, 05h
mov bl, 08h
cmp al, bl (al - bl = -3h)
(注意:al是低8位寄存器,为了更直观,所以我采用低8位寄存器,计算机负数是以补码的形式在内存存放的,赶快拿起你的手,算算-3的补码是多少。)
那么执行后 (ZF = 0, PF = 0, CF = 1, SF = 1, OF =0)
(那么大家肯定会问:CF = 1, 为何存在了进位操作。 在我们计算机中两个数据做减法运算的时候,有可能象更高位借位,举例
mov al, 56h
mov bl, 57h
sub al, bl
借位后,将产生156 - 57h )
SF我就不说了吧,符号标志位,我们的结果为负,所以SF = 1
从以上两点标志位我们是否就可以分析出呢。 如果小于则SF = 1 , CF =1 。。 呵呵
那么刚刚上面的我们就可以轻松的解决了。。 如果我们的数值大于的话,则 SF, CF ,ZF肯定是0。 所以
mov ebx, 05h
mov eax, 08h
cmp eax, ebx (eax - ebx = 03h)
此时我们的指令执行后(ZF = 0, PF = 1, SP = 0, CF = 0, OF = 0)
那么上面我们分析了=(等于)、<(小于) 和>(大于) 的情况。接下来我们分析下 不等于、大于等于,小于等于的情况。
首先分析不等于
(我们分析题目,可以通过逆序的思路)假设此时我们的比较的两数值相等,则ZF=1,所以如果不相等,则ZF肯定不等于1,也就是ZF =0
接着分析小于等于
其实这个就是刚刚我们上面分析的+上等于的条件。我们看上面如果小于则SF = 1, CF =1。那么小于等于 CF =1 或 ZF =1。
cmp指令格式: cmp 操作对象1, 操作对象2
计算 操作对象1 - 操作对象2 但不保存结果,只是根据结果修改相应的标志位。
举例假如此时eax = 0h
那么cmp eax, eax (eax - eax = 0)
此时我们的指令执行后, ZF标志位 = 1, PF = 0, SF =0 , CF =0 , OF = 0 。
(因为我们结果为0,所以ZF标志位为1 . 前提是在PF操作数为0的情况下执行
ps:其实PF标志位无关紧要)
在继续举例
mov ebx, 05h
mov eax, 08h
cmp eax, ebx (eax - ebx = 03h)
此时我们的指令执行后(ZF = 0, PF = 1, SF = 0, CF = 0, OF = 0)
因为此时我们就可以通过标志位判断出eax 是否大于ebx。 我们有时候想问题,可以逆序的想。
可以这样想,如果它小于的话会发生什么。。 举例假如al = 05h, bl = 08h (为了更直观,所以我采用低8位寄存器)
mov al, 05h
mov bl, 08h
cmp al, bl (al - bl = -3h)
(注意:al是低8位寄存器,为了更直观,所以我采用低8位寄存器,计算机负数是以补码的形式在内存存放的,赶快拿起你的手,算算-3的补码是多少。)
那么执行后 (ZF = 0, PF = 0, CF = 1, SF = 1, OF =0)
(那么大家肯定会问:CF = 1, 为何存在了进位操作。 在我们计算机中两个数据做减法运算的时候,有可能象更高位借位,举例
mov al, 56h
mov bl, 57h
sub al, bl
借位后,将产生156 - 57h )
SF我就不说了吧,符号标志位,我们的结果为负,所以SF = 1
从以上两点标志位我们是否就可以分析出呢。 如果小于则SF = 1 , CF =1 。。 呵呵
那么刚刚上面的我们就可以轻松的解决了。。 如果我们的数值大于的话,则 SF, CF ,ZF肯定是0。 所以
mov ebx, 05h
mov eax, 08h
cmp eax, ebx (eax - ebx = 03h)
此时我们的指令执行后(ZF = 0, PF = 1, SP = 0, CF = 0, OF = 0)
那么上面我们分析了=(等于)、<(小于) 和>(大于) 的情况。接下来我们分析下 不等于、大于等于,小于等于的情况。
首先分析不等于
(我们分析题目,可以通过逆序的思路)假设此时我们的比较的两数值相等,则ZF=1,所以如果不相等,则ZF肯定不等于1,也就是ZF =0
接着分析小于等于
其实这个就是刚刚我们上面分析的+上等于的条件。我们看上面如果小于则SF = 1, CF =1。那么小于等于 CF =1 或 ZF =1。
- 汇编基础--cmp汇编指令
- 汇编基础--CMP汇编指令
- 汇编基础--cmp汇编指令
- Test&Cmp汇编指令
- 170419 汇编-cmp指令
- 汇编cmp指令
- 汇编cmp比较指令详解
- 汇编cmp比较指令详解
- 汇编cmp比较指令详解
- 汇编cmp比较指令详解
- 汇编cmp比较指令详解
- 汇编 test指令和cmp指令
- 汇编CMP
- 汇编中的test和cmp指令
- 【转】汇编中的test和cmp指令
- 汇编中的test和cmp指令[Z]
- 汇编中的test和cmp指令[Z]
- 汇编中的test和cmp指令 .
- 学习git 的好网站
- 01-C语言开篇Hello,World
- Linux输入子系统(5):设备驱动层实例之触摸屏驱动
- Redhat6中获取LANG值为空
- CodeForces #1 C. Ancient Berland Circus
- 汇编基础--CMP汇编指令
- Ubuntu系统上远程桌面,samba,ftp,vncserver,ssh服务器,teamviewer安装配置
- Java 序列化的高级认识
- 吝啬的国度(dfs)
- JBoss 系列五十五:JBoss 7/WildFly 集群之 HornetQ Messaging - III(示例补充说明)
- 游戏数据分析的架构及调优
- uboot分析相关文章
- JavaScript 子类用 Object.getPrototypeOf 去调用父类方法
- Linux输入子系统(6):设备驱动层之LED驱动