loope

Loop while equal

Decrements rcx by one and jumps to the short target if the counter is non-zero and ZF is 1.

8086 and later

Intel's reference: LOOP/LOOPcc

CFPFAFZFSFDFOF –––––––
  • Changes no flag
  • Reads ZF

Forms

  • loope
  • loope , ecx 386 and later
  • loope , rcx

Operands

imm8
A branch target, written as a label or address. NASM calculates the displacement from the end of the instruction. The displacement must fit a signed byte, -128 to 127.

loope / loopz additionally require ZF = 1; loopne / loopnz require ZF = 0. The instructions do not change flags.

In 64-bit mode, the default counter is rcx; a32 selects ecx. A 16-bit cx counter is unavailable in this mode. A zero initial counter wraps to its maximum value when decremented.

Write a target label or address. NASM calculates a signed 8-bit displacement from the end of the instruction (−128 through 127 bytes). There is no longer near encoding.

global _start

section .text
_start:
        mov rcx, 5          ; the counter this family reads
        xor rax, rax
again:
        add rax, rcx
        cmp rax, 0          ; the conditional forms read the flags too
        loope again         ; jumps while rcx is not zero and the last comparison was equal

        mov rax, 60         ; syscall 60: exit
        xor rdi, rdi
        syscall