6

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.

vhu
  • 11,219
  • 11
  • 35
  • 42
Jack Maloney
  • 458
  • 1
  • 5
  • 18

2 Answers2

15
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.

Tim Biegeleisen
  • 387,723
  • 20
  • 200
  • 263
14

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

phuclv
  • 27,258
  • 11
  • 104
  • 360