操作碼 |
指令 |
說明 |
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 暫存器中的狀態標誌。
無;不過重複字首關聯的指令可能會產生異常。