先說說MOVSB(MOVe String Byte):即字串傳送指令,這條指令按位元組傳送資料。透過SI和DI這兩個暫存器控制字串的源地址和目標地址,比如DS:SI這段地址的N個位元組複製到ES:DI指向的地址,複製後DS:SI的內容保持不變。
而REP(REPeat)指令就是“重複”的意思,術語叫做“重複字首指令”,因為既然是傳遞字串,則不可能一個字(節)一個字(節)地傳送,所以需要有一個暫存器來控制串長度。這個暫存器就是CX,指令每次執行前都會判斷CX的值是否為0(為0結束重複,不為0,CX的值減1),以此來設定重複執行的次數。因此設定好CX的值之後就可以用REP MOVSB了。
CLD(CLear Direction flag)則是清方向標誌位,也就是使DF的值為0,在執行串操作時,使地址按遞增的方式變化,這樣便於調整相關段的的當前指標。這條指令與STD(SeT Direction flag)的執行結果相反,即置DF的值為1。
;example:把當前資料段中偏移1000H開始
;的100個位元組資料傳送到偏移2000H開始的
;單元中
cld ;指標增值
push DS ;當前資料段,因此壓入棧中儲存
pop ES ;使ES=DS
mov SI,1000H ;源串指標初值
mov DI,2000H ;目的串指標初值
mov CX,100 ;迴圈次數
Next:
lodsb ;取一個位元組
stosb ;存一個位元組
loop Next ;迴圈CX次
;以下程式片段與上面的等價:
cld ;地址指標增值
……
mov CX,100 ;迴圈CX次
movsb ;每次傳送一位元組資料
loop Next
;或者用更簡單的寫法:
cld
mov CX,100
rep movsb
先說說MOVSB(MOVe String Byte):即字串傳送指令,這條指令按位元組傳送資料。透過SI和DI這兩個暫存器控制字串的源地址和目標地址,比如DS:SI這段地址的N個位元組複製到ES:DI指向的地址,複製後DS:SI的內容保持不變。
而REP(REPeat)指令就是“重複”的意思,術語叫做“重複字首指令”,因為既然是傳遞字串,則不可能一個字(節)一個字(節)地傳送,所以需要有一個暫存器來控制串長度。這個暫存器就是CX,指令每次執行前都會判斷CX的值是否為0(為0結束重複,不為0,CX的值減1),以此來設定重複執行的次數。因此設定好CX的值之後就可以用REP MOVSB了。
CLD(CLear Direction flag)則是清方向標誌位,也就是使DF的值為0,在執行串操作時,使地址按遞增的方式變化,這樣便於調整相關段的的當前指標。這條指令與STD(SeT Direction flag)的執行結果相反,即置DF的值為1。
;example:把當前資料段中偏移1000H開始
;的100個位元組資料傳送到偏移2000H開始的
;單元中
cld ;指標增值
push DS ;當前資料段,因此壓入棧中儲存
pop ES ;使ES=DS
mov SI,1000H ;源串指標初值
mov DI,2000H ;目的串指標初值
mov CX,100 ;迴圈次數
Next:
lodsb ;取一個位元組
stosb ;存一個位元組
loop Next ;迴圈CX次
;以下程式片段與上面的等價:
cld ;地址指標增值
……
mov CX,100 ;迴圈CX次
Next:
movsb ;每次傳送一位元組資料
loop Next
;或者用更簡單的寫法:
cld
……
mov CX,100
rep movsb