CMP OPR1 , OPR2指令只是对操作数OPR1 , OPR2之间运算比较,不保存结果。指令本身不进行跳转,只是根据结果设置相关的条件标志位(SF、ZF、CF、OF),CMP指令后往往跟着条件转移指令,实现根据比较的结果产生不同的程序分支的功能。
格式:CMP OPR1 , OPR2
执行操作:(OPR1)-(OPR2)
功能:该指令与SUB指令一样执行减法的操作,但它并不保存运算结果,只是根据结果设置相关的条件标志位(SF、ZF、CF、OF)。CMP指令后往往跟着条件转移指令,实现根据比较的结果产生不同的程序分支的功能。
扩展资料:
跳转相关的条件跳转指令:
1、JA/JNBE DEST指令:转移条件是CF=0 AND ZF=0,含义是无符号数A>B,英文表示是JMP above (not below or equal)。
2、JAE/JNB DEST指令:转移条件是CF=0,含义是无符号数A≥B,英文表示是JMP above or equal (not below )。
3、JB/JNAE DEST指令:转移条件是CF=1,含义是无符号数A<B,英文表示是JMP blow (not above or equal)。
4、JBE/JNA DEST指令:转移条件是CF=1 OR ZF=1,含义是无符号数A≤B,英文表示是JMP blow or equal (not above)。
参考资料来源:百度百科-CMP指令
参考资料来源:百度百科-条件转移指令
CMP R0,#0:比较R0是否为0
CMPNE R1,#1 :若R0不为0,则比较R1是否为1;如果R0=0则跳过下面这两句;
ADDEQ R2,R0,R1:若R0不为0且R1为1,则执行 R2 = R0+R1;否则继续往下执行
CMP是比较指令。这个就是十进制常数2010与寄存器D10中的数据进行比较。
当K2010大于D10时,M10为ON
当K2010等于D10时,M11为ON
当K2010小于D10时,M12为ON
望采纳。。。。。。
CMP是比较指令,用于16位数据比较,比较的数据范围是-32768到+32767,比较数据类型可以是常熟K,H等,可以是数据寄存器D,也可以是计数器C,可以是时间继电器T,还可以是连续的位址(如K1X0,K2Y0,K3M0,K2S0等)。
指令用法如下:
CMP D0 D2 M0
该指令为比较指令,将比较的结果<,=,>三种结果分别告知给M0,M1,M2。
如果D0>D2,M0=1
如果D0=D2,M1=1
如果D0<D2,M2=1
所以使用这个指令会连续占用以M0为首的三个连续的位地址。
另外,若比较数据范围大于65535,请使用DCMP,这个是双字比较指令,用法和CMP一样,只不过比较的数据都是双字32位数据,所以使用时不要出现
DCMP D0 D1 M0
(转自百度知道)
格式:CMP OPRT1,OPRT2
功能:OPRT1-OPRT2
说明:OPRT1和OPRT2可以是寄存器或存储器,但不能同时为存储器,OPRT2还可以为立即数。
举例:CMP AL,BL
CMP AL,[2000H]
CMP AL,12H
三菱plc的CMP指令意思就是单芯片多处理器指令,可以将对称多处理器集成到同一芯片内,各个处理器并行执行不同的进程。
CMP指令下的结构被设计拥有多个处理器核,每个核都比较简单,有利于优化设计,因此在一定程度上更具发展前途。
据了解,IBM的Power4芯片和Sun的MAJC5200芯片都采用了CMP指令,从而会在处理器内部共享缓存,提高缓存利用率,同时简化其中设计的复杂度。
扩展资料
CMP指令的相关流程
1、打开三菱plc的主界面,需要在左母线右侧梯形图输入LD X0。
2、下一步,继续在X0的触点后梯形图输入CMP D0 D1 Y0。
3、这个时候如果没问题,就分别按转换按钮编译和按模拟按钮仿真。
4、这样一来会得到图示的结果,即可使用CMP指令了。
参考资料来源:百度百科-三菱plc
参考资料来源:百度百科-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
CF=1则AX<BX
CF=0则AX>=BX
CF=0并ZF=0则AX>BX
CF=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。
再看两个例子:
ah=22H,bh=OAOH则ah-bh=34-(-96)=82H,82H是-126的补码。
所以SF=1。这里虽然SF=1,但是并不能说明ah<bh因为显然34>-96
两个有符号数A和B相减,得到的是负数,那么可以肯定A<B这个思路没有错误,关键在于我们根据什么来断定得到的是一个负数,CPU将cmp指令得到的结果记录在flag的相关标志位中,我们可以根据指令执行后,相关标志位的值来判断比较的结果。单纯的考察SF的值不可能知道结果的正负。因为SF记录的只是可以在计算机中存放的相应位数的正负,cmpah,bh执行后,SF记录的是ah-bh所得到的8位结果数据的正负,虽然这个结果没有在我们能够使用的寄存器或内存单元中保存,但是在指令执行的过程中,它暂存在cpu内存的暂存器中。
所得到的相应结果的正负,并不能说明,运算所应该得到的结果的正负。这是因为在运算的过程中可能发生溢出。如果这样的情况发生,那么SF的值就不能说明任何问题。比如
mov ah,22H
mov bh,0A0H
subah,bh
结果SF=1运算实际得到的结果是ah=82H,但是在逻辑上,运算所应该得到的结果是34-(-96)=130就是因为130这个结果作为一个有符号Y数超出了-128~127这个范围,在ah中不能表示,而ah中的结果被CPU当作有符号数解释为-126。而SF被用来记录这个实际结果的正负所以SF=1
又比如
mov ah,0A0H
mov bh,0CBH
cmp ah,bh
结果SF=1,运算ah-bh实际得到的结果是D5H但是在逻辑上,运算所应该得到的结果是160- -53=213,(隐身人注:对于有符号数,方位是-128--127。所以这里正确是:(-96)-(-53)=-43,得到值为:0D5H,这里SF标志位指示并没错)SF记录实际结果的正负,所以SF=1。但SF=1不能说明在逻辑上运算所得到的正确结果。
但是逻辑上的结果的正负才是cmp指令所求的真正结果,因为我们就是要靠它得到两个操作对象的比较信息。所以cmp所做的比较结果,不是仅仅靠SF就能记录的,因为它只能记录实际结果的正负。
我们考虑下,两种结果之间的关系,实际结果的正负,和逻辑上真正结果的正负,它们之间有多大的距离呢?总上面的分析中我们知道,实际结果的正负,之所以不能说明逻辑上真正结果的正负,关键的原因在于发生了溢出。如果没有溢出发生的话,那么,实际结果的正负和逻辑上真正结果的正负就一致了。
所以我们应该在考察SF的同时考察OF就可以得知逻辑上真正结果的正负同时就可以知道斤毫秒度的结果。
下面我们以cmpah,bh为例总结一下CPU执行cmp指令后SF和PF的值的如何来说明比较的结果的:
1)如果SF=1而OF=0说明没有溢出逻辑上真正结果的正负=实际结果的正负,因实际结果为负所以逻辑上真正的结果为负则ah<bh
2)如果SF=1而OF=1说明实际结果为负并且有溢出,则实际结果和真正结果不等,因SF=1实际结果为负。则:如果因为溢出导致了实际结果为负。那么逻辑上真正的结果必然为正。ah<bh
3)如果SF=0而OF=1说明实际结果为正并且有溢出,则实际结果和真正结果不等,因SF=0,实际结果非负。则:如果因为溢出导致了实际结果为正,那么逻辑上真正的结果必然为负。这样说明ah<bh
4)如果SF=0而OF=0说明没有溢出,逻辑上真正结果的正负=实际结果的正负,因SF=0实际结果非负,所以逻辑上真正的结果非负,所以ah>=bh
以上就是关于汇编语言中,cmp指令怎么用比如cmp ax,bx ax大于bx怎么跳转,小于又怎么跳,等于呢全部的内容,包括:汇编语言中,cmp指令怎么用比如cmp ax,bx ax大于bx怎么跳转,小于又怎么跳,等于呢、谁能告诉我下面的指令是什么意思 CMP R0,#0 CMPNE R1,#1 ADDEQ R2,R0,R1、plc指令CMP k2010 d10 m10是啥意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!