子程式 (Subroutine/Procedure) 是組合語言實現**模組化、複用、結構化**的基石。良好的子程式設計直接決定程式的可維護性、可讀性與執行效率。本文系統整理 8086/8088 組合語言子程式設計的四大核心議題:現場保護、參數傳遞、嵌套/遞歸調用、文檔規範。
| 模式 | 機制 | 優點 | 缺點 | 適用場景 |
| 暫存器傳遞 | 約定暫存器 (如 AL=CX=計數) | 極快、無記憶體存取 | 參數極少 (≤4-6 個) | 延時迴圈、單值輸入/輸出 |
| 固定記憶體單元 | 預約變數/緩衝區地址 | 大量資料、結構體 | 佔用靜態空間、難重入、模組耦合高 | 大型資料陣列、共用查表 |
| 堆疊傳遞 | 調用者 `PUSH` 參數/地址,子程式 `BP` 相對定址 | 可重入、支援遞歸、模組解耦、C 慣例相容 | 稍慢 (記憶體存取) | 通用庫函式、系統 API、遞歸演算法 |
堆疊傳遞標準幀結構 (BP 基址)
MYPROC PROC FAR
PUSH BP
MOV BP, SP ; 建立幀指標
; [BP+6] = 返回位址 (FAR: CS:IP)
; [BP+4] = 參數1 (若先壓)
; [BP+2] = 參數2
...
POP BP
RET n ; n = 參數總位元組數,自動清理堆疊
MYPROC ENDP
RET n (立即數返回) 可一次彈出返回位址並調整 `SP` 跳過參數,極其高效
- C 慣例:調用者清理堆疊 → `RET` (無立即數)
- STDCALL/PASCAL:被調用者清理 → `RET n`
三、子程式嵌套與遞歸調用
嵌套調用
- 理論無層數限制,僅受堆疊空間限制 (實模式 64KB 堆疊段)
- 關鍵:每層嚴格保存/還原暫存器,避免跨層污染
- 建議:統一採用「入口全推、出口全彈」模板,消除人為遺漏
遞歸調用
- 必要條件:每次調用擁有**獨立**的參數、區域變數、暫存器現場
- 實現:所有狀態 (參數、暫存器、中間結果) 入堆疊 → 遞歸呼叫 → 出堆疊還原
- 範例:階乘
FACTORIAL PROC NEAR
; 輸入: AX = n, 輸出: DX:AX = n!
CMP AX, 1
JBE BASE_CASE
PUSH AX ; 保存 n
DEC AX
CALL FACTORIAL ; 遞歸 (n-1)!
POP BX ; 取回 n
MUL BX ; DX:AX = (n-1)! * n
RET
BASE_CASE:
MOV DX, 0
MOV AX, 1
RET
FACTORIAL ENDP
- 風險:堆疊溢位、效能指數級下降 (未尾遞歸優化前)
四、子程式文檔規範 (最小必要資訊集)
;=============================================================
; 子程式名稱 : FACTORIAL
; 功能描述 : 計算無號整數階乘 (n!)
; 輸入參數 : AX = n (0~12, 13! 溢位 32 位)
; 輸出參數 : DX:AX = n! (32 位結果)
; 破壞暫存器 : BX, CX, DX, FLAGS
; 使用堆疊 : 2 位元組/遞歸層 (保存 AX)
; 調用慣例 : NEAR CALL, 返回值在 DX:AX
; 範例 : MOV AX, 5 / CALL FACTORIAL → DX:AX=120
; 修改日期 : 2024-01-15
; 作者 : Chen Wei
;=============================================================
進階建議:巨集化標準序言/結語
PROLOGUE MACRO REGS:VARARG
PUSH BP
MOV BP, SP
FOR REG,
PUSH REG
ENDM
ENDM
EPILOGUE MACRO REGS:VARARG
FOR REG,
POP REG
ENDM
POP BP
RET
ENDM
; 使用
MYPROC PROC NEAR
PROLOGUE SI, DI, DS, ES
...
EPILOGUE ES, DS, DI, SI
MYPROC ENDP
總結
組合語言子程式設計的核心在於**契約精神**:明確定義「輸入什麼、輸出什麼、破壞什麼、怎麼調用」,並以程式碼嚴格兌現。掌握現場保護、參數傳遞、嵌套遞歸、文檔規範四大支柱,即可編寫出工業級可維護的組合語言模組,為大型專案奠定堅實基礎。
- 上一篇文章: Win32 組合語言進階:超類別化 實作唯讀十六進位編輯框與 Tab 切換
- 下一篇文章: Win32 組合語言進階:子類別化 實作十六進位過濾編輯框與 Enter 觸發
Copyright ©
程式碼之家 All Rights Reserved