解析x86指令格式

weixin_48406407發表於2020-12-11

詳解x86指令格式

格式總覽

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

lockF0鎖地址匯流排
REPNE/REPNZF2重複指令
REP/REPZF3重複指令

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位元組

以上這些分析,需要查表,表在開發手冊裡。下一篇著重整理下查表。

相關文章