如何检查程序集x86_64寄存器是否为零



我正在尝试检查汇编代码中的值是否x86_64零。我知道这通常由一个cmp变体和一个jmp变体组成,但我不确定要使用的确切说明。

如果您之前刚刚使用过修改 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或有时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

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

最新更新