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
EAX
和81010100
中的值进行“与”运算。 如果
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跳转)。