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