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

簡明 x86 組合語言教程 (3):暫存器操作與指令集基礎

     編輯:組合語言

2.2 暫存器使用實戰

x86 暫存器是處理器內部高速儲存單元,採用重疊別名設計以相容 16 位元軟體:

EAX 系暫存器結構

EAX (32 bits)
├── AX  (低 16 bits)
│   ├── AH (高 8 bits)
│   └── AL (低 8 bits)
└── 高 16 bits (無直接別名,需透過位移/遮罩存取)

同結構適用於 EBX/ECX/EDX、ESI/EDI (無 8 位元別名)、EBP/ESP (無 8 位元別名)。

進制表示法

除錯器預設顯示十六進位,無需後綴。

基本資料傳送指令

MOV:載入/儲存

mov eax, 012345678h   ; 立即數 → 暫存器
mov ebx, 0abcdeffeh
mov ecx, 1
mov edx, 2

mov eax, ebx          ; 暫存器 → 暫存器 (複製,來源不變)
mov ecx, edx

理解為「送入」或「裝入」而非「移動」。

練習:暫存器交換

mov eax, 0a1234h
mov bx, ax
mov ah, bl
mov al, bh
; 問:EAX 最終值?
; 答:0a1234h → ax=1234h → bx=1234h → ah=34h, al=12h → EAX=00003412h

XCHG:原子交換

xchg ebx, ecx         ; 交換兩 32 位元暫存器
xchg ax, bx           ; 16 位元
xchg al, bl           ; 8 位元
; 硬體保證原子性,比三指令交換更快且無需暫存暫存器

算術與邏輯指令

遞增/遞減

inc eax / dec eax     ; 32 位元
inc ax  / dec ax      ; 16 位元
inc al  / dec al      ; 8 位元
; 常用於迴圈計數器、指標操作

加法/減法

add eax, ebx          ; eax = eax + ebx
add eax, 10h          ; eax = eax + 0x10
sub eax, ecx          ; eax = eax - ecx
; 結果存回第一運算元,影響旗標 (CF, ZF, SF, OF, PF, AF)

邏輯運算

and eax, ebx          ; 位元 AND
or  eax, ecx          ; 位元 OR
xor eax, edx          ; 位元 XOR
not eax               ; 位元 NOT (單運算元)

指令編碼慣例

  • 助記符:MOV, ADD, SUB, XOR... (對應 opcode)
  • 運算元:0~2 個,雙運算元時第一個為目的運算元 (結果存放處)
  • Intel 語法:指令 目的, 來源 (與 AT&T 語法相反)

清零暫存器的三種寫法與效能

進制語法範例
十進位預設 / D 後綴1234, 1234D
十六進位h / H 後綴,首位為字母需前導 00ABCDh, 7FFFh
二進位b / B 後綴1010110b
八進位q/Q/o/O 後綴777Q

原因:XOR/SUB 僅存取暫存器 (CPU 內部),MOV 需取立即數 (指令快取/解碼開銷)。高階語言編譯器常優化為 XOR。

何時考慮手寫組合語言優化?

  1. 熱點確認:Profile 數據顯示該程式碼佔總執行時間顯著比例
  2. 演算法最優:已採用最佳時間/空間複雜度演算法
  3. 編譯器極限:已啟用最高優化 (/O2 /Ot /GL /arch:AVX2 等) 仍無法達標
  4. 可量化收益:預估提升 >5-10% 且可測量驗證
  5. 維護成本可接受:團隊具備組合語言能力,文件完善

小結

掌握 8 大通用暫存器結構、基本資料傳送與算術邏輯指令,即可閱讀大多數組合語言程式碼。理解 XOR EAX,EAX 等慣用優化模式,有助於分析編譯器輸出。下章將進入記憶體操作與定址模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
指令機器碼長度相對速度旗標影響
XOR EAX, EAX2 位元組最快ZF=1, SF=0, PF=1, CF=0, OF=0
SUB EAX, EAX2 位元組次快同上
MOV EAX, 05 位元組 (含立即數)最慢無影響