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

DOS 時代組合語言經典:DOSSYM 符號定義原始碼深度解析

     編輯:組合語言

前言

在 DOS 作業系統的黃金年代,組合語言是系統程式設計師的核心工具。DOSSYM.ASM 是 MS-DOS 核心原始碼中的關鍵符號定義檔,定義了作業系統核心運行所需的各種資料結構、常數、中斷向量與系統呼叫編號。雖然時代已久,但研讀這份原始碼仍能讓我們深入理解作業系統底層運作機制,對學習組合語言、逆向工程及系統程式設計極具參考價值。

核心資料結構定義

BIOS 參數區塊 (BPB)

BPB (Bios Parameter Block) 描述磁碟的物理幾何參數,是檔案系統掛載的基礎:

BPBLOCK STRUC
BPSECSZ DW ? ; 每扇區位元組數
BPCLUS  DB ? ; 每叢集扇區數
BPRES   DW ? ; 保留扇區數
BPFTCNT DB ? ; FAT 表數量
BPDRCNT DW ? ; 根目錄項目數
BPSCCNT DW ? ; 總扇區數
BPMEDIA DB ? ; 媒體描述符
BPFTSEC DW ? ; 每 FAT 佔用扇區數
BPBLOCK ENDS

註解中反覆出現的 CAVEAT PROGRAMMER 警告,提醒開發者這些結構屬於 DOS 內部私有介面,極度依賴版本,隨時可能變更,不應在正式文件中公開。

磁碟 I/O 緩衝區標頭

BUFFINFO 結構管理磁碟區塊快取,包含鏈結指標、磁碟機號、髒標記、優先權、扇區號、寫入計數與驅動程式參數指標等欄位。優先權常數(如 FATPRI=30、DIRPRI=15)決定緩衝區置換策略,FAT 與目錄扇區擁有最高優先權。

目錄項目結構

經典的 32 位元組目錄項目:

dir_entry STRUC
dir_name DB 11 DUP (?) ; 檔名(8.3 格式)
dir_attr DB ?            ; 屬性位元組
dir_pad  DB 10 DUP (?)   ; 保留
dir_time DW ?            ; 最後寫入時間
dir_date DW ?            ; 最後寫入日期
dir_first DW ?           ; 起始叢集
dir_size_l DW ?          ; 檔案大小低 16 位
dir_size_h DW ?          ; 檔案大小高 16 位
dir_entry ENDS

屬性位元定義:attr_read_only=1h、attr_hidden=2h、attr_system=4h、attr_volume_id=8h、attr_directory=10h、attr_archive=20h。

檔案配置表 (FAT) 資訊

原始碼詳細說明 12-bit FAT 項目的儲存方式:每三個位元組儲存兩個項目,項目值 0 為未配置,>0FF8h 為檔案結束標記,0FF7h 標記壞軌。這種緊湊編碼在早期有限儲存空間下極為關鍵。

磁碟機參數區塊 (DPB)

DPB 是記憶體中對應每個邏輯磁碟機的完整參數,包含磁碟機號、單元號、扇區大小、叢集遮罩/位移、FAT 起始記錄、FAT 數量、根目錄項目數、第一資料扇區、最大叢集號、FAT 大小、目錄起始扇區、驅動程式指標、媒體描述符、首次存取標記、下一個 DPB 指標、目前目錄叢集與目錄路徑字串。DPBSIZ 等於結構大小。

檔案控制區塊 (FCB) 與系統檔案表 (SFT)

sys_fcb 定義了傳統 FCB 結構(磁碟機、檔名、副檔名、範圍、記錄大小、檔案大小、日期時間、裝置 ID、叢集資訊、隨機記錄欄位)。裝置 ID 位元區分檔案/裝置、原始/熟模式、主控台輸入輸出、時鐘、空裝置等。sft 與 sf_entry 定義系統開啟檔案表,包含參考計數、存取模式、屬性與內嵌 FCB。

進程資料區塊 (PDB) 與記憶體競技場

Process_data_block (PDB) 是程式載入時建立的前綴段,包含終止向量、區塊長度、CP/M 相容呼叫、退出/Ctrl-C/嚴重錯誤向量、父進程 ID、JFN 表、環境區段址、使用者堆疊指標、系統呼叫入口等。arena 結構描述記憶體管理區塊,4Dh 為一般區塊,5Ah 為最後區塊,擁有者為 0 表示空閒。

中斷向量與系統呼叫

原始碼定義兩組中斷向量表:標準 (INTTAB=20h) 與替代 (ALTTAB=0F0h)。標準向量包括:

  • int_abort (20h) 進程終止
  • int_command (21h) DOS 系統呼叫入口
  • int_terminate (22h) 終止地址
  • int_ctrl_c (23h) Ctrl-C 處理
  • int_fatal_abort (24h) 嚴重錯誤
  • int_disk_read (25h)/int_disk_write (26h) 邏輯扇區讀寫
  • int_keep_process (27h) TSR 駐留
  • int_spooler (28h) 列印佇列
  • int_fastcon (29h) 快速主控台

系統呼叫編號 (AH 值) 從 00h (ABORT) 到 57h (FILE_TIMES),涵蓋字元輸入輸出、檔案操作 (FCB/Handle)、目錄管理、記憶體管理、進程控制、日期時間、國際化、IOCTL、複製檔案控制塊、執行程式 (EXEC)、結束、等待、尋找檔案、PDB 管理、DPB 管理、重新命名、檔案時間等。OEM 保留呼叫 F8h-FFh。

錯誤代碼與機器指令定義

XENIX 相容錯誤代碼 (0-18) 及各子功能對應的錯誤代碼別名(如 open_file_not_found = error_file_not_found)。機器指令操作碼:mi_INT=0CDh、mi_Long_JMP=0EAh、mi_Long_CALL=09Ah、mi_Long_RET=0CBh。

標準 I/O 與 XENIX 子功能

標準控制代碼:stdin=0、stdout=1、stderr=2、stdaux=3、stdprn=4。XENIX 開啟模式:open_for_read=0、open_for_write=1、open_for_both=2。

結語

DOSSYM.ASM 如同 DOS 核心的「字典」,集中定義了所有內部資料結構、常數與介面協定。研讀它能幫助我們建立作業系統底層運作的完整心智模型,理解早期 PC 架構下的資源管理、檔案系統與進程控制機制。雖然現代作業系統架構已截然不同,但許多核心概念(如緩衝區管理、檔案控制區塊、中斷向量表、系統呼叫慣例)仍具有普遍參考價值。

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