Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ

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 标号;
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值