我正在尝试检查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
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
| 归档时间: |
|
| 查看次数: |
16278 次 |
| 最近记录: |