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

本文为个人学习笔记

  • 5
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值