REP/REPE/REPZ/REPNE/REPNZ - 重複字串操作字首

操作碼

指令

說明

F3 6C

REP INS r/m8, DX

將 (E)CX 個位元組從埠 DX 輸入到 ES:[(E)DI]

F3 6D

REP INS r/m16,DX

將 (E)CX 個字從埠 DX 輸入到 ES:[(E)DI]

F3 6D

REP INS r/m32,DX

將 (E)CX 個雙字從埠 DX 輸入到 ES:[(E)DI]

F3 A4

REP MOVS m8,m8

將 (E)CX 個位元組從 DS:[(E)SI] 移到 ES:[(E)DI]

F3 A5

REP MOVS m16,m16

將 (E)CX 個字從 DS:[(E)SI] 移到 ES:[(E)DI]

F3 A5

REP MOVS m32,m32

將 (E)CX 個雙字從 DS:[(E)SI] 移到 ES:[(E)DI]

F3 6E

REP OUTS DX,r/m8

將 (E)CX 個位元組從 DS:[(E)SI] 輸出到埠 DX

F3 6F

REP OUTS DX,r/m16

將 (E)CX 個字從 DS:[(E)SI] 輸出到埠 DX

F3 6F

REP OUTS DX,r/m32

將 (E)CX 個雙字從 DS:[(E)SI] 輸出到埠 DX

F3 AC

REP LODS AL

將 (E)CX 個位元組從 DS:[(E)SI] 載入到 AL

F3 AD

REP LODS AX

將 (E)CX 個字從 DS:[(E)SI] 載入到 AX

F3 AD

REP LODS EAX

將 (E)CX 個雙字從 DS:[(E)SI] 載入到 EAX

F3 AA

REP STOS m8

使用 AL 填寫位於 ES:[(E)DI] 的 (E)CX 個位元組

F3 AB

REP STOS m16

使用 AX 填寫位於 ES:[(E)DI] 的 (E)CX 個字

F3 AB

REP STOS m32

使用 EAX 填寫位於 ES:[(E)DI] 的 (E)CX 個雙字

F3 A6

REPE CMPS m8,m8

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢不匹配的位元組

F3 A7

REPE CMPS m16,m16

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢不匹配的字

F3 A7

REPE CMPS m32,m32

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢不匹配的雙字

F3 AE

REPE SCAS m8

從 ES:[(E)DI] 開始查詢非 AL 位元組

F3 AF

REPE SCAS m16

從 ES:[(E)DI] 開始查詢非 AX 字

F3 AF

REPE SCAS m32

從 ES:[(E)DI] 開始查詢非 EAX 雙字

F2 A6

REPNE CMPS m8,m8

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢匹配位元組

F2 A7

REPNE CMPS m16,m16

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢匹配字

F2 A7

REPNE CMPS m32,m32

在 ES:[(E)DI] 與 DS:[(E)SI] 中查詢匹配雙字

F2 AE

REPNE SCAS m8

從 ES:[(E)DI] 開始查詢 AL

F2 AF

REPNE SCAS m16

從 ES:[(E)DI] 開始查詢 AX

F2 AF

REPNE SCAS m32

從 ES:[(E)DI] 開始查詢 EAX

說明

按計數暫存器 ((E)CX) 中指定的次數重複執行字串指令,或是重複到 ZF 標誌不再滿足指定的條件。REP(重複)、REPE(相等時重複)、REPNE(不相等時重複)、REPZ(為零時重複)及 REPNZ(不為零時重複)助記符都是可以新增到一些字串指令中的字首。REP 字首可以新增到 INS、OUTS、MOVS、LODS 及 STOS 指令,REPE、REPNE、REPZ 及 REPNZ 字首可以新增到 CMPS 與 SCAS 指令。(REPZ 與 REPNZ 字首分別是 REPE 與 REPNE 字首的同義形式)。同非字串指令一起使用時,REP 字首的行為未定義。

REP 字首一次只能應用於一條字串指令。要重複指令塊,請使用 LOOP 指令或其它循環結構。

所有這些重複字首都會使關聯的指令重複執行,直到暫存器 (E)CX 中的計數遞減到 0(請參閱下表)。(如果目前地址大小屬性為 32,則將暫存器 ECX 用作計數器;如果大小屬性為 16,則將 CX 暫存器用作計數器)。在每次迭代之後,REPE、REPNE、REPZ 及 REPNZ 字首還會檢查 ZF 標誌的狀態,如果 ZF 標誌未處於指定的狀態,則終止重複循環。同時測試兩個終止條件時,終止重複的原因可以通過使用 JECXZ 指令來測試 (E)CX 暫存器進行確定,也可以通過使用 JZ、JNZ 及 JNE 指令來測試 ZF 標誌進行確定。

重複字首

終止條件 1

終止條件 2

REP

ECX=0

REPE/REPZ

ECX=0

ZF=0

REPNE/REPNZ

ECX=0

ZF=1

使用 REPE/REPZ 與 REPNE/REPNZ 字首時,由於 CMPS 與 SCAS 指令都會根據它們的比較結果設定 ZF 標誌,因此 ZF 標誌不需要初始化。

正在重複的字串操作可以因異常或中斷而暫停。發生這種情況時,將儲存暫存器的狀態,以便從異常或中斷處理程式返回時,字串操作能夠恢復。源暫存器與目標暫存器指向下一個要操作的字串元素,EIP 暫存器指向字串指令,ECX 暫存器儲存的是上一次成功迭代指令之後的值。通過此種機制,就可以執行很長的字串操作,而不會影響系統的中斷響應時間。

在執行以 REPE 或 REPNE 為字首的 CMPS 或 SCAS 指令期間,如果發生錯誤,EFLAGS 值還原為指令執行之前的狀態。由於 SCAS 與 CMPS 指令不會將 EFLAGS 用作輸入,因此,處理器可以在頁錯誤處理程式完成之後恢復執行指令。

謹慎使用 REP INS 與 REP OUTS 指令。並非所有的 I/O 埠都可以處理這些指令的執行速率。

初始化大塊記憶體最快的方法是使用 REP STOS 指令。

操作

IF AddressSize 16
THEN
use CX for CountReg;
ELSE (* AddressSize 32 *)
use ECX for CountReg;
FI;
WHILE CountReg 0
DO
service pending interrupts (if any);
execute associated string instruction;
CountReg CountReg - 1;
IF CountReg 0
THEN exit WHILE loop
FI;
IF (repeat prefix is REPZ or REPE) AND (ZF=0)
OR (repeat prefix is REPNZ or REPNE) AND (ZF=1)
THEN exit WHILE loop
FI;
OD;

影響的標誌

無;不過 CMPS 與 SCAS 指令會設定 EFLAGS 暫存器中的狀態標誌。

異常(所有操作模式)

無;不過重複字首關聯的指令可能會產生異常。