TEST
作者:Vesper Vei
1 分钟阅读
目录
TEST(test)
基本作用
TEST 指令对两个操作数执行按位与(AND),但不保存结果,只更新标志位。
它通常用于条件判断,例如判断寄存器是否为 0、检查某一位是否被置位等。
逻辑行为:
temp = op1 & op2 ; 结果丢弃更新 EFLAGS ; 根据 temp 更新标志位指令执行过程
- 执行按位 AND
- 结果不写回(丢弃)
- 更新 ZF、SF、PF、CF、OF、AF,其中:
- CF = 0
- OF = 0
- ZF 根据结果是否为 0
- SF 由结果最高位决定
- PF 按偶校验更新
指令格式
test r/m32, r32test r/m64, r64test r/m32, imm32test r/m8, imm8行为特性
- 是逻辑 AND 的“无结果版本”
- 常用于判断某一位是否为 1
- 不修改操作数(无破坏性)
- 特别适合用于分支判断与状态解析
与 AND 的区别:
and op1, op2会把结果写回 op1test op1, op2完全不修改任何操作数,只影响标志位
等效行为示例(逻辑等价):
and temp, op1, op2 ; 假设 temp 是一个不存在的寄存器根据 temp 更新 EFLAGS; temp 被丢弃常见用途
- 判断寄存器是否为 0:
test eax, eax ; 等价于检查 eax 是否为 0 jz is_zero- 检查某一 bit 是否被置位:
test rax, 0x100jnz bit_set
- 判断指针是否为空、标志位是否有效
- 协议解析(按位分解 flag 字段)
- 在逆向分析中常出现于权限检查或状态分支
- 在 PWN 调试中常用于理解验证逻辑是否被绕过
小例子:判断 eax 是否为偶数
test eax, 1jz even原理:最低位为 0 → 偶数。