详解x86指令格式
格式总览
Instruction Prefixes: 指令前缀,0到4个字节,可选
Opcode: 操作码,指令的灵魂所在,必须有,1- ,2-,或者3个字节
ModR/M: 1个字节,可选,8位数据,按2:3:3格式分段,Mod(6 7位)/ Reg/Opcode(3 4 5位) / R/M(0 1 2位)Mod和R/M,共5位,结合起来,寻址,Reg/Opcode,一般情况是来确定一个寄存器,特定情况下,是Opcode的补充码
SIB: 对ModR/M的补充
Displacement: 偏移
Immediate: 立即数
Instruction Prefixes: 分四组,在一条指令中,每组前缀指令最多1个字节,一条指令中,最多4个字节的指令前缀,这4个字节不分前后顺序
Group1:LOCK和REPEAT
lock | F0 | 锁地址总线 |
---|---|---|
REPNE/REPNZ | F2 | 重复指令 |
REP/REPZ | F3 | 重复指令 |
Group2:段前缀指令
CS(2EH),SS(36H),DS(3EH),ES(26H),FS(64H),GS(65H)
Group3:Operand-size override prefix(操作数宽度前缀),值为66H
双向起作用,如果当前系统默认是16位宽度,加了此前缀后,变成32位宽度,反之,亦然。
Group4:地址宽度前缀,值为67H 类似Group3
Opcode决定是否有ModR/M:,ModR/M决定是否有SIB
Zz表示法: 大写字母+小写字母表示各种不同的含义,对于含义的定义,参见Intel软件开发人员手册A.2.1 Codes for Addressing Method部分和A.2.2 Codes for Operand Type部分,分别是A-Z,a-z的含义说明。
例如 Opcode=0x00时 查到的指令为 ADD Eb,Gb 首先这是一个ADD指令
E:一个ModR/M字节跟在操作码后面,并指定(详细说明了)操作数
G:ModR/M字节的reg字段选择一个通用寄存器(例如AX(000))
b:一个字节,操作数的宽度
这个Opcode告诉我们,它后边还跟着一个ModR/M字节
以上这些分析,需要查表,表在开发手册里。下一篇着重整理下查表。