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