如何在x86_64汇编中检查寄存器是否为零

Jac*_*ney 3 assembly x86-64

我正在尝试检查x86_64汇编代码中的值是否为零.我知道这通常包含一个cmp变体后跟一个jmp变体,但我不确定使用的确切说明.

Tim*_*sen 12

test %eax, %eax   ; set ZF to 1 if eax == 0
je 0x804f430      ; jump to 0x00804f4 if ZF == 1
Run Code Online (Sandbox Code Playgroud)

ZF是一个单位零标志,如果等于零,将设置为1 eax. 如果设置为1,je将跳转到.0x804f430ZF

  • @NayukiMinase测试比cmp短http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax?rq=1 (5认同)
  • `jz`可能是一个更麻烦的选择.(当然这是相同的指示.) (3认同)

phu*_*clv 10

如果您刚刚使用过修改ZF的指令,只需检查该标志并使用JZ或跳转JE.例如

and rax, rbx ; ZF was modified
jz  is_zero  ; so to check if rax is zero, a single jump is enough
Run Code Online (Sandbox Code Playgroud)

如果未设置ZF,则需要明确地执行此操作.显而易见的方法是

cmp rax, 0
je  equal_zero
Run Code Online (Sandbox Code Playgroud)

然而,由于cmp较长,如果你看一下输出的二进制,test或者有时and,or最好

83F800  cmp eax, 0
09C0    or eax, eax
85C0    test eax, eax
Run Code Online (Sandbox Code Playgroud)

结果代码将是

test rax, rax
jz   is_zero
Run Code Online (Sandbox Code Playgroud)

您可以从编译器获取程序集输出,并在gcc godbolt等在线工具中查看或查看它

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