cmp
Compare two operands
Subtracts the source from the destination and sets the flags, discarding the result.
8086 and later
- The x86-64 instruction setx86-64 assembly
- The flags registerx86-64 assembly
- cmp and the conditional jumpsx86-64 assembly
- Loopsx86-64 assembly
- Arrays, strings and the string instructionsx86-64 assembly
- call, ret and the System V conventionx86-64 assembly
- Floating point and the x87 stackx86-64 assembly
- AVX and 256-bit vectorsx86-64 assembly
- syscall and the Linux x86-64 ABIx86-64 assembly
- Ports, memory-mapped devices, and kernel accessx86-64 assembly
- ● set from the result
- – not changed
Forms
Operands
r/m- A general-purpose register or memory location matching the operation’s size, for example
raxorqword [rbp-8]. The byte registersah,bh,chanddhcannot be used with a REX prefix, including when the memory address usesr8–r15. reg- A general-purpose register matching the operation’s size, for example
al,ax,eaxorrax. The byte registersah,bh,chanddhcannot be used with a REX prefix, which is required byspl,bpl,sil,dilandr8–r15. imm- An immediate value encoded in the instruction, written as a number, character or label. Its encoded width and any sign extension depend on the instruction; arithmetic immediates may be sign-extended, while shift counts are used without sign extension.
acc- The accumulator matching the operation’s size:
al,ax,eaxorrax. A shorter encoding may be available.
Use signed or unsigned conditional instructions according to how the values should be interpreted.
The first operand is a register or memory operand; the second is a register, memory operand or immediate, with at most one memory operand. Register and memory operands have the same width. Neither operand is written, so cmp eax, ebx leaves the upper half of rax as it was.
An 8-bit immediate used with a wider operand is sign-extended from −128 through 127. For a 64-bit operation, the longer immediate field is only 32 bits and is also sign-extended; there is no full 64-bit immediate form. The encoded bits determine the value used by the operation. For example, a 32-bit field of 0xffffffff becomes 0xffffffffffffffff (−1), not positive 4294967295. An out-of-range constant can produce a warning and truncated bits; use a register for a value that cannot be represented by these sign extensions.
NASM normally chooses the short immediate encoding when it preserves the value; a byte qualifier is not required. strict with an immediate size can prevent that shortening.
global _start
section .text
_start:
mov rax, 12
mov rbx, 5
mov rcx, 3
mov rsi, 9
cmp rax, rbx
mov rax, 60 ; syscall 60: exit
xor rdi, rdi
syscall