5

1.

TEST EAX,EAX
JNZ SHORT program.00407190

2.

XOR EAX,EAX
JNZ SHORT program.00407190

如果我错了,请纠正我。谢谢!:)

据我目前的理解:

JNZis jump 如果不等于0,它是否会跳转取决于是否ZF设置为1。如果为 1,则不会跳转。否则,它会跳。

根据我对代码 #1 的理解,TEST EAX,EAX将检查它是否为零。如果不等于 0(ZF为 0),则跳转到地址 00407190。

对于代码#2
XOR EAX,EAX,将 EAX 寄存器设置为 0。它是否设置了任何标志?如果不是,JNZ指令如何判断是否跳转?

最后,为什么人们要检查是否EAX为 0?请帮助我更简单,更详细的解释,我还是一个初学者。

4

1 回答 1

8

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

测试指令(比较操作数)

TEST destiny, source

它逐位执行操作数的连接,但与 不同的是AND,该指令不会将结果放在目标操作数中,它只会影响标志的状态。

Source Destiny | Destiny
--------------------------
1      1       | 1      
1      0       | 0
0      1       | 0
0      0       | 0    <---

异或指令(异或)

XOR destiny, source 

它的功能是逐位执行两个操作数的逻辑异或。

Source Destiny | Destiny
--------------------------
1      1       | 0    <---
1      0       | 1
0      1       | 1
0      0       | 0    <---

正如您在表格中看到的:

XOR EAX,EAXEAX寄存器设置为零。如果的结果为零ZF,则将设置。XOR所以在这种情况下: ( ZF=1)

TEST EAX,EAX不会将结果放在寄存器上,它只会影响ZF. 在这种情况下,如果EAX == 0,那么 ( ZF=1)


JNZ (JNE) INSTRUCTION (条件跳转)

JNZ label

label如果它不等于或不为零,它会跳转到。ZF如果禁用,跳转将完成。( ZF=0)

于 2013-09-25T05:32:05.287 回答