我是靠谱客的博主 柔弱电话,最近开发中收集的这篇文章主要介绍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 标号;
}

最后

以上就是柔弱电话为你收集整理的Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ的全部内容,希望文章能够帮你解决Win-MASM64汇编语言-CMP/CMPSB/CMPSW/CMPSD/JNE/JCXZ所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部