| 進制 | 語法 | 範例 |
| 十進位 | 預設 / D 後綴 | 1234, 1234D |
| 十六進位 | h / H 後綴,首位為字母需前導 0 | 0ABCDh, 7FFFh |
| 二進位 | b / B 後綴 | 1010110b |
| 八進位 | q/Q/o/O 後綴 | 777Q |
除錯器預設顯示十六進位,無需後綴。
基本資料傳送指令
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 語法相反)
清零暫存器的三種寫法與效能
| 指令 | 機器碼長度 | 相對速度 | 旗標影響 |
XOR EAX, EAX | 2 位元組 | 最快 | ZF=1, SF=0, PF=1, CF=0, OF=0 |
SUB EAX, EAX | 2 位元組 | 次快 | 同上 |
MOV EAX, 0 | 5 位元組 (含立即數) | 最慢 | 無影響 |
原因:XOR/SUB 僅存取暫存器 (CPU 內部),MOV 需取立即數 (指令快取/解碼開銷)。高階語言編譯器常優化為 XOR。
何時考慮手寫組合語言優化?
- 熱點確認:Profile 數據顯示該程式碼佔總執行時間顯著比例
- 演算法最優:已採用最佳時間/空間複雜度演算法
- 編譯器極限:已啟用最高優化 (
/O2 /Ot /GL /arch:AVX2 等) 仍無法達標
- 可量化收益:預估提升 >5-10% 且可測量驗證
- 維護成本可接受:團隊具備組合語言能力,文件完善
小結
掌握 8 大通用暫存器結構、基本資料傳送與算術邏輯指令,即可閱讀大多數組合語言程式碼。理解 XOR EAX,EAX 等慣用優化模式,有助於分析編譯器輸出。下章將進入記憶體操作與定址模式。
- 上一篇文章: 簡明 x86 組合語言教程 (4):實模式與保護模式記憶體架構全解析
- 下一篇文章: 簡明 x86 組合語言教程 (2):處理器架構與暫存器總覽
Copyright ©
程式碼之家 All Rights Reserved