解析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
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位元組
以上這些分析,需要查表,表在開發手冊裡。下一篇著重整理下查表。
相關文章
- 常用的x86彙編指令
- GPS 格式解析
- 從X86指令深扒JVM的位移操作JVM
- BVH檔案格式解析
- GEOJSON資料格式解析JSON
- nginx的listen指令解析Nginx
- pycharm 破解指令碼解析PyCharm指令碼
- android解析HashMap格式的jsonAndroidHashMapJSON
- arkTS 如何解析MD格式?
- Flutter資料解析Map格式Flutter
- java class 檔案格式解析Java
- Nginx Location 指令語法解析Nginx
- shell指令碼(3)-格式化輸出指令碼
- python 從TXT中解析json格式PythonJSON
- MP4檔案格式解析
- JSONObject與JSONArray 解析JSON格式字串JSONObject字串
- ORACLE 資料塊格式深入解析Oracle
- Qt的.pro檔案格式解析QT
- shell指令碼獲取時間格式化指令碼
- 解析 CSS 格式化上下文CSS
- PE檔案格式詳細解析(一)
- C#解析Matrix Marke資料格式C#
- 深入解析Vue.directive 自定義指令Vue
- shell指令碼實現DNS正向解析指令碼DNS
- 檔案格式引起的指令碼執行錯誤指令碼
- 如何將Excel檔案解析為json格式ExcelJSON
- PE檔案格式詳細解析(二)--IAT
- 使用cJSON庫對JSON格式進行解析JSON
- ads1299多通道資料格式解析
- Linux 作業系統指令碼格式問題導致指令碼無法執行Linux作業系統指令碼
- Java 嵌入指令碼快速解析多層 jsonJava指令碼JSON
- Tomcat的啟停指令碼原始碼解析Tomcat指令碼原始碼
- Shell指令碼入門:編寫格式與執行方式指令碼
- ffmpeg批次mov轉換mp4格式指令碼指令碼
- shell指令碼攻略--DNS正向解析一鍵部署指令碼DNS
- Where the top of the stack is on x86
- 自用 x86 GetProcAddress + GetModuleHandle
- 藍芽Beacon廣播資料包格式以及解析藍芽