汇编--串传送指令 MOVS
题目
在数据段中有一个字符串,其长度为17,要求把它们转送到附加段中的一个缓冲区中,应该怎么做呢
显然这个题要使用串传送指令MOVS,MOVS每次传送的是一个字节/字,因此需要重复执行串传送指令才能完成一个数据串的传送,即是使用 REP MOVS 指令
执行 REP MOVS指令前,应先做好:
把原串首地址送给SI寄存器
把目的串首地址送给DI寄存器
把数据串长度放入CX计数寄存器
设置方向标志DX(CLD/STD)
代码:
data segment
mess1 db 'personal_computer'
data ends
extra segment
mess2 db 17 dup(?) ;开辟17个连续的字节单元,但是里面没有内容
extra ends
code segment
assume cs:code,ds:data,es:extra ;这是一条伪指令
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
lea si,mess1 ;原串首地址送给si
lea di,mess2 ;目的串首地址送给di
mov cx,17 ;传送次数
cld ;地址递增
rep movsb ;完成串传送,movsb是以字节方式进行传送
mov ah,4ch
int 21h
code ends
end start
怎么按照地址减小的方向来传送呢?这时需要修改的地方如下:
lea si,mess1+16 ;原串末地址送给si
lea di,mess2+16 ;目的串末地址送给di
mov cx,17
std ;地址递减
rep movsb
能不能把原串和目的串放在同一个段来处理呢?
方式1:段共用,数据段和附加段共用同一个段。段是可以共用的,但是共用的前提是数据没有冲突,可以看到这里并没有冲突
data segment
mess1 db 'personal_computer'
mess2 db 17 dup(?) ;开辟17个连续的字节单元,但是里面没有内容
data ends
code segment
assume cs:code,ds:data,es:data ;这是一条伪指令
start:
mov ax,data
mov ds,ax
mov es,ax
lea si,mess1 ;原串首地址送给si
lea di,mess2 ;目的串首地址送给di
mov cx,17 ;传送次数
cld ;地址递增
rep movsb ;完成串传送,movsb是以字节方式进行传送
mov ah,4ch
int 21h
code ends
end start
方式2:把原串和目的串都放在附加段,这时要格外注意修改段跨越前缀
data segment
data ends
extra segment
mess1 db 'personal_computer'
mess2 db 17 dup(?) ;开辟17个连续的字节单元,但是里面没有内容
extra ends
code segment
assume cs:code,ds:data,es:extra ;这是一条伪指令
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax
lea si,mess1 ;原串首地址送给si
lea di,mess2 ;目的串首地址送给di
mov cx,17 ;传送次数
cld ;地址递增
rep movsb es:byte ptr[di],es:[si]
;完成串传送,movsb是以字节方式进行传送
mov ah,4ch
int 21h
code ends
end start
本文为个人学习笔记
本作品采用《CC 协议》,转载必须注明作者和本文链接