汇编语言中的串传送指令

时间:2022-01-11 12:03:02

串传送指令是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

运行结果是一样的:

汇编语言中的串传送指令