如何检查 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 的指令,只需检查该标志并使用 JZJE 跳转。例如

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

等在线工具中检查或查看它

阅读更多:http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow