概述
CMP
格式:cmp a,b
本质上是将a减b,但是并不修改a和b本身,而是会修改下面3个标志位
ZR(ZF)结果为0,则ZF=1
CF(CY)进位或者借位,则CY=1
OF(OV)溢出,则OV=1
cmp只能用于整数比较(字符串也是整数)
示例1:将ZR(ZF)置1
mov eax,1
mov ebx,1
cmp eax,ebx;走完此行代码ZF=1
示例2:将CF(CY)置1
mov eax,1
mov ebx,2
cmp eax,ebx;1-2发生了借位,所以走完此行代码CY=1
示例3:将OF(OV)置1
我也不会。。。。
CMPSB
字符串比较,将ESI指向的内存,与EDI指向的内存比较,具体比较多长的数据,取决于ECX和指令单位B,CMPSB中的B表示byte,如果ECX中的数据是N,则比较N个字节
指令名称 | 条件 |
---|---|
REPZ/REPE | 依次对比每一位,当遇到不同,或者ECX=0,则计算结果 |
REPNZ/REPNE | 依次对比每一位,当遇到相同,或者ECX=0,则计算结果 |
示例4:前三位相同就将ZF置1
.data
s1 byte "abc1"
s2 byte "abc2"
.code
mov esi,offset s1
mov edi,offset s2
mov ecx,3
;repz本质就是判断每个位是否相同,如果遇见了不同,就没必要继续
;比较下去了,直接将ZF置0,否则就一直比较,直到ECX=0
repz cmpsb
CMPSW
与CMPSB相同,不过单位不一样,W表示2个字节,如果ECX中是N,则比较2N长度的字节
CMPSD
与CMPSB相同,不过单位不一样,D表示4个字节,如果ECX中是N,则比较4N长度的字节
JNE
格式:jne address,其中address表示一个内存地址,如果ZF=0,则代码跳转到address处执行
示例5:如果s1和s2不相等,代码就跳转到aa:
处,注意因为第一个字母就不相等,根据repz语义,直接就将ZF=0,没必要再往下判断了
.data
s1 byte "abc1"
s2 byte "bbc2"
.code
mov esi,offset s1
mov edi,offset s2
mov ecx,4
repz cmpsb
jne aa
mov eax,111
aa:
mov eax,222
JCXZ
有条件转移指令,所有的有条件转移指令,都是短转移指令,短转移的特点是机器码中携带的是偏移长度,而不是目的地址,8086下对IP的修改范围-128到+127
当cx=0的时候,跳转到标号处,cx≠0时,等同于没写该指令(注意与loop不要记混了,loop是cx≠0才跳转到标号处)
逻辑上等同于下面代码
if(cx==0){
jmp short 标号;
}
最后
以上就是柔弱电话为你收集整理的Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ的全部内容,希望文章能够帮你解决Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复