REP / REPNE Repeat String Instruction Flags: O D I T S Z A P C (See instruction) REP string_instruction Repeat REPE/REPZ string_instruction Repeat While Equal/Zero REPNE/REPNZ string_instruction Repeat While Not Equal/Not Zero
Logic ; MOVS,STOS,LODS,INS,OUTS while eCX <> 0 execute string instruction once eCX ← eCX - 1 endwhile ────────────────────────────────────────────────── ; CMPS,SCAS while eCX <> 0 execute string instruction once eCX ← eCX - 1 exit iteration if ZF=0 (REPE) │ if ZF=1 (REPNE) endwhile
REP, REPE, and REPNE are prefixes that can be specified before any string instruction (CMPS, MOVS, SCAS, INS, OUTS (or LODS)). The prefix causes the string instruction following it to be repeated the number of times indicated in the count register or (for REPE and REPNE) until the indicated condition in the zero flag is no longer met. REP combined with MOVS or SCAS permits fast memory-to-memory move or scanning operations.
If the address-size attribute is 16 bits, CX is used for the count register; otherwise the address-size attribute is 32 bits and ECX is used. If the count value is initially zero, the instruction is not executed and no flags are changed.
REP is used with MOVS, STOS, INS, OUTS (or LODS); the flags are not used or modified by these instructions.
REPE and REPNE are used with CMPS and SCAS which use the zero flag (ZF) and determine the OF,SF,ZF,AF,PF,CF flags. (The ZF flag need not be initialized before REPcc CMPS/SCAS.)
The REP prefixes apply only to one instruction at a time. To repeat a block of instructions, use a loop construct. Any pending interrupts are acknowledged on each iteration of REP.
Note Instructions with one of the REP prefixes, combined with a segment override and/or another prefix, (e.g. rep movs [byte ss:si],[byte es:di] ) execute incorrectly on 8086/8088 CPUs if an interrupt occurs before CX reaches 0. Some sources say this bug is present on all pre-80386 CPUs.