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.
While the x86/x64 architectures do not have an architectural zero register it seems likely that the Sandybridge processor has a physical zero register. When the renamer detects one of these special instructions it just renames the architectural register to point at the zero register.
If you need to test a register for zero, but don't want to alter its value, you use the test instruction.
One of the first relational operators any programmer comes across is the equality/equivalence operator or ==. It is used to evaluate whether any given two operands are equal to each other or not.
TEST EAX,EAX tests whether EAX is zero or not and sets or unsets the ZF bit.
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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With