先說說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