将一个字符串复制给另一个字符串,我们可以逐个访问数组并进行逐个地赋值到新的数组中。但我们今天要介绍的是串指令。
MOVSB|MOVSW|MOVSD
;串传送:ES:[EDI]←DS:[ESI]
;然后:ESI←ESI±1/2/4,EDI←EDI±1/2/4REP
;执行一次串指令,ECX减1;直到ECX=0
下面是源程序:
;功能:复制字符串
;作者:王文堃
;创建时间:2016/4/19
INCLUDE vcIO.inc
.data
srcmsg BYTE 'My name is Nick, and my major is computer science',0ah,0
destmsg BYTE (lengthof srcmsg) dup(0)
str_output BYTE "%s",0
.code
main PROC
mov esi, offset srcmsg
mov edi, offset destmsg
mov ecx, lengthof srcmsg
cld ;地址增量传送
rep movsb ;rep执行一次串指令后ecx减一
invoke printf, offset str_output, offset destmsg
ret
main ENDP
;子程序
END main
其中destmsg BYTE (lengthof srcmsg) dup(0)的意思是:在数据段申请一个byte型的数据,它的长度为srcmsg这个数组的长度,内容用重复的0初始化。
其中offset是取字符串的首地址,类似于c语言的‘&’
cld表示字符串的操作从低地址向高地址操作
std相反,从高地址到地地址rep movsb是进行字符串的复制工作。
其中movsb是一个串操作,将[esi]的内容复制到[edi]中去
rep调用一次movsb就将ecx减1,当ecx为0时停止
这一句也可以用一下代码实现:
again:
movsb
loop again