1
TEST EAX,EAX
JNZ SHORT program.00407190
2
XOR EAX,EAX
JNZ SHORT program.00407190
如果我错了,请纠正我。谢谢! :)
根据我的理解到目前为止:
JNZ
如果不等于零则跳转,它会跳跃或不跳,取决于ZF
是否设置为1。如果是1,它就不会跳跃。否则,它会跳跃。
根据我对代码#1的理解,TEST EAX,EAX
将检查它是否为零。如果它不等于零(ZF
为0),它将跳转到地址00407190。
代码#2
XOR EAX,EAX
将EAX寄存器设置为0.是否设置了任何标志?如果没有,JNZ
指令如何确定跳转?
最后,为什么人们想检查EAX
是否为0?请帮助我更简单详细的解释,我还是初学者。
答案 0 :(得分:7)
TEST
和XOR
是用于对操作数执行逻辑运算的逻辑指令。
测试说明(比较操作数)
TEST destiny, source
它逐位执行操作数的连接,但与AND
不同,此指令不会将结果放在目标操作数中,它只会影响标志的状态。
Source Destiny | Destiny
--------------------------
1 1 | 1
1 0 | 0
0 1 | 0
0 0 | 0 <---
XOR INSTRUCTION (独家OR)
XOR destiny, source
它的功能是逐位执行两个操作数的逻辑独占析取。
Source Destiny | Destiny
--------------------------
1 1 | 0 <---
1 0 | 1
0 1 | 1
0 0 | 0 <---
如表中所示:
XOR EAX,EAX
会将EAX
寄存器设置为零。如果ZF
的结果为零,则会设置XOR
。所以在这种情况下:( ZF=1
)
TEST EAX,EAX
不会将结果放在寄存器上,只会影响ZF
的状态。在这种情况下,如果是EAX == 0
,那么(ZF=1
)
JNZ(JNE)指令(条件跳转)
JNZ label
如果它不等于零,则跳转到label
。如果取消激活ZF
,则会完成跳转。 (ZF=0
)