cmp指令


本质

cmp是比较指令,cmp的功能相当于减法。

格式

cmp 操作对象1,操作对象2

功能

计算操作对象1-操作对象2,但并不保存结果,可以根据flag标志寄存器来判断结果。

正向判断

如果(ax) = (bx) 则(ax)-(bx) = 0,所以:zf=1。
如果(ax) != (bx) 则(ax)-(bx) != 0,所以:zf=0。
如果(ax) < (bx) 则(ax)-(bx)将产生借位,所以:cf=1。
如果(ax) >=(bx) 则(ax)-(bx)不产生借位,所以:cf=0。
如果(ax) > (bx) 则(ax)-(bx) != 0,也不产生借位,所以:zf=cf=0。
如果(ax) <=(bx) 则(ax)-(bx)可能为0,也可能产生借位,所以:zf=1或zf=1。(1、3起码满足一个)

反向判断

指令cmp ax,bx 的逻辑含义是比较ax和bx的值,如果执行后:
1. zf=1 ===> (ax)=(bx)
2. zf=0 ===> (ax)!=(bx)
3. cf=1 ===> (ax)<(bx)
4. cf=0 ===> (ax)>=(bx)
5. cf=zf=0 ===> (ax)>(bx)
6. cf=1或zf=1 ===> (ax)<=(bx)

如何记忆?

1.	zf是0标志寄存器,zf=1时,ax=bx;zf=0时,ax != bx。
2. cf是进位借位标志寄存器,cf=1时,ax<bx;cf=0时,ax>=bx。
3. 根据1、2组合可以推出另外两个。

CMP指令如何起作用?

cmp指令的比较结果需要通过条件转移指令来检测。

指令 解释 含义 检测的相关标志位
je e:equal 等于则转移 zf=1
jne ne:not equal 不等于则转移 zf=0
jb b:below 低于则转移 cf=1
jnb nb:not below 不低于则转移 cf=0
ja a:above 高于则转移 cf=0且zf=0
jna na:not above 不高于则转移 cf=1或zf=1

《汇编语言(第三版)》cmp指令的更多相关文章

  1. CMP指令(转)

    刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...

  2. cmp指令

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

  3. cmp 指令

    (lldb) disassemble -n comp2 untitled6`comp2: 0x10d065f40 <+>: pushq %rbp 0x10d065f41 <+> ...

  4. cmp比较指令对标志寄存器的影响

    比如: mov ax,x mov bx,y cmp ax,bx cmp ax,bx的逻辑含义是比较ax,bx中的值.如果执行后: ZF=1则AX=BX ZF=0则AX!=BX CF=1则AX<B ...

  5. 汇编cmp比较指令详解

    刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...

  6. 关于ARM中的tst、cmp、bne、beq指令

    一.关于cmp的详细用法 假设现在AX寄存器中的数是0002H,BX寄存器中的数是0003H. 执行的指令是:CMP AX, BX 执行这条指令时,先做用AX中的数减去BX中的数的减法运算. 列出二进 ...

  7. 汇编指令之CMP, TEST指令

    一.CMP指令 这一块呢,我不想上图了,汇编的博文我已经快要让我写吐了,其实也有好多我没有补充进来,比如进制,LEA指令,数据宽度,有符号,无符号的区分等等,但我真的要吐了,这些玩意我已经不是第一次写 ...

  8. 学习:CMP/TEST比较指令

    cmp指令:比较 cmp指令,和sub指令的最大的不同点就是影响标志位 不储存结果 1.当前汇编指令为cmp ecx,edx 2.当前ecx寄存器中的地址为00000000,edx寄存器中的地址000 ...

  9. arm汇编指令

    ARM处理器的指令集可以分为跳转指令.数据处理指令.程序状态寄存器(PSR)处理指令.加载/存储指令.协处理器指令和异常产生指令6大指令 一.跳转指令 跳转指令用于实现程序流程的跳转 跳转指令分类 Ⅰ ...

随机推荐

  1. Spark RDD概念学习系列之典型RDD的特征

    不多说,直接上干货!

  2. HD-ACM算法专攻系列(14)——find your present (2)

    问题描述: 源码: #include"iostream" #include"algorithm" using namespace std; bool cmp(i ...

  3. mysql中间件研究(tddl atlas cobar sharding-jdbc)

    mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等,但其不支持大数据量的分库分表且性能较差.下面介绍几款能代替其的mysql开源中间件产品,Atlas ...

  4. nginx 日志配置不生效的问题

    log_format 有个默认的日志格式: log_format combined '$remote_addr - $remote_user [$time_local] ' ' "$requ ...

  5. Java自定义属性注解

    代码: import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.annotation.ElementT ...

  6. 给iview组件select设置默认值

    1.首先,给select加一个v-model,如: <Select v-model="exam_name" > <Option v-for="(item ...

  7. Extjs iconCls 的用法

    如何在按钮中加icon: 1.在Extjs中 { xtype:'button', text:'学生档案', iconCls:'file', }, 2.在css中写: .file{ background ...

  8. Ansible学习记录四:单命令测试

    0.Ansible的group支持all.通配符(*).IP地址 1.查看Ansible的版本 $  ansbile  --version [root@test ~]# ansible --versi ...

  9. JS数据分组[JSON]

    JS 数据分组 var arr = [{ "id": "1001", "name": "值1", "value ...

  10. java EE使用response返回中文时,出现乱码问题

    response.setHeader("content-type", "text/html;charset=UTF-8");