如何检查 x86_64 程序集中的寄存器是否为零
How to check if a register is zero in x86_64 assembly
我正在尝试检查 x86_64 汇编代码中的值是否为零。我知道这通常由一个 cmp
变体和一个 jmp
变体组成,但我不确定具体的使用说明。
test %eax, %eax ; set ZF to 1 if eax == 0
je 0x804f430 ; jump to 0x00804f4 if ZF == 1
ZF
是单个位零标志,如果 eax
等于零,它将设置为 1。如果 ZF
设置为 1,je
将跳转到 0x804f430
。
如果您之前刚刚使用过修改 ZF 的指令,只需检查该标志并使用 JZ
或 JE
跳转。例如
and rax, rbx ; ZF was modified
jz is_zero ; so to check if rax is zero, a single jump is enough
如果未设置 ZF,您需要明确地进行设置。显而易见的方法是
cmp rax, 0
je equal_zero
但是,如果您查看输出二进制文件,由于 cmp
更长,因此首选 test
or sometimes and
, or
83F800 cmp eax, 0
09C0 or eax, eax
85C0 test eax, eax
结果代码将是
test rax, rax
jz is_zero
您可以从编译器获取程序集输出,并在 gcc godbolt
等在线工具中检查或查看它
我正在尝试检查 x86_64 汇编代码中的值是否为零。我知道这通常由一个 cmp
变体和一个 jmp
变体组成,但我不确定具体的使用说明。
test %eax, %eax ; set ZF to 1 if eax == 0
je 0x804f430 ; jump to 0x00804f4 if ZF == 1
ZF
是单个位零标志,如果 eax
等于零,它将设置为 1。如果 ZF
设置为 1,je
将跳转到 0x804f430
。
如果您之前刚刚使用过修改 ZF 的指令,只需检查该标志并使用 JZ
或 JE
跳转。例如
and rax, rbx ; ZF was modified
jz is_zero ; so to check if rax is zero, a single jump is enough
如果未设置 ZF,您需要明确地进行设置。显而易见的方法是
cmp rax, 0
je equal_zero
但是,如果您查看输出二进制文件,由于 cmp
更长,因此首选 test
or sometimes and
, or
83F800 cmp eax, 0
09C0 or eax, eax
85C0 test eax, eax
结果代码将是
test rax, rax
jz is_zero
您可以从编译器获取程序集输出,并在 gcc godbolt
等在线工具中检查或查看它