目录
串传送指令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(对于字串)
4.数据块长度值有CX指定
串传送指令:MOVS
作用:把字节/子操作数从主存的源地址传送至目的地址
;使用格式,指令包括MOVSB,MOVSW
movsb ;字节串传送 ES:[DI]<-DS:[SI]
;DF==0 ,SI<-SI+1,DI<-DI+1,
;DF==1 ,SI<-SI-1,DI<-DI-1
movsw ;字串传送 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 ;传送次数减1
jnz again ;判断传送次数cx是否为0,不为0则到
again位置执行指令,否则结束
在使用串操作指令前,需要提前将DS,ES,SI,DI, CX, DF设置好
串存储指令STOS
作用:把AL或AX的数据传送至目的地址
;使用格式,指令包括 STOSB,STOSW
STOSB ;字节串存储:ES:[DI]<-AL
;DI<-DI+1
STOSW ;字串存储: ES:[DI]<-AX
;DI<-DI+2
egl.
mov ax,0
mov di,0
mov cx,8000h ;cx<-传送次数(32x1024)
cld ;DF=0,地址增加
again: stosw ;传送一个字
dec cx ;传送次数减1
jnz again ; 传送次数cx是否为0
串读取指令LODS
作用:将字节/字从数据段中读取出来保存在AL或者AX中
;使用格式,指令包括LODSB,LODSW
LODSB ;字节串存储:AL<-DS:[SI]
;SI<-SI+-1
LODSW ;字串存储:AX<-DS:[SI]
;SI<-SI+-2
mov si , offset block
mov 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,CMPSW
CMPSB ;字节串比较:DS:[SI]-ES:[DI]
;SI<-SI+-1,DI<-DI+-1
CMPSW ;字串比较 DS:[SI]-ES:[DI]
;SI<-SI+-2,DI<-DI+-2
串扫描指令SCAS
;使用格式,指令包括SCASB,SCASW
SCASB ;字节串比较 AL-ES:[DI]
;DI<-DI+-1
SCASW ;字串比较 AX-ES:[DI]
;DI<-DI+-2
egl.
mov di,offset string
mov al,20h ;空格对应的ASCII码为20
mov cx,count
cld
again scasb ;搜索
jz found ;为0(ZF=1),发现空格
dec cx ;不是空格
jnz again ;搜索下一个字符
found: .... ;不含空格,则继续执行
重复前缀指令REP
重复前缀REP可以加到串传送操作指令。REP前缀是每次执行串指令后CX-1,CX-1后,重复执行串指令,知道CX值为0时,指令才终止。
;使用示例 REP,REPZ,REPNZ,REPE,REPNE
rep movsx ;无条件重复直到cx==0
repz cmpsx ;无条件重复直到cx==0 / ZF==0
repnz cmpsx ;无条件重复直到cx==0 /zf==1
repe cmpsx ;不断比较,直到cx==0 / zf==0
repne cmpsx ;不断比较,直到cx==0 / zf==1
egl.
mov si,offset source
mov di,offset destination
mov cx,100 ;cx<-传送次数
cld
rep movsb
;____________$$$_____________
mov si,offset string1
mov di,offset string2
mov cx,count
cld
repz cmpsb ;重复比较前两个字符
jnz unmat ;字符串不等,转移到unmat
mov al,0 ;字符串相等,设置00h
jmp output ;跳转到output
unamt: mov al,0ffh ;设置ffh,被jnz跳转到
output: mov result,al ;输出结果标记,被jmp跳转到
今天的文章
串操作指令详解 MOVS,LODS,STOS,CMPS,SCAS,REP分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/4007.html