串传送指令是movsb和movsw
这个两个指令的区别就是movsb是按字节传送的,movsw是按字传送的,所以下面以movsb举例
movsb就是:将ds:[si]为首地址所指的字符串移动到es:[di]为首地址所指的空间中,就是说:mov es:[di], ds:[si]
然后就是判断标志位的DF标志,如果是0,那么需要进行:inc si
inc di
如果是1,那么需要进行:dec si
dec di
另外还有一个和这两个指令配合使用的指令,就是rep指令
rep movsb
可以等价于:
s: movsb
loop s
下面以一个例子来认识:
例子是将data中0~15的字符串复制到16~31的位置
代码:
assume cs:code, ds:data
data segment
db 'Welcome to masm!'
db 16 dup(0)
data ends
code segment
start:mov ax, data
mov ds, ax
mov ax, data
mov es, ax
mov si, 0 ;由于movsb相当于是将ds:[si]复制给es:[di],所以先要确定si和di的值
mov di, 16
mov cx, 16 ;设置cx,决定rep movsb指令的循环次数,就是要传送的字节数
cld ;将DF位设置为0
rep movsb ;等价于:s:movsb loop s
mov ax, 4C00H
int 21H
code ends
end start
运行结果:
因为rep movsb的指令可以写为
s: movsb
loop s
所以还可以改一下:
assume cs:code, ds:data
data segment
db 'Welcome to masm!'
db 16 dup(0)
data ends
code segment
start:mov ax, data
mov ds, ax
mov ax, data
mov es, ax
mov si, 0 ;由于movsb相当于是将ds:[si]复制给es:[di],所以先要确定si和di的值
mov di, 16
mov cx, 16 ;设置cx,决定rep movsb指令的循环次数,就是要传送的字节数
cld ;将DF位设置为0
s:movsb ;等价于:s:movsb loop s
loop s
mov ax, 4C00H
int 21H
code ends
end start
运行结果是一样的: