回覆列表
  • 1 # 滴逃逃

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

  • 中秋節和大豐收的關聯?
  • 桑德斯退選訊息是否屬實。如屬實,該如何看待?