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 | A ≥ B | |
JA/JNBE | CF=0 and ZF=0 | A > B | |
JBE/JNA | CF=1 or ZF=1 | A ≤ B | |
有符号数 | JL/JNGE | SF ≠ OF | A < B |
JGE/JNL | SF=OF | A ≥ B | |
JG/JNLE | SF=OF and ZF=0 | A > B | |
JLE/JNG | SF ≠ OF or ZF=1 | A ≤ B | |
无符号数或有符号数 | JZ/JE | ZF=1 | A = B |