機器指令編碼基礎結構
|_______OP_______|_d_|_w_| ; 一般雙操作數
|_______OP_______|_s_|_w_| ; 立即數定址
w=1 字操作 (16/32-bit),w=0 位元組操作
d=1 目的操作數在暫存器,d=0 來源操作數在暫存器
s=1 8-bit 立即數帶號擴展至 16/32-bit,s=0 完整立即數
ModR/M 位元組編碼
|mod|reg|r/m| (各 2/3/3 bits)
reg: 暫存器編碼 (配合 w 位)
mod+r/m: 記憶體定址模式或第二暫存器
關鍵查表對照 (節錄自 Intel OPCODES 手冊)
| reg (rrr) | w=0 | w=1 | 32-bit |
| 000 | AL | AX | EAX |
| 001 | CL | CX | ECX |
| 010 | DL | DX | EDX |
| 011 | BL | BX | EBX |
| 100 | AH | SP | ESP |
| 101 | CH | BP | EBP |
| 110 | DH | SI | ESI |
| 111 | BH | DI | EDI |
| mod (oo) | 意義 |
| 00 | 無位移量 (除非 r/m=110 則有 16-bit 位移) |
| 01 | 8-bit 帶號位移 |
| 10 | 16-bit 帶號位移 |
| 11 | r/m 為暫存器編號 (非記憶體定址) |
實戰範例逐步解碼
範例 1:MOV AX, 1234H → B8 34 12
- 指令格式:
MOV Reg, Imm,OpCode = 1011wrrr
- 字操作 →
w=1;AX → rrr=000
- OpCode =
1011 1000 = B8H
- 立即數小端序存放 →
34 12
- 機器碼:
B8 34 12
範例 2:MOV AX, BX → 8B C3
- 指令格式:
MOV Reg, Reg,OpCode = 100010 dw oo rrr mmm (實為 89 /r 或 8B /r)
- 字操作 →
w=1;暫存器定址 → oo=11
- 目的 AX →
rrr=000;來源 BX → mmm=011
- 組合:
1000 1011 1100 0011 = 8B C3
練習題
MOV EBX, 0 → 66 BB 00 00 00 00 (需 32-bit 運算元前綴 66H)
MOV CL, 55H → B1 55
掌握 OPCODES 手冊查表法,即可完成任意指令與機器碼互轉。