在X86平台下使用的汇编指令对应的二进制码为Intel指令集 -- Opcode.
Intel指令手册中描述的指令由6部分组成
结构图说明 如下:
1. Instruction Prefixes: 指令前缀
指令前缀是可选的,作为指令的补助说明信息存在,主要用于以下4种情况:
重复指令:如 REP, REPE\REPZ
跨段指令:如 MOV DWORD PTR FS:[xxxx], 0
将操作数从32位转为16位:如 MOV AX WORD PTR DS:[EAX]
将地址从16位转为32位:如 MOV EAX, DWORD PTR DS:[BX +SI]
2, Opcode: 指令操作码
Opcode为机器码中的操作符部分,用来说明指令语句执行什么样的操作,如某条汇编语句是MOV,JMP 还是CALL. Opcode为汇编指令语句的主要组成部分,是必不可少的。对Opcode的解析也是反汇编引擎的主要工作。
汇编指令助记符与Opcode是一 一对应的关系。每一条汇编指令助记符都会对应一条Opcode码,但由于操作数类型不同,所占长度也不相同,因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要 Mode R/M、SIB、Displacement的帮助,才能够完整地解析出汇编信息。
3,Mode R/M: 操作数类型
Mode R/M是辅助Opcode解释汇编指令助记符后的操作数类型。R表示寄存器,M表示内存单元。Mode R/M 占一个字节的固定长度,如下图。第6、7位可以描述4种状态,分别用来描述第0、1、2位是寄存器还是内存单元,以及3种寻址方式。第3、4、5位用于辅助Opcode。
4, SIB:辅助Mode R/M,计算地址偏移
SIB的寻址方式为基址 + 变址,如 MOV EAX, DWORD PTR DS:[EBX + ECX*2], 其中的ECX、乘数2都是由SIB来指定的。SIB的结构如下较长。SIB占1个字节大小,第0,1,2位用于指定作为基址的寄存器;第3,4,5位用于作为变址的寄存器; 第6、7位用于指定乘数,由于只有两位,因此可以表示4种状态,这4种状态分别表示乘数为1,2,4,8.
5, Displacement
用于辅助SIB, 如 MOV EAX, DWORD PTR DS:[EBX + ECX * 2 + 3] 这条指令,其中的 “+3” 是由Displacement来指定的。
6,Immediate: 立即数
用于解释指令语句中操作数为一个常量值的情况。
反汇编引擎通过查表将由以上6种方案组合而成的机器指令编码,解释为对应的汇编指令,从而完成了机器码的转换工作。