How to check if a register is zero in x86_64 assembly
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.
Jack Maloney
Updated on May 27, 2020Comments
-
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 ajmp
variant, but I'm not sure of the exact instructions to use. -
Nayuki about 9 yearsYour answer is correct. Another correct answer is to replace the
test
withcmp $0, %eax
. -
phuclv about 9 years@NayukiMinase test is shorter than cmp stackoverflow.com/questions/147173/…
-
gsg about 9 years
jz
might be a more mnemonic choice. (Of course it's the same instruction.) -
Evan Carroll over 6 yearsI agree be nice if the answer said
JZ