汇编语言中CMP是什么意思?
cmp是比较指令, cmp的功能相当于减法指令,只是不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。
比如:
mov ax,8
mov bx,3
cmp ax,bx
执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0.
通过cmp指令执行后,相关标志位的值就可以看出比较的结果。
cmp ax,bx的逻辑含义是比较ax,bx中的值。如果执行后:
ZF=1则AX=BX
ZF=0则AX!=BX
SF=1则AX<BX
SF=0则AX>=BX
SF=0并ZF=0则AX>BX
SF=1或ZF=1则AX<=BX
CPU在执行cmp指令的时候,也包含两种含义:进行无符号运算和进行有符号数运算。
cmp ah,bh
如果ah=bh则ah-bh=0所以ZF=1
如果ah≠bh则ah-bh≠0所以ZF=0
所以我们根据cmp指令执行后ZF的值,就可以知道两个数据是否相等。如果ah<bh则可能发生什么情况呢?
对于有符号数运算,在ah<bh情况下,ah-bh显然可能引起SF=1既结果为负比如:
ah=1,bh=2则ah-bh=0FFH,0FFH为-1的补码,因为结果为负,所以SF=1。
ah=0FEH,bx=OFFH;则ax-bx=-2-(-1)=OFFH,因为结果为负,所以SF=1。
扩展资料:
汇编语言的常用指令集如下:
数据传送指令集
MOV
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
XCHG
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m
PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH操作数POP 操作数
格式: PUSH r PUSH M PUSH data POP r POP m
PUSHF,POPF,PUSHA,POPA
功能:堆栈指令群
格式: PUSHF POPF PUSHA POPA
LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m LDS r,m LES r,m
XLAT(XLATB)
功能:查表指令
语法: XLAT XLAT m
算术运算指令
ADD,ADC
功能: 加法指令
语法: ADD OP1,OP2 ADC OP1,OP2
格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
影响标志: C,P,A,Z,S,O
SUB,SBB
功能:减法指令
语法: SUB OP1,OP2 SBB OP1,OP2
格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data
影响标志: C,P,A,Z,S,O
INC,DEC
功能: 把OP的值加一或减一
语法: INC OP DEC OP
格式: INC r/m DEC r/m
影响标志: P,A,Z,S,O
NEG
功能: 将OP的符号反相(取二进制补码)
语法: NEG OP
格式: NEG r/m
影响标志: C,P,A,Z,S,O
MUL,IMUL
功能: 乘法指令
语法: MUL OP IMUL OP
格式: MUL r/m IMUL r/m
影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)
DIV,IDIV
功能:除法指令
语法: DIV OP IDIV OP
格式: DIV r/m IDIV r/m
CBW,CWD
功能:有符号数扩展指令
语法: CBW CWD
AAA,AAS,AAM,AAD
功能: 非压BCD码运算调整指令
语法: AAA AAS AAM AAD
影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)
参考资料来源:百度百科-CMP指令
例: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
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
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