How to check if a register is zero in x86_64 assembly

29,233

Solution 1

If you've just used an instruction that modifies ZF before, simply check that flag and jump using JZ or JE. For example

and rax, rbx ; ZF was modified
jz  is_zero  ; so to check if rax is zero, a single jump is enough

If ZF was not set, you need to do that explicitly. The obvious way is

cmp rax, 0
je  equal_zero

However since cmp is longer if you look at the output binary, test or sometimes and, or is preferred

83F800  cmp eax, 0
09C0    or eax, eax
85C0    test eax, eax

The resulting code will be

test rax, rax
jz   is_zero

You can get the assembly output from a compiler and check or view it in an online tool like gcc godbolt

Read more: http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow

Solution 2

test %eax, %eax   ; set ZF to 1 if eax == 0
je 0x804f430      ; jump to 0x00804f4 if ZF == 1

ZF is a single bit zero flag which will be set to 1 if eax be equal to zero. je will take the jump to 0x804f430 if the ZF be set to 1.

Share:
29,233
Jack Maloney
Author by

Jack Maloney

Updated on May 27, 2020

Comments

  • Jack Maloney
    Jack Maloney almost 4 years

    I'm trying to check if a value is zero in x86_64 assembly code. I know that this usually consist of a cmp variant followed by a jmp variant, but I'm not sure of the exact instructions to use.

  • Nayuki
    Nayuki about 9 years
    Your answer is correct. Another correct answer is to replace the test with cmp $0, %eax.
  • phuclv
    phuclv about 9 years
    @NayukiMinase test is shorter than cmp stackoverflow.com/questions/147173/…
  • gsg
    gsg about 9 years
    jz might be a more mnemonic choice. (Of course it's the same instruction.)
  • Evan Carroll
    Evan Carroll over 6 years
    I agree be nice if the answer said JZ