Intel 64 and IA-32 Architectures Software Developers Manual Volume 2A, Instruction Set Reference, A-M

Vol. 2 3-547
INSTRUCTION SET REFERENCE, A-M
LOOP/LOOPcc—Loop According to ECX Counter
Description
Performs a loop operation using the ECX or CX register as a counter. Each time the
LOOP instruction is executed, the count register is decremented, then checked for 0.
If the count is 0, the loop is terminated and program execution continues with the
instruction following the LOOP instruction. If the count is not zero, a near jump is
performed to the destination (target) operand, which is presumably the instruction at
the beginning of the loop. If the address-size attribute is 32 bits, the ECX register is
used as the count register. Otherwise, the CX register is used.
The target instruction is specified with a relative offset (a signed offset relative to the
current value of the instruction pointer in the EIP register). This offset is generally
specified as a label in assembly code, but at the machine code level, it is encoded as
a signed, 8-bit immediate value, which is added to the instruction pointer. Offsets of
–128 to +127 are allowed with this instruction.
Some forms of the loop instruction (LOOPcc) also accept the ZF flag as a condition for
terminating the loop before the count reaches zero. With these forms of the instruc-
tion, a condition code (cc) is associated with each instruction to indicate the condition
being tested for. Here, the LOOPcc instruction itself does not affect the state of the ZF
flag; the ZF flag is changed by other instructions in the loop.
In 64-bit mode, use of the REX.W prefix enables 64 bit counts. JMP Short is RIP = RIP
+ 8-bit offset sign extended to 64 bits. See the summary chart at the beginning of
this section for encoding data and limits.
Opcode
Instructio
n
64-Bit
Mode
Compat/
Leg Mode Description
E2 cb LOOP rel8 Valid Valid Decrement count; jump short if count
0.
REX.W + E2 cb LOOP rel8 Valid N.E. Decrement 64-bit count in RCX; jump
short if count 0.
E1 cb LOOPE rel8 Valid Valid Decrement count; jump short if count
0 and ZF = 1.
REX.W + E1 cb LOOPE rel8 Valid N.E. Decrement 64-bit count in RCX; jump
short if count 0 and ZF = 1.
E0 cb LOOPNE
rel8
Valid Valid Decrement count; jump short if count
0 and ZF = 0.
REX.W + E0 cb LOOPNZ
rel8
Valid N.E. Decrement 64-bit count in RCX; jump
short if count 0 and ZF = 0.