1. 测试
按照x86指令测试设置参考项发现在http://x86.renejeschke.de/,
[TEST] 计算第一个操作数(源 1 操作数)和第二个操作数(源 2 操作数)的按位逻辑与,并根据结果设置 SF、ZF 和 PF 状态标志。结果随后被丢弃。
更简洁:
和带有 EAX 的 imm32;根据结果设置SF、ZF、PF。
更简洁地说:
不存储结果的 AND 指令
因此对于
0040A3D1 A9 00010181 TEST EAX,81010100
EAX
和81010100
中的值被 AND 运算在一起。
如果值EAX
IS 0x810100FE
,操作如下所示:
EAX: 10000001000000010000000011111110
0x81010100: AND 10000001000000010000000100000000
------------------------------------
0x81010000: 10000001000000010000000000000000
结果81010000
不为 0,因此未设置零标志。
如果中的值为 ,EAX
则0x60E0FEFC
操作如下所示:
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
概括
TEST
就像AND
,但不会保存操作的结果。仅设置了 PF、SF 和 ZF 标志。
- 如果算术或逻辑运算(如
TEST
)的结果为 0,则零标志 (ZF) 设置为 1 。
JE
EIP
如果 ZF = 1,则导致跳转。
- 如果中的值为 ,
EAX
则0x81010102
不会设置零标志 (ZF),因此控制流不会在此处分支。
- 如果在值
EAX
就是0x60E0FEFC
,零标志(ZF)被设置为1其结果是,在这一点上流动控制分支(EIP跳跃)。