我正在尝试检查汇编代码中的值是否x86_64零。我知道这通常由一个cmp
变体和一个jmp
变体组成,但我不确定要使用的确切说明。
如果您之前刚刚使用过修改 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
或有时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
。