【问题标题】:What does this assembly code do? (TEST,XOR,JNZ)这个汇编代码有什么作用? (测试,异或,JNZ)
【发布时间】:2013-09-30 13:21:42
【问题描述】:

1.

TEST EAX,EAX
JNZ SHORT program.00407190

2.

XOR EAX,EAX
JNZ SHORT program.00407190

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

据我目前的理解:

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

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

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

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

【问题讨论】:

  • 至于为什么要检查EAX是否为0;这取决于上下文。假设您正在编写一个 Windows 应用程序并调用了一些 WinAPI 函数,例如 CreateWindowHeapAlloc 或其他什么。函数的结果(无论是窗口句柄、指向已分配内存块的指针还是其他)将在EAX 中返回,检查结果是零(无效)还是非零是有意义的(有效),以确定如何在您的程序中进行。
  • 谢谢!这对于初学者来说绝对是一个很好的例子。

标签: assembly x86 reverse-engineering


【解决方案1】:

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

测试指令(比较操作数)

TEST destiny, source

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

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

XOR 指令(异或)

XOR destiny, source 

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

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

如您在表格中看到的:

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

TEST EAX,EAX 不会将结果放在寄存器中,它只会影响ZF 的状态。在这种情况下如果EAX == 0,那么(ZF=1


JNZ (JNE) INSTRUCTION(条件跳转)

JNZ label

如果不等于或不为零,则跳转到label。如果ZF 被停用,跳转将完成。 (ZF=0)

【讨论】:

  • 感谢您的解释,但您错过了我的一些问题。对于代码#2 XOR EAX,EAX 会将 EAX 寄存器设置为 0。它是否设置了任何标志?如果不是,JNZ指令如何判断是否跳转?最后,为什么人们要检查 EAX 是否为 0?
  • @ysj JNE 如果ZF=0 将被跳转。 XOR EAX,EAX 设置ZF=1。检查EAX=0 取决于您的目的。
  • @ysj JNEJNZ 只是当 ZF 等于 0 时条件跳转的不同名称
猜你喜欢
  • 2016-06-03
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-31
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
相关资源
最近更新 更多