在x86平台上使用的汇编指令对应的二进制机器码为Intel指令集-Opcode。
Inter指令手册中描述的指令由六部分组成,如图所示。
结构图说明如下:
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]
Opcode:指令操作码
Opcode为机器码中的操作符部分,用来说明指令语句执行什么样的操作,如某条汇编语句是MOV、JMP还是CALL,Opcode为汇编指令语句的主要组成部分,是必不可少的。
汇编指令助记符与Opcode是一一对应关系。每一条汇编指令助记符都会对应一条Opcode码,但是由于操作数类型不同,所占长度不同,因此对于非单字节指令来说,解析一条汇编指令单凭Opcode是不够的,还需要Mode R/M、SIB、Displacement的帮助。
Mode R/M:操作数类型
Mode R/M是辅助Opcode解释汇编指令助记符后的操作数类型。R表示寄存器,M表示内存单元。Mode R/M占一个字节的固定长度。第6、7位可以描述4状态,分别用来描述第0、1、2位是寄存器还是内存单元,以及3中寻址方式。第3、4、5位用来辅助Opcode。
SIB:辅助Mode R/M,计算地址偏移
SIB的寻址方式为基地址+变址,如MOV EAX,DWORD PTR DS:[EBX+ECX*2],其中的ECX,乘数2都是由SIB指定的。SIB占一个字节大小,第0,1,2位用来指定作为基地址的寄存器;第3,4,5位用来指定作为变址的寄存器;第6,7位用于指定乘数。
Displacement:辅助Mode R/M,计算地址偏移
Displacement用于辅助SIB,如MOV EAX,DWORD PTR DS:[EBX+ECX*2+3]这条指令中,+3就是由Displacement指定的。
Immediate:立即数
用于解释指令语句中操作数作为一个常量值的情况。