硬编码(前缀指令)
前缀指令
什么是前缀指令?
在x86/x64指令架构中,一共有六个部分,其中上图的第一个 Instructino Prefixes
就是对应的前缀指令(前缀指令是可选的不是必须的
)
cpu如何知道当前指令是否为前缀指令呢?答案是根据当前指令值
像2e,36,3e这些就是前缀指令,x64dbg已经识别出来给我们用冒号分隔开了(冒号前面的指令就是前缀指令
)
常见的前缀指令
这些前缀按功能分为四组
,每组最多
只能出现一个前缀
(但不同组的前缀可以组合使用,没有顺序要求)
- 锁定和重复前缀(Lock & Repeat Prefixes)
3个
- F0H - LOCK (用于原子操作(如XCHG、CMPXCHG),确保指令独占内存访问)
- F3H - REP/REPE/REPZ(重复字符串操作(如MOVS、STOS),直到ECX=0或ZF=0)
- F2H - REPNE/REPNZ(重复字符串操作,直到ECX=0或ZF=1)
- 段覆盖前缀(Segment Override Prefixes)强制指令使用特定段寄存器
6个
- 2EH - CS
- 36H - SS
- 3EH - DS
- 26H - ES
- 64H - FS
- 65H - GS
- 操作数大小覆盖前缀(Operand-Size Override)
1个
- 66H(在16/32位模式下切换操作数宽度(如32位→16位,或64位→32位))
- 地址大小覆盖前缀(Address-Size Override)
1个
- 67H(在16/32/64位模式下切换寻址地址大小(如32位→16位,或64位→32位))
其他扩展
- REX前缀(64位扩展)
- 40H–4FH - REX(仅在x86-64下有效,用于扩展寄存器(如R8-R15)或操作数宽度(如64位操作))
- 结构:0100WRXB(W=64位模式,R/X/B=扩展寄存器位)。
- VEX/EVEX前缀(SIMD扩展)
- VEX(2或3字节)(用于AVX指令(如VADDPS),替代传统66H/F2H/F3H前缀)
- EVEX(4字节)(用于AVX-512指令,进一步扩展功能)
- 分支提示前缀(Branch Hint)
- 2EH / 3EH(用于Jcc指令,提示静态分支预测(2EH=不跳转,3EH=跳转)