cmp(compare)指令

cmp(compare)指令进行比较两个操作数的大小

例:cmp oprd1,oprd2

为第一个操作减去第二个操作数,

但不影响第两个操作数的值

它影响flag的CF,ZF,OF,AF,PF

我们怎么判断大小呢?

若执行指令后

ZF=1 这个简单,则说明两个数相等,因为zero为1说明结果为0

当无符号时:

    CF=1 则说明了有进位或借位,cmp是进行的减操作,故可以看出为借位,所以,此时oprd1<oprd2

CF=0 则说明了无借位,但此时要注意ZF是否为0,若为0,则说明结果不为0,故此时oprd1>oprd2

当有符号时:

若SF=0,OF=0 则说明了此时的值为正数,没有溢出,可以直观的看出,oprd1>oprd2

若SF=1,OF=0 则说明了此时的值为负数,没有溢出,则为oprd1<oprd2

若SF=0,OF=1 则说明了此时的值为正数,有溢出,可以看出oprd1<oprd2

若SF=1,OF=1则说明了此时的值为负数,有溢出,可以看出oprd1>oprd2

最后两个可以作出这种判断的原因是,溢出的本质问题:

两数同为正,相加,值为负,则说明溢出

两数同为负,相加,值为正,则说明溢出

故有,正正得负则溢出,负负得正则溢出

很简单的一条指令,初学者看看,我感觉我写的还挺详细的,哈哈……

补充: 两数相减,同号,则不溢出

            两数为异号,结果与减数符号相同,则溢出。

比效指令 CMP(CoMPare)

格式: CMP OPRD1,OPRD2

功能: 对两数进行相减,进行比较.

 

说明:

       1. OPRD1为任意通用寄存器存储器操作数.
 ----     OPRD2为任意通用寄存器或存储器操作数,立即数也可用作源操作数OPRD2.

       2. 对标志位的影响同SUB指令,完成的操作与SUB指令类似,唯一的区别是不将OPRD1-OPRD2的结果送回OPRD1,而只是比较.因而不改变OPRD1和OPRD2的内容,该指令用于改变标志位.

       3. 在8088/8086指令系统中,专门提供了一组根据带符号数比较大小后,实现条件转移的指令.

       4. 示例: CMP AL,20
                CMP DX,CX
                CMP AX,DATA1[BX]
                CMP BATE[DI],BX

       5. 以CMP DX,CX为例,对标志位的影响如下:
          (1) (DX)=(CX)时,则ZF=1;

          (2) 两相无符号数比较:
              若(DX)>=(CX)时,则CF=0,即无借位.
              若(DX)<(CX)时,则CF=1.

          (3) 两个带符号数比较
              对带符号数判断大小可通过溢出标志OF及符号标志SF共同判断.
              当 OF=0,即无溢出时,若SF=0,则(DX)>(CX)
                                 若SF=1,则(DX)<(CX)
              当 OF=1,即有溢出时,若SF=1,则(DX)>(CX) 
                                 若SF=0,则(DX)<(CX)

汇编常用跳转指令及检测的标志位

 

助记符

条件( 执行 CMP A,B 之后的标志位)

表达式

无符号数

JB/JNAE

CF=1

A < B

JAE/JNB

CF=0

≥ B

JA/JNBE

CF=0 and ZF=0

A > B

JBE/JNA

CF=1 or ZF=1

≤ B

有符号数

JL/JNGE

SF ≠ OF

A < B

JGE/JNL

SF=OF

≥ B

JG/JNLE

SF=OF and ZF=0

A > B

JLE/JNG

SF ≠ OF or ZF=1

≤ B

无符号数或有符号数

JZ/JE

ZF=1

A = B


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您介绍一下PLC基础知识指令的27个: 1. LD指令(Load):将数据从指定地址(寄存器或存储器)加载到累加器中。 2. LDI指令(Load Immediate):将立即数(常数)加载到累加器中。 3. AND指令:将累加器中的数据与指定地址中的数据进行逻辑与运算,并将结果存储在累加器中。 4. OR指令:将累加器中的数据与指定地址中的数据进行逻辑或运算,并将结果存储在累加器中。 5. XOR指令:将累加器中的数据与指定地址中的数据进行逻辑异或运算,并将结果存储在累加器中。 6. NOT指令:将累加器中的数据进行逻辑非运算,并将结果存储在累加器中。 7. ADD指令:将累加器中的数据与指定地址中的数据进行加法运算,并将结果存储在累加器中。 8. SUB指令:将累加器中的数据与指定地址中的数据进行减法运算,并将结果存储在累加器中。 9. MUL指令:将累加器中的数据与指定地址中的数据进行乘法运算,并将结果存储在累加器中。 10. DIV指令:将累加器中的数据与指定地址中的数据进行除法运算,并将结果存储在累加器中。 11. MOD指令:将累加器中的数据与指定地址中的数据进行模运算,并将结果存储在累加器中。 12. INC指令(Increment):将指定地址中的数据加1,并将结果存储在该地址中。 13. DEC指令(Decrement):将指定地址中的数据减1,并将结果存储在该地址中。 14. CMP指令Compare):将累加器中的数据与指定地址中的数据进行比较,但不修改累加器中的数据。 15. JMP指令(Jump):无条件跳转到指定地址。 16. JZ指令(Jump if Zero):如果累加器中的数据为0,则跳转到指定地址。 17. JNZ指令(Jump if Not Zero):如果累加器中的数据不为0,则跳转到指定地址。 18. JC指令(Jump if Carry):如果上一次运算产生了进位,则跳转到指定地址。 19. JNC指令(Jump if Not Carry):如果上一次运算没有产生进位,则跳转到指定地址。 20. JGT指令(Jump if Greater Than):如果累加器中的数据大于指定地址中的数据,则跳转到指定地址。 21. JLT指令(Jump if Less Than):如果累加器中的数据小于指定地址中的数据,则跳转到指定地址。 22. JGE指令(Jump if Greater Than or Equal to):如果累加器中的数据大于或等于指定地址中的数据,则跳转到指定地址。 23. JLE指令(Jump if Less Than or Equal to):如果累加器中的数据小于或等于指定地址中的数据,则跳转到指定地址。 24. MOV指令(Move):将指定地址中的数据移动到另一个指定地址中。 25. NOP指令(No Operation):不执行任何操作,只是占用一个指令周期。 26. END指令:程序结束指令。 27. RESET指令:将PLC复位,清除所有的数据和状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值