帮助理解 x64 TEST 指令

逆向工程 部件 x86-64
2021-06-14 11:00:34

我读过 TEST 对两个参数按位执行。我还读到 jz 和 je 都是等价的,如果设置了零标志,则跳转。所以这就是我正在努力解决的问题。考虑(相当无用)以下代码:

mov ax, 0x2
test ax, 0x2
je equal
mov ax, 0x0
jmp done
equal:
mov ax, 0x1
done:

从逻辑上讲,“如果相等则跳转”应该跳转,但 0x2 & 0x2 不应设置零标志。据我了解,如果设置了零标志,jz/je 将跳转,这意味着 je 在逻辑上没有做它所暗示的(“如果相等则跳转”)。在实践中,代码会失败并将 ax 设置为 0x0,而不是跳转并将 ax 设置为 0x1。

谁能解释一下我的理解哪里出了问题?显然我没有正确理解某些东西。

谢谢!

1个回答

je 通常与 cmp 指令一起使用,例如

cmp Reg16/32/64,const
je someplace

而 jz 通常用于专门检查 0 或 null 之类的

dec reg16/32/64 
jz someplace

我只是将您的代码修改为无限循环并在 x86 模拟器中模拟它,请参阅下面的代码和 gif。

代码

mov ax, 0x2
dec     ax
and     ax, 0x1
jz  equal
je  equal
test    ax, 1
jz  equal
je  equal
cmp     ax, 1
redo:
jz  equal
equal:
je  redo

在此处输入图片说明