DOSMAC.ASM 是 MS-DOS 核心原始碼中通用的巨集定義檔,提供了程式結構控制、外部符號管理、程序呼叫/跳轉、條件返回、錯誤處理等基礎建設巨集。這些巨集極大地簡化了核心程式碼的撰寫,統一了程式碼風格,也是早期大型組合語言專案管理的經典範例。
BREAK MACRO subtitle
SUBTTL subtitle
PAGE
ENDM
BREAK 巨集用於在列表檔中插入副標題並分頁,改善原始碼可讀性。原始碼中大量使用 BREAK <...> 區隔各功能區塊。
I_NEED:宣告外部變數並配置空間,根據長度參數 (WORD/DWORD/BYTE) 產生對應的 EXTRN 宣告,自動切換段 (CODE/DATA)。
I_NEED MACRO sym,len
CODE ENDS
DATA SEGMENT BYTE PUBLIC 'DATA'
IFIDN <len>,<WORD> EXTRN &sym:WORD
ELSE IFIDN <len>,<DWORD> EXTRN &sym:DWORD
ELSE EXTRN &sym:BYTE ENDIF ENDIF
DATA ENDS
CODE SEGMENT BYTE PUBLIC 'CODE'
ENDM
I_AM:定義公開資料項目,依大小參數產生 DW/DD/DB/DUP。
add_ext 外部宣告鏈。一組精巧的巨集 (add_ext、def_mac、do_ext、expand_mac、?z0、?i) 實現了「首次使用時才宣告外部符號」的延遲綁定機制。利用巨集鏈 (?zN) 記錄待解析符號,在 do_ext 時一次展開,避免重複宣告,極具啟發性。
error macro code
local a
.xcref
MOV AL,code
transfer SYS_RET_ERR
.cref
ENDM
將錯誤碼放入 AL,跳轉到統一錯誤返回入口 SYS_RET_ERR。
jump:根據目標距離自動選擇短跳轉 (2 位元組) 或近跳轉 (3 位元組),利用 lbl_J 標記優化。
return:標記返回點 ret_l。
condret/makelab:條件返回優化。若返回點在短跳轉範圍內 (≤126 位元組),直接短跳轉;否則產生反條件跳過 return。衍生出 retz/retnz/retc/retnc 四種條件返回巨集。
jump/condret 根據距離自動選擇指令編碼,節省寶貴的記憶體空間。IFIDN/IFDIF/IFNDEF 實現巨集內部邏輯判斷。.xcref/.cref 精確控制列表檔交叉引用資訊。DOSMAC.ASM 展示了早期系統程式設計師如何用組合語言巨集構建類高級語言的抽象層。其延遲外部符號解析、指令長度自動優化、條件返回鏈等技巧,在現代編譯器後端優化中仍有對應身影。研讀此檔案不僅能學習 MASM 巨集進階用法,更能體會資源受限環境下的程式設計智慧。