失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 串操作指令详解 MOVS LODS STOS CMPS SCAS REP

串操作指令详解 MOVS LODS STOS CMPS SCAS REP

时间:2021-07-26 11:13:12

相关推荐

串操作指令详解  MOVS LODS STOS CMPS SCAS REP

目录

串传送指令MOVS

串存储指令STOS

串读取指令LODS

串比较指令CMPS

串扫描指令SCAS

重复前缀指令REP

指令包括:MOVS,LODS,STOS,CMPS,SCAS,REP

串的概念

串是连续存放再内存中的字节块或字块。每个串有一个起始地址和长度, 待操作的数据串称为源串,目的地址称为目标串

串指令操作的特点

1.源操作数用寄存器SI寻址,默认的数据段DS

中,但允许段超越:DS:[SI]

2.目的操作数用寄存器DI寻址,默认在附加段

ES中,不允许段超越:ES:[DI]

3.每执行一次串操作指令,SI和DI将自动修

改:±1(对于字节串)或±2(对于字串)

执行指令CLD后,DF=0,地址指针增加1或2

执行指令STD后,DF=1,地址指针减1或2

4.数据块长度值有CX指定

串传送指令:MOVS

作用:把字节/子操作数从主存的源地址传送至目的地址

;使用格式,指令包括MOVSB,MOVSWmovsb ;字节串传送 ES:[DI]<-DS:[SI];DF==0 ,SI<-SI+1,DI<-DI+1,;DF==1 ,SI<-SI-1,DI<-DI-1movsw ;字串传送ES:[DI]<-DS:[SI];DF==0 ,SI<-SI+2,DI<-DI+2;DF==1 ,SI<-SI-2,DI<-DI-2

egl.

mov si,offset source ;获取源偏移地址mov di,offset destination ;获取目的偏移地址mov cx,100;cx<-传送次数cld;置DC=0,地址增加again:movsb ;传送一个字节dec cx ;传送次数减1jnz again ;判断传送次数cx是否为0,不为0则到again位置执行指令,否则结束

在使用串操作指令前,需要提前将DS,ES,SI,DI, CX, DF设置好

串存储指令STOS

作用:把AL或AX的数据传送至目的地址

;使用格式,指令包括 STOSB,STOSWSTOSB ;字节串存储:ES:[DI]<-AL;DI<-DI+1STOSW ;字串存储: ES:[DI]<-AX;DI<-DI+2

egl.

mov ax,0mov di,0 mov cx,8000h ;cx<-传送次数(32x1024)cld ;DF=0,地址增加again: stosw ;传送一个字 dec cx ;传送次数减1 jnz again ; 传送次数cx是否为0

串读取指令LODS

作用:将字节/字从数据段中读取出来保存在AL或者AX中

;使用格式,指令包括LODSB,LODSWLODSB ;字节串存储:AL<-DS:[SI] ;SI<-SI+-1LODSW ;字串存储:AX<-DS:[SI] ;SI<-SI+-2

mov si , offset blockmov di , offset dplus mov bx , offset dminus mov ax , ds mov es , ax ;数据都在一个段中,所以设置 es = ds mov cx , count ; cx <﹣字节数 cld go _ on : lodsb ;从 block 取出一个数据test al ,80h ;检测符号位,判断是正是负 jnz minus ;符号位为1,是负数,转向 minus stosb ;符号位为0,是正数,存入 dplus jmp again ;程序转移到 again 处继续执行 jnz go _ on ;完成正负数据分离

串比较指令CMPS

作用: 将主存中的源操作数减去目的操作数,以便设置标志,进而比较两操作数之间的关系

;使用格式,指令包括 CMPSB,CMPSWCMPSB ;字节串比较:DS:[SI]-ES:[DI];SI<-SI+-1,DI<-DI+-1CMPSW ;字串比较 DS:[SI]-ES:[DI];SI<-SI+-2,DI<-DI+-2

串扫描指令SCAS

;使用格式,指令包括SCASB,SCASWSCASB ;字节串比较 AL-ES:[DI];DI<-DI+-1SCASW ;字串比较 AX-ES:[DI];DI<-DI+-2

egl.

mov di,offset stringmov al,20h ;空格对应的ASCII码为20mov cx,count cldagain scasb ;搜索jz found ;为0(ZF=1),发现空格dec cx ;不是空格jnz again ;搜索下一个字符found: .... ;不含空格,则继续执行

重复前缀指令REP

重复前缀REP可以加到串传送操作指令。REP前缀是每次执行串指令后CX-1,CX-1后,重复执行串指令,知道CX值为0时,指令才终止。

;使用示例 REP,REPZ,REPNZ,REPE,REPNErep movsx ;无条件重复直到cx==0repz cmpsx ;无条件重复直到cx==0 / ZF==0repnz cmpsx ;无条件重复直到cx==0 /zf==1repe cmpsx ;不断比较,直到cx==0 / zf==0repne cmpsx ;不断比较,直到cx==0 / zf==1

egl.

mov si,offset sourcemov di,offset destinationmov cx,100 ;cx<-传送次数cldrep movsb;____________$$$_____________mov si,offset string1mov di,offset string2mov cx,countcldrepz cmpsb ;重复比较前两个字符jnz unmat ;字符串不等,转移到unmatmov al,0 ;字符串相等,设置00hjmp output ;跳转到outputunamt: mov al,0ffh ;设置ffh,被jnz跳转到output: mov result,al ;输出结果标记,被jmp跳转到

如果觉得《串操作指令详解 MOVS LODS STOS CMPS SCAS REP》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。