我在理解TEST指令及其用法时遇到了麻烦。我正在循环末尾查看以下代码

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


我了解它的工作方式TEST AL,AL或TEXT EAX,EAX,但我不知道知道如何使用数字,因为当我使用0x810100FE甚至使用0x81010102时,JE指令都不会跳转,但是当我使用0x60E0FEFC时,JE指令会跳转。

#1 楼

1. TEST

根据http://x86.renejeschke.de/上的TEST x86指令集参考条目,




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


更简洁:


AND imm32 with EAX;根据结果​​设置SF,ZF,PF。


更简洁:


AND指令而不存储结果


因此,对于


0040A3D1 A9 00010181 TEST EAX,81010100


EAX81010100中的值进行“与”运算。

如果EAX中的值为0x810100FE,则操作如下所示:未设置零标志。

如果81010000中的值为EAX,则操作如下所示:

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


这里的结果为0,因此零标记(ZF)设置为1。

2。 JE

根据http://x86.renejeschke.de/上的JE的x86指令集引用条目,




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


特别是对于'JE',


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


操作


0x60E0FEFC



如果0040A3D1 A9 00010181 TEST EAX,81010100中的值为EAX,则不会设置零标志(ZF)(请参见上文),因此控制流不会在此处分支。
如果0x81010102中的值为EAX,则零标志(ZF)设置为1(请参见上文)。结果,控制流在这一点分支(EIP跳转)。

总结




0x60E0FEFC类似于TEST,但是操作未保存。仅设置PF,SF和ZF标志。
如果算术或逻辑运算的结果(如AND)为0,则零标志(ZF)设置为1。

TEST如果ZF = 1,则导致JE跳转。
如果EIP中的值为EAX,则未设置零标志(ZF),因此控制流不在此处分支。
如果0x81010102中的值是EAX时,零标志(ZF)设置为1。结果,控制流在这一点分支(EIP跳转)。