记忆反汇编指令(特别是 x86/x64 架构)不必死记硬背,关键在于理解指令的设计逻辑和建立关联模型。核心在于掌握 “操作码 + 操作数” 的结构,以及 AT&T 与 Intel 两种语法风格的区别。
以下是高效记忆反汇编指令的系统性方法:
反汇编指令通常由 助记符(操作类型) 和 操作数(数据来源/目标) 组成。
指令 目标操作数, 源操作数MOV EAX, EBX (把 EBX 的值给 EAX)指令 源操作数, 目标操作数mov %ebx, %eax%,立即数带 $,内存操作有尺寸后缀(如 b 字节, l 长字)。将指令按功能分组,每组记住一个“带头大哥”,其余的通过前缀推导。
| 功能分类 | 核心指令 | 记忆逻辑与扩展 |
|---|---|---|
| 数据搬运 | MOV | Move。最基础。扩展:MOVSX(符号扩展搬)、MOVZX(零扩展搬)。 |
| 算术运算 | ADD / SUB | Add / Subtract。扩展:INC(自增1)、DEC(自减1)、MUL(无符号乘)、IMUL(有符号乘)。 |
| 逻辑运算 | AND / OR / XOR | 按位操作。XOR EAX, EAX 是清零的经典写法(比 MOV EAX, 0 更高效)。 |
| 流程控制 | JMP / CALL | Jump / Call。重点是条件跳转:JZ(为零跳)、JNZ(非零跳)、JE(相等跳)、JG(有符号大于跳)。 |
| 栈操作 | PUSH / POP | 压栈 / 弹栈。函数开头常看到 PUSH EBP 保存现场。 |
| 比较测试 | CMP / TEST | Compare / Test。它们不保存结果,只设置标志位(EFLAGS),配合条件跳转指令决定程序走向。 |
| 重复操作 | REP | Repeat。常配合 MOVS(移动字符串)或 STOS(填充字符串)使用。 |
如果你看到指令后面跟着字母,通常是表示操作的数据宽度(主要在 Intel 语法中体现,AT&T 语法中更明显):
AL, MOV AL, ...)AX)EAX)RAX)MOV EAX, 0 是 32位操作;MOV AX, 0 是 16位;MOV AL, 0 是 8位。这是逆向分析中最常遇到的模式,记住这个“套路”能帮你快速理清逻辑:
push ebp ; 保存旧的栈底
mov ebp, esp ; 建立新的栈底
sub esp, 10h ; 开辟局部变量空间
mov esp, ebp ; 释放局部变量空间
pop ebp ; 恢复旧的栈底
ret ; 返回
不要孤立地背指令,要联想 C 语言代码:
if (a == b) $\rightarrow$ 对应 CMP a, b 然后 JZ (Jump if Zero)。while (i < 10) $\rightarrow$ 对应 CMP i, 10 然后 JL (Jump if Less)。a = a + 1 $\rightarrow$ 对应 INC a 或 ADD a, 1。int a=1; a++;),用编译器生成汇编(如 gcc -S test.c),看编译器是怎么翻译的。总结:先记住 MOV, ADD, JMP, CMP, PUSH/POP 这几个骨架,然后结合 寄存器(EAX, EBX, ESP, EBP) 和 标志位(ZF, CF) 的概念去理解,剩下的指令在遇到时查表即可,无需强求一次性全部记住。