本章系統整理組合語言指令格式與分類、IBM PC 記憶體佈局與周邊設備、系統程式 (DOS/BIOS) 與配備程式、公用模組願景,以及四大類資料對象 (數據、文字、圖形、概念) 的處理特性。
[前置元] 指令 [目的操作元, 源操作元]
MOV AX, CS:BUF1BYTE PTR/WORD PTR 臨時覆蓋原定義JMP SHORT ABCD| 模式 | 範例 | |||
|---|---|---|---|---|
| 暫存器↔暫存器 (同長度) | MOV AH,BL / XCHG AX,BX | |||
| 暫存器↔緩衝區 | OR BUF1,AX / ADD CL,BYTE PTR BUF1 | |||
| 立即數→暫存器/緩衝區 | TEST DI,8000h / SUB BYTE PTR BUF1,3 | |||
| 記憶體間接定址 | MOV AL,BYTE PTR [DI] / JMP LAB1[BX] | |||
| 無操作元 | PUSH CS / CLI / RET | |||
| 計數器隱含 | LOOP ABCD / REP MOVSB / ROR AX,1 | |||
| 專用暫存器 | OUT DX,AL / MUL BUF1 / STOSB | |||
| 條件/中斷 | JNZ ABCD / INT 10h / IRET |
| 段 | 範圍 | 大小/用途 |
|---|---|---|
| 0000h | 0000-007Fh | 128B / 32 基本中斷 |
| 0008h | 0000-0380h | 896B / 系統管理中斷 |
| 0040h | 0000-00FFh | 256B / 基本程式資料 |
| 0054h | 0000-9C00h | ~34KB / DOS 佔用 |
| 00E1h-09000h 前半 | - | 用戶可控空間 |
| 09000h-0FFFFh | - | DOS 佔用 |
| 0A000h | - | VGA 顯示區 |
| 0A800h | - | EGA 顯示區 |
| 0B000h | - | 文字模式緩衝區 (6845) |
| 0B800h | - | 圖形模式顯示區 (6845) |
| 0C000h-0D000h | - | EMS 擴充記憶體 |
| 0C800h | - | ROM / 硬碟控制程式 |
| 0E000h | - | RAM (1MB 機) / 不可用 |
| 0F000h | - | ROM / BIOS |
段暫存器 16 倍定址 (8088 相容遺留) 導致擴充記憶體產生 EMS 畸形兒。
| DOS (磁碟作業系統) | BIOS (基本中斷服務) | |
|---|---|---|
| 儲存 | 磁碟,開機載入 | ROM,固化 |
| 功能 | 啟動、記憶體管理、部分 I/O | 統一周邊參數傳遞、便利程式師 |
| 修改性 | 易修改 (版本 1.0→4.01) | 機種不變則永不變 |
| 速度 | 較慢 (瞻前顧後) | 較慢 |
| 重疊 | 鍵盤/螢幕等功能重疊 | 同左 |
| 策略 | 兼容即保留渣滓、包袱越重 | 可改入口、擴展功能、生命期長 |
建議優先用 BIOS 中斷,並修改入口增強功能。DOS 面臨 OS/2 取代,大限將至。
熟記 8088 指令時脈與長度是寫好程式前提。以下常見優化:
| 低效寫法 | 代價 | 優化寫法 | 代價 | 說明 |
|---|---|---|---|---|
| CALL ABCD / RET | 4B, 43T | JMP ABCD / JMP SHORT ABCD | 2-3B, 15T | 同功能,直覺語意不同,精簡時應內聯 |
| MOV AX,0 | 3B, 4T | SUB AX,AX / XOR AX,AX | 2B, 3T | XOR 影響旗標,勿用於旗標判斷前 |
| ADD AX,AX | 2B, 3T | SHL AX,1 | 2B, 2T | |
| MOV AX,4 | 3B | MOV AL,4 | 2B | AH 不須為 0 時 |
| MOV AL,46h / MOV AH,0FFh | 4B, 8T | MOV AX,0FF46h | 3B, 4T | |
| CMP CX,0 | 4B, 4T | OR CX,CX / JCXZ XXXX | 2B, 3T / 1指令 | JCXZ 限用 CX |
| SUB BX,1 | 4B, 4T | DEC BX | 1B, 2T | |
| MOV AX,[SI] / INC SI / INC SI | 4B, 21T | LODSW | 1B, 16T | 專用指令 |
| MOV CX,8 / MUL CX | 5B, 137T | SHL AX,1 ×3 / MOV CL,3 / SHL AX,CL | 6B, 6T / 3B | CL 計數器 ≥2 時優於立即數 |
| 多 MOV WORD PTR BUF,0 | 累積大 | SUB AX,AX / REP STOSW + STOSB | 極省 | 保留一暫存器=0 最佳 |
| 連續 CALL 子程式 | 時空雙損 | 前置子程式內聯 / 合併入口 | 節省調用開銷 | 調用次數多時效果顯著 |
| SUB AH,AH / MOV AL,BUF | - | BUF DB ?,0 / MOV AX,WORD PTR BUF | - | 預設高位 0 |
| OR ES:[DI],BH / OR ES:[DI+1],BL | 8B, 32T | XCHG BL,BH / OR ES:[DI],BX / XCHG BH,BL | 7B, 28T | 利用 16 位運算 |
| 濫用 PUSH/POP 保存暫存器 | 15T/12T | 用閒置暫存器 / 雙入口 / 文檔說明破壞暫存器 | 極省 | 系統程式/高頻子程式必嚴謹 |
SHL AX,CL: CL=0→23s, 1→27s, 2→32s, 3→36s, 4→40s, 5→44s, 6→49s, 7→54s
SHL AX,n: n=1→14s, 2→28s, 3→42s, 4→56s, 5→71s, 6→85s, 7→99s
結論:CL≥2 時分開 SHL 較慢,用 CL 計數器更佳
指令分類清晰、記憶體地圖燒腦、BIOS 優於 DOS、周邊介面解耦、文字排序倉頡最優、概念資料為未來、微優化積少成多。組合語言藝術在於對機器架構的透徹理解,與對每一個時脈、位元組的極致珍視。