串操作指令(MOVS/CMPS/SCAS/LODS/STOS)的使用:
1.串传送指令
使用
上述三种格式的串传送指令在执行前都需要预先设置地址指针DS:SI和ES:DI,设置传送方向,如果要重复执行,
还需把重复次数放入CX并使用重复前缀。
MOVS指令常与重复前缀REP联合使用,以简化程序,提高程序运行速度。
将2000H:1200H地址开始的200个字节传送到6000H:2000H开始的存储单元中。
程序段如下:
MOV AX,2000H
MOV DS,AX ;设置源串段地址
MOV AX,6000H
MOV ES,AX ;设置目的串段地址
MOV SI,1200H ;设置源串偏移地址
MOV DI,2000H ;设置目的串偏移地址
MOV CX,100 ;串长度送CX
CLD ;DF←0,方向为从低地址到高地址
REP MOVSB ;每次传送一个字节,并自动修改地址指针及CX内容
;若修改后CX≠0就重复执行
2.串比较指令CMPS
比较字符串STR1和字符串STR2是否相同,如果不同,将STR1中不相等字符的地址送BX。两个字符串的长度均为200个字节。
程序如下:(假定DS和ES已设置好)
LEA SI,STR1 ;SI←源串首地址
LEA DI,STR2 ;DI←目的串首地址
MOV CX,200 ;CX←串长度
CLD ;DF←0,增地址方向
REPZ CMPSB ;对两个串逐个字符进行比较,直到遇到不同的字符或比较完
JZ STOP ;若所有字符都相同,则转STOP
DEC SI ;否则,使SI指向不相等的字符(CMPS指令已对SI自动加1)
MOV BX,SI ;BX←不相等单元的地址
STOP:
3.串扫描指令SCAS
从ES:2000H单元开始存放了一个长度为100的字符串,寻找其中有无字符“S”。若有则记下扫描次数(次数放CNT单元),并记下存放“A”的地址(地址放ADDR单元)。程序段如下:
MOV DI,2000H ;DI←目的串首地址
MOV CX,100 ;CX←串长度
MOV AL,"S" ;AL←关键字“S”
CLD ;DF←0,增地址方向
REPNZ SCASB ;扫描字符串,直到找到“S”或扫描结束
JZ FOUND ;若找到则转移
MOV DI,0 ;没找到,使DI=0
JMP DONE
FOUND:DEC DI ;使DI指向找到的“S”字符(SCAS指令已对DI自动加1)
MOV ADDR,DI ;将“S”字符的地址送ADDR单元
SUB DI,2000H ;用“S”字符的地址减去首地址得到扫描次数
DONE:MOV CNT,DI ;将搜索次数送CNT单元
4.串装入指令LODS
. 使用
上述三种格式的串装入指令在执行前都需要预先设置源串指针DS:SI和方向标志DF。LODS指令一般不使用重复前缀,因为每重复一次AL或AX中内容将被后一次所装入的字符所取代,前一次装入的内容被覆盖。
以MEM1为首地址的存储器中有10个字节数据,编写程序将这10个数都乘2。
(假定DS已设置好)
LEA SI,MEM1 ;SI←源串首地址
MOV CX,10 ;CX←串长度
CLD ;DF←0
NEXT:LODSB ;取一个数据到AL
ADD AL,AL ;乘2
MOV [SI-1],AL ;存回去 ;SI需要减一切记
DEC CX ;CX←CX-1
JNZ NEXT ;CX≠0则继续
5.串存储指令STOS
使用
上述三种格式的串存储指令在执行前都需要预先设置AL(或AX)、目的串指针DS:SI和方向标志DF。利用重复前缀REP,可对连续的存储单元写入相同的值。
本指令常用于对某一存储区域进行初始化(初值在放AL(AX)中)。
把6000H:1200H开始的100个字节存储单元全部设置为55H。
MOV AX,6000H
MOV ES,AX ;ES←目的串的段地址
MOV DI,1200H ;DI←目的串的偏移地址
MOV CX,100 ;CX←串长度
CLD ;DF←0,增地址方向
MOV AL,55H ;AL←55H
REP STOSB ;将100个单元都写入55H