`TEST` 指令有什么作用

逆向工程 部件 x86
2021-06-27 03:51:03

我无法理解 TEST 指令及其用法。我在循环结束时查看以下代码

0040A3D1   A9 00010181           TEST EAX,81010100
0040A3D6   74 E8                 JE SHORT JinKu_ke.0040A3C0

我知道它是如何工作的 TEST AL、AL 或 TEXT EAX、EAX,但我不知道它是如何处理数字的 因为当我使用 0x810100FE 时 JE 指令也不会跳转,即使我们使用 0x81010102 时也不会跳转,但是当我使用 0x60E0FEFC 和下面JE指令跳转。

1个回答

1. 测试

按照x86指令测试设置参考项发现在http://x86.renejeschke.de/

测试

[TEST] 计算第一个操作数(源 1 操作数)和第二个操作数(源 2 操作数)的按位逻辑与,并根据结果设置 SF、ZF 和 PF 状态标志。结果随后被丢弃。

更简洁:

和带有 EAX 的 imm32;根据结果​​设置SF、ZF、PF。

更简洁地说:

不存储结果的 AND 指令

因此对于

0040A3D1 A9 00010181 TEST EAX,81010100

EAX81010100的值被 AND 运算在一起。

如果值EAXIS 0x810100FE,操作如下所示:

EAX:                    10000001000000010000000011111110
0x81010100:         AND 10000001000000010000000100000000
                    ------------------------------------
0x81010000:             10000001000000010000000000000000

结果81010000不为 0,因此未设置零标志。

如果中的值为 ,EAX0x60E0FEFC操作如下所示:

EAX:                    01100000111000001111111011111100
0x81010100:         AND 10000001000000010000000100000000
                    ------------------------------------
                        00000000000000000000000000000000

此处结果为 0,因此零标志 (ZF) 设置为 1。

2.乙脑

按照x86指令乙脑设置参考项发现在http://x86.renejeschke.de/

乙脑

[JCC] 检查 EFLAGS 寄存器(CF、OF、PF、SF 和 ZF)中一个或多个状态标志的状态,如果标志处于指定状态(条件),则执行跳转到目标目标操作数指定的指令。条件代码 (cc) 与每条指令相关联,以指示要测试的条件。如果条件不满足,则不执行跳转,继续执行 Jcc 指令之后的指令。

特别是在“JE”的情况下,

如果相等 (ZF=1),则短跳转。

对于操作

0040A3D1 A9 00010181 TEST EAX,81010100

  • 如果中的值为 ,EAX0x81010102不会设置零标志 (ZF)(见上文),因此控制流不会在此处分支。

  • 如果在值EAX0x60E0FEFC,零标志(ZF)被设置为1(见上文)。结果,此时控制流分支(EIP 跳转)。

概括

  • TEST就像AND,但不会保存操作的结果。仅设置了 PF、SF 和 ZF 标志。
  • 如果算术或逻辑运算(如TEST的结果为 0,则零标志 (ZF) 设置为 1
  • JEEIP如果 ZF = 1,则导致跳转。
  • 如果中的值为 ,EAX0x81010102不会设置零标志 (ZF),因此控制流不会在此处分支。
  • 如果在值EAX就是0x60E0FEFC,零标志(ZF)被设置为1其结果是,在这一点上流动控制分支(EIP跳跃)。