彙編--串傳送指令 MOVS

小小可發表於2020-05-06

題目

在資料段中有一個字串,其長度為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 協議》,轉載必須註明作者和本文連結

相關文章