以字节、字和双字为单位的多个数据存放在连续的主存区域中就形成数据串,即数组
串传送指令
1.串传送指令MOVS将数据段中的字节、字或双字数据传送至ES指向的段
movsb ;字节串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±1,EDI=EDI±1
movsw ;字串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±2,EDI=EDI±2
movsd ;双字串传送:ES:[EDI]=DS:[ESI];然后:ESI=ESI±4,EDI=EDI±4
2.串存储指令STOPS将AL、AX、EAX的内容存入ES指向段
stopsb ;字节串传送:ES:[EDI]=AL;然后:EDI=EDI±1
stopsw ;字串传送:ES:[EDI]=AX;然后:EDI=EDI±2
stopsd ;双字串传送:ES:[EDI]=EAX;然后:EDI=EDI±4
3.串读取指令LODS将数据段中的字节、字或双字数据读到AL、AX、EAX
lodsb ;字节串读取:AL=DS:[ESI];然后:ESI=ESI±1
lodsw ;字串读取:AX=DS:[ESI];然后:ESI=ESI±2
lodsd ;双字串读取:EAX=DS:[ESI];然后:ESI=ESI±4
4.重复前缀指令REP用在MOVS、STOPS、LODS指令前,利用计数器ECX保存数据串长度,可以理解为“若数据串没有结束(ECX≠0),则继续传送”
字符串复制程序
;eg3.16.asm in windows Console
include io32.inc
.data
srcmsg byte ‘In a major matter,no details are small.’,0
destmsg byte (lengthof srcmsg) dup(0) ;定义destmsg 使之与 srcmsg 的长度相同
.code
start:
mov esi,offset srcmsg ;esi=srcmsg第一个字符
mov edi,offset destmsg ;edi=destmsg第一个字符
mov ecx,lengthof srcmsg ;ecx=srcmsg长度(即要重复的次数)
cld ;地址增量传送(设置DF=0 方向标志) byte时指针一次+1 word时指针一次+2 dword时指针一次+4(地址减量指令是std)
rep movsb ;movs 串传送指令 movsb byte型 rep:重复前缀,使用ecx来设置重复次数
mov eax,offset destmsg
call dispmsg ;显示destmsg
exit 0
end start
串检测指令
1.串比较指令CMPS用源操作数减去目的数据串,以比较两者之间的关系
CMPSB:字节串比较 DS:[esi]-ES:[edi] 然后esi=esi±1,edi=edi±1
CMPSW:字串比较
CMPSD:双字串比较
2.串扫描指令SCAS用AL、AX、EAX的内容减去目的数据串,比较两者间的关系
SCASB:字节串扫描
SCASW:字节串扫描
SCASD:字节串扫描
3.重复前缀指令REPE或REPZ 判断字符串是否相等
4.重复前缀指令REPNE或REPNZ,判断字符串是否不相等
等长字符串比较程序