首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

組合指令與機器碼互轉實戰:OPCODE 查表法完整教學

     編輯:組合語言

機器指令編碼基礎結構

|_______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=0w=132-bit
000ALAXEAX
001CLCXECX
010DLDXEDX
011BLBXEBX
100AHSPESP
101CHBPEBP
110DHSIESI
111BHDIEDI
mod (oo)意義
00無位移量 (除非 r/m=110 則有 16-bit 位移)
018-bit 帶號位移
1016-bit 帶號位移
11r/m 為暫存器編號 (非記憶體定址)

實戰範例逐步解碼

範例 1:MOV AX, 1234H → B8 34 12

  1. 指令格式:MOV Reg, Imm,OpCode = 1011wrrr
  2. 字操作 → w=1;AX → rrr=000
  3. OpCode = 1011 1000 = B8H
  4. 立即數小端序存放 → 34 12
  5. 機器碼:B8 34 12

範例 2:MOV AX, BX → 8B C3

  1. 指令格式:MOV Reg, Reg,OpCode = 100010 dw oo rrr mmm (實為 89 /r 或 8B /r)
  2. 字操作 → w=1;暫存器定址 → oo=11
  3. 目的 AX → rrr=000;來源 BX → mmm=011
  4. 組合:1000 1011 1100 0011 = 8B C3

練習題

  • MOV EBX, 0 → 66 BB 00 00 00 00 (需 32-bit 運算元前綴 66H)
  • MOV CL, 55H → B1 55

掌握 OPCODES 手冊查表法,即可完成任意指令與機器碼互轉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved