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

DOS 組合語言巨集庫:DOSMAC.ASM 核心巨集詳解

     編輯:組合語言

前言

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。

程序呼叫與跳轉巨集

  • invoke:呼叫可能為外部的近程序,自動處理 add_ext 外部宣告鏈。
  • transfer:跳轉到可能為外部的標號 (near jump)。
  • short_addr/long_addr:產生字/雙字位址常數,支援外部符號。
  • procedure:定義公開程序 (near/far)。
  • entry:定義程序進入點標號並公開。

外部符號延遲解析機制

一組精巧的巨集 (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 四種條件返回巨集。

技術亮點總結

  1. 模組化設計:透過巨集封裝重複模式,降低核心程式碼複雜度。
  2. 外部符號延遲綁定:創新的巨集鏈機制,解決大型專案中符號前向參考問題。
  3. 程式碼大小優化:jump/condret 根據距離自動選擇指令編碼,節省寶貴的記憶體空間。
  4. 條件組合:廣泛使用 IFIDN/IFDIF/IFNDEF 實現巨集內部邏輯判斷。
  5. 交叉引用控制:.xcref/.cref 精確控制列表檔交叉引用資訊。

結語

DOSMAC.ASM 展示了早期系統程式設計師如何用組合語言巨集構建類高級語言的抽象層。其延遲外部符號解析、指令長度自動優化、條件返回鏈等技巧,在現代編譯器後端優化中仍有對應身影。研讀此檔案不僅能學習 MASM 巨集進階用法,更能體會資源受限環境下的程式設計智慧。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved