这个汇编代码有什么作用? (TEST,XOR,JNZ)

时间:2013-09-25 05:07:20

标签: assembly x86 reverse-engineering

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?请帮助我更简单详细的解释,我还是初学者。

1 个答案:

答案 0 :(得分:7)

TESTXOR是用于对操作数执行逻辑运算的逻辑指令。

测试说明(比较操作数)

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