汇编--串传送指令 MOVS

题目

在数据段中有一个字符串,其长度为17,要求把它们转送到附加段中的一个缓冲区中,应该怎么做呢

CmUxVaNZpm.png!large 显然这个题要使用串传送指令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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!