跳轉至內容

MS-DOS 7 系統程式設計入門 / 附錄

來自華夏公益教科書,開放的書籍,為開放的世界

附錄

A.01 PC 的主要資料結構

[編輯 | 編輯原始碼]

BIOS 和 DOS 都會將其重要資料儲存在計算機記憶體中專門分配的區域。這些區域內的資料位置並非固定不變,可能會根據 BIOS 和 DOS 的版本而有所不同。因此,不應直接定址系統結構中的資料,而應透過本書第 8 章中描述的特殊函式訪問。另一個原因是,除非呼叫相應的服務函式,否則無法正確更新資料。

然而,可能需要直接訪問系統資料結構。這使您能夠獲得比透過服務函式允許知道的更多資訊。出於除錯目的,您可能需要檢視資料“本來面目”,而不進行更新。您可能需要進行干預,更改某些設定以引發所需的後果。當然,任何此類操作均完全由您自行承擔風險,但它可能為您提供其他情況下無法獲得的機會。

A.01-1. BIOS 資料區

[編輯 | 編輯原始碼]

當計算機開機時,其 BIOS 系統開始收集資料並整理其資料區域。在與 AT 相容的計算機中,BIOS 資料區域佔用 0040:0000h–0040:00FFh 處的 100h 位元組。下表給出了選定資料項的一般分配情況,並參考了軟盤驅動器 (A.08-1)、影片系統 (A.10-6)、鍵盤 (A.02-3) 和其他硬體 (A.11-1) 的單獨資料表。

偏移量 大小 描述
00h 2 COM-1 埠基本 I/O 地址
02h 2 COM-2 埠基本 I/O 地址
08h 2 LPT-1 埠基本 I/O 地址
0Eh 2 輔助 BIOS 資料段 (如果不存在則為 0000h)
10h 2 已安裝硬體字 (A.11-1)
12h 1 POST 自檢狀態
13h 2 基本記憶體大小(以千位元組為單位)
17h 39 鍵盤的緩衝區和標誌 (A.02-3)
3Eh 7 軟盤驅動器狀態暫存器 (A.08-1)
49h 22 當前影片模式資料 (A.10-6)
67h 4 CPU 重置後的重啟地址 [註釋 4 到 A.12-1]
6Ch 4 計時器滴答聲,從午夜開始計數
70h 1 天數,在 INT 1A\AH=00h 呼叫後重置
71h 1 Ctrl-Break 鍵按下後設置位 7
72h 2 POST 測試的規定操作 [註釋 1]
74h 1 硬碟的最後一次操作錯誤程式碼 (A.06-01)
75h 1 硬碟驅動器數量
77h 1 硬碟驅動器 I/O 埠地址
78h 1 LPT-1 埠超時計數器
7Ch 1 COM-1 埠超時計數器
7Dh 1 COM 2 埠超時計數器
80h 4 鍵盤緩衝區的起始和結束偏移量 (A.02-3)
84h 8 影片控制暫存器 (A.10-6)
8Ch 3 硬碟控制器狀態暫存器
8Fh 7 軟盤控制器資訊 (A.08-1)
96h 2 鍵盤狀態位元組 (A.02-3)
98h 4 指向等待完成標誌的指標 (INT 15\AX=8300h)
9Ch 4 計時器的等待計數(以微秒為單位)
A0h 1 系統計時器標誌
位 0:已發生 INT 15\AH=86h 的呼叫
位 7:等待時間已過
CEh 2 自上次啟動以來的天數
F0h 16 應用程式間通訊區域
註釋
  1. ^ a b 重新啟動後,由跳轉到 F000:FFF0h 地址遠跳轉啟動,[註釋 4 到 A.12-1] POST 測試效能取決於 0040:0072h 記憶體單元中儲存的內容。
    0000h – “冷”啟動(帶記憶體測試的完整 POST)
    1234h – “熱”啟動(繞過記憶體測試)
  2. 由於 BIOS 資料區域中的資料分配可能取決於 BIOS 版本,因此由您來決定在特定偏移量處的資料項是否確實是您預期在該處找到的項。

A.01-2 DOS 列表中的選定條目

[編輯 | 編輯原始碼]

列表是 IO.SYS 載入程式在 DOS 載入過程開始時建立的基本資料結構。指向 DOS 列表的第一個位元組的指標由 INT 21\AH=52h 函式 (8.02-59) 返回。圖 10(在附錄 A.03-3 中)說明了訪問列表的過程。以下表格給出了有關 DOS 列表中的資料項的選定資訊。

偏移量 大小 描述
– 02h 2 第一個 MSB 的段地址 (A.12-7)
00h 4 指向第一個 DPB 塊的指標 [註釋 1]
04h 4 指向 SFT(系統檔案表,A.01-4)的指標
0Ch 4 指向活動 CON(控制檯)裝置驅動程式的指標
10h 2 任何驅動器上的每個扇區的最大位元組數
16h 4 指向 CDS 結構中的第一條記錄的指標 (A.03-3)
20h 1 已註冊驅動器(塊裝置)的數量
21h 1 CDS 結構中記錄的數量 (A.03-3)
22h 18 實際的 NUL 裝置驅動程式頭 [註釋 2]
34h 1 由 JOIN.EXE 建立的虛擬驅動器數量
37h 4 指向 SETVER 表的指標 (如果不存在則為 0000:0000h)
3Dh 2 最後執行程式的 PSP 段
43h 1 引導驅動器 (01h = A:,03h = C:,依此類推)
45h 2 擴充套件記憶體大小(以千位元組為單位)。
註釋
  1. ^ DPB 塊(驅動器引數塊,A.03-1)按鏈式排列,因此指向下一個 DPB 的指標位於前一個 DPB 中的偏移量 19h 處。
  2. ^ 偏移量 22h 處的 NUL 裝置驅動程式頭是驅動程式頭鏈中的第一個。每個頭中的第一個雙字是指向下一個頭的指標。另一種獲取指向第二個驅動程式頭的指標的方法是透過 INT 2F\AX=122Ch。鏈中的最後一個頭以雙字 FFFFh 開頭。

A.01-3. DOS 可交換資料區域中的選定專案

[編輯 | 編輯原始碼]

DOS 可交換資料區域 (SDA) 的當前地址和大小由 INT 21\AX=5D06h 函式 (8.02-70) 返回。SDA 儲存不斷更新的資料,包括主要的 DOS 系統堆疊。這些資料反映了每個當前時刻不斷變化的 DOS 狀態。可交換區域的總大小可能高達幾千位元組,具體取決於堆疊的大小。

SDA 區域被稱為“可交換”,因為其交換是獲取 DOS 可重入性的主要機制,即 TSR 和處理程式呼叫 DOS 函式的機會,而這些 TSR 和處理程式本身可以在之前 DOS 函式的執行尚未完成時被呼叫。如果中斷處理程式發現關鍵錯誤標誌(在 SDA 中的偏移量 00h 處)或 InDOS 標誌(在 SDA 中的偏移量 01h 處)具有非零值,則此處理程式的呼叫已中斷 DOS 函式的執行,然後對任何 DOS 函式的下一個呼叫都可能更改 SDA 區域中的資料,從而使返回到被中斷程式的正確恢復變得不可能。雖然有時可以恢復被中斷的程式 (8.02-28, 8.02-87),但最徹底的解決方案是在呼叫任何 DOS 函式之前儲存 SDA 的內容,並在之後根據儲存的資料恢復 SDA 狀態。還應考慮到 INT 21\AX=5D06h 函式本身 (8.02-70) 不可重入;因此,應該在處理程式初始化期間預先進行對 SDA 地址的呼叫,以便在中斷時,處理程式可以讀取準備好的 SDA 地址,而無需對 INT 21\AX=5D06h 進行新的呼叫。

下表顯示了可交換資料區域中的選定資料項

偏移量 大小 描述
00h 1 關鍵錯誤標誌(“ErrorMode”)
01h 1 InDOS 標誌 (INT 21\AH=34h,8.02-28)
02h 1 導致關鍵錯誤的驅動器,如果無錯誤則為 FFh
03h 1 最後一次錯誤的位置 (A.06-4)
04h 2 最後一次錯誤的擴充套件程式碼 (A.06-1)
06h 1 最後一次錯誤後的建議操作 (A.06-3)
07h 1 最後一次錯誤的類別 (A.06-2)
08h 4 最後一次錯誤發生時的 ES:DI 指標
0Ch 4 DTA 的當前地址 (8.02-16)
10h 2 當前程式的 PSP 段(程序識別符號)
14h 2 來自上次程式終止的錯誤級別值
16h 1 當前邏輯磁碟號
17h 1 BREAK 標誌 (3.01, 4.02, 8.02-25)
2Ah 1 對 INT 24 (8.02-84) 呼叫的 FAIL 響應標誌
2Bh 1 允許的 INT 24 操作 (8.02-84)
30h 1 月日
31h 1 月份
32h 2 年份,從 1980 年開始計數
34h 2 自 1980-01-01 以來的天數
36h 1 星期幾 (0 = 星期日)

A.01-4 系統檔案表結構

[編輯 | 編輯原始碼]

訪問控制代碼與其對應的“開啟”物件之間的關聯由 DOS 儲存在一個錶鏈佇列中,稱為 SFT(系統檔案表)。這個名稱並不完全正確,因為“開啟”的物件可能不僅僅是檔案,還可能是分配的 XMS 區域、驅動程式的訪問通道和其他稱為“字元裝置”的物件。

指向第一個 SFT 的指標位於列表中的偏移量 04h 處 (A.01-2)。每個 SFT 從偏移量 00h 處開始,其中包含一個指向下一個 SFT 的雙字指標,除了最後一個 SFT,它在偏移量 00h 處用雙字 FFFFh 標記。這種結構可以很容易地從第一個 SFT 跟蹤到最後一個 SFT。每個 SFT 中偏移量 04h 處的一個字聲明瞭此特定 SFT 中條目的數量。每個條目對應於一個“開啟”的物件。SFT 條目的總數受 CONFIG.SYS 檔案中的 FILES 規範限制 (4.12)。

“開啟”到給定程式的 SFT 條目的數量儲存在該程式所屬的 PSP (A.07-1) 中的偏移量 18h 處的 JFT 中。對應的“開啟”物件使用控制代碼進行定址 (INT 21\AH=3Dh,8.02-33),這些控制代碼根據其在 JFT 中的數字的分配順序來識別 SFT 條目。與給定控制代碼對應的 SFT 條目的編號也可以透過 INT 2F\AX=1220h (8.03-11) 找到。然後,INT 2F\AX=1216h 函式 (8.03-09) 在給出 SFT 條目編號的情況下,返回指向該條目的指標。有關活動 SFT 條目和對應物件的某些資訊可以透過 INT 21\AX=4400h 函式 (8.02-40) 獲得。

前三個 SFT 條目編號具有固定的預設關聯:00h – AUX 通道 (COM1 埠),01h – CON 裝置(控制檯),02h – PRN 裝置 (LPT1 埠)。這 3 個 SFT 條目編號會自動寫入每個程式的 JFT 表中。它們在 JFT 中的分配順序 (01h, 01h, 01h, 00h, 02h) 定義了關聯的控制代碼:0000h – 用於 STDIN 通道,0001h – 用於 STDOUT 通道,0002h – 用於 STDERR 通道,0003h – 用於 COM1 埠,0004h – 用於 LPT1 埠。控制代碼 0005h 及更高的 SFT 條目是在 INT 21\AH=3Dh (8.02-33) 和 INT 21\AX=6C00h (8.02-78) 函式的請求下建立的。

每個 SFT 表的第一項從偏移量 06h 開始。由於每個項都有固定的長度 3Bh,因此可以輕鬆計算出後續項的起始位置。下表指定了每個項中選定的資料項,偏移量從該項的起始位置算起。表的第一個列 "CDE" 對應於 "字元裝置" 項,第二列 "OFE" 對應於與普通檔案關聯的項。

CDE OFE 大小 描述
00h 00h 2 指向物件的控制代碼數(無則為 FFFFh)
02h 02h 1 訪問和共享條件 (A.09-4)
  03h 1 標誌 [註釋 1]
  04h 1 檔案的屬性 (A.09-2)
05h 05h 2 物件的資訊字(檔案為 A.04-2,其他為 A.05-2)
07h 07h 4 指向檔案的 DPB (A.03-1) 或者指向其他物件的驅動程式頭 (A.05-1)
  0Bh 2 起始簇號(僅限本地檔案)
  0Dh 2 檔案的打包時間 (INT 21\AX=5700h, 8.02-63)
  0Fh 2 檔案的打包日期 (INT 21\AX=5700h, 8.02-63)
  11h 4 檔案的大小
  15h 4 檔案的指標位置 (INT 21\AH=42h, 8.02-38)
  19h 2 上次訪問簇的相對編號
19h   4 指向 IFS 重定向記錄的指標
  1Bh 4 包含檔案項的目錄扇區的編號
  1Fh 1 檔案項在目錄扇區中的編號
20h 20h 11 檔案或其他物件的 FCB 格式名稱 (A.09-5)
  31h 2 檔案所有者程序的識別符號(PSP 段)
  35h 2 上次訪問簇的絕對編號
37h   4 指向 IFS 驅動程式的指標,普通檔案為 0000:0000h
註釋
  1. ^ 03h 處的標誌位元組包含 INT 21\AX=6C00h 函式 (8.02-78) 指定的所有 BH 暫存器設定。此外,標誌位元組中位 7 的狀態標記透過 FCB 開啟的檔案。

A.02 鍵盤程式碼和國家/地區適配

[edit | edit source]

A.02-1 鍵程式碼

[edit | edit source]

即使在作業系統尚未載入時,也必須始終啟用使用者透過鍵盤控制 PC。因此,主機板的硬體和 BIOS 系統負責與不同型別的鍵盤相容。當 PC 開啟時,其 BIOS 系統載入 INT 09 和 INT 16 處理程式,提供各種鍵盤功能。

鍵盤訊號由鍵盤控制器接收並轉換。它對每個按鍵狀態變化(按下或釋放)做出響應,為埠 60h 準備程式碼,並透過 IRQ 01 中斷請求線傳送請求。請求呼叫 INT 09 處理程式。某些鍵會導致鍵盤控制器傳送一系列程式碼,從而多次呼叫 INT 09 處理程式。INT 09 處理程式從埠 60h 讀取的程式碼通常是某個鍵的掃描碼,但它也可能是服務程式碼。從 E0h 到 FFh,以及 00h 和 AAh 的程式碼被解釋為服務程式碼。負責特殊按鍵識別任務的服務程式碼稱為字首

E0h - 用於區分那些為了與過時的 84 鍵鍵盤相容而被賦予相同掃描碼的鍵。
E1h - 用於具有雙位元組掃描碼的鍵。在普通鍵盤中,只有一個這樣的鍵:Pause/Break。[註釋 6]

從埠 60h 讀取字首會使 INT 09 處理程式準備好對即將接收到的掃描碼進行特定解釋,該掃描碼將在下次呼叫 INT 09 時接收。在下表中,第二列(INT 09)顯示了 INT 09 處理程式從埠 60h 讀取的按鍵的十六進位制掃描碼。表中沒有顯示按鍵釋放程式碼,因為可以很容易地透過設定按鍵掃描碼的第 7 位來推匯出釋放程式碼。例如,鍵 "A" 傳送按鍵(按下)程式碼 1Eh,因此它的釋放程式碼是 9Eh。但是,那些在 E0h 或 E1h 字首之後傳送的掃描碼將與該字首一起顯示在表的第二列中。當然,相同鍵的釋放程式碼也以相同的字首開頭。

從埠 60h 讀取的 "原始" 掃描碼由 INT 09 和 INT 16 處理程式轉換為一對新的資料 - 統一掃描碼和 ASCII 值,分別對應於按下的(或釋放的)鍵。只有這組資料對將被透過 INT 16 傳送鍵盤輸入請求的程式呈現。統一掃描碼通常等於按下掃描碼,但如果同時按下 "功能" 鍵,則可能會改變:SHIFT、CTRL 或 ALT。每個 "功能" 鍵都有自己的掃描碼(在下表的第二列中)。INT 09 處理程式會考慮 "功能" 鍵的掃描碼,但不會將其儲存在鍵盤緩衝區中。 "功能" 鍵的狀態透過 INT 16\AH=12 函式 (8.01-85) 返回的狀態字來表示。下表表示最常用的 104 鍵 "增強" 鍵盤的鍵。表中第一列的鍵名之前的 "num" 表示鍵盤右側的數字小鍵盤的鍵。顯示的這些鍵的程式碼對應於 NUMLOCK 開關的關閉狀態。[註釋 6] 資料順序由第二列中鍵的掃描碼值定義。

下表中第 3-6 列的十六進位制數字表示 INT 16\AH=10h 函式 (8.01-83) 在 AX 暫存器中返回的資料。每個數字的左邊兩位定義了在 AH 暫存器中返回的統一掃描碼,右邊兩位定義了在 AL 暫存器中返回的相應字元的 ASCII 碼。第 3 列(AX)中的資料對應於沒有同時按下任何 "功能" 鍵的按鍵。第 4 列(SHIFT)中的資料對應於按下 SHIFT 鍵的情況,第 5 列(CTRL)中的資料對應於按下 CTRL 鍵的情況,第 6 列(ALT)中的資料對應於按下 ALT 鍵的情況。任何特定值的空白表示相應的鍵或鍵組合由 BIOS 感知,但不會透過 INT 16 處理程式報告。

INT09 AX SHIFT CTRL ALT 註釋
Esc 01 011B 011B 011B 0100 [註釋 1]
1 ! 02 0231 0221   7800
2 @ 03 0332 0340 0300 7900
3 # 04 0433 0423   7A00
4 $ 05 0534 0524   7B00
5 % 06 0635 0625   7C00
6 ^ 07 0736 075E 071E 7D00
7 & 08 0837 0826   7E00
8 * 09 0938 092A   7F00
9 ( 0A 0A39 0A28   8000
0 ) 0B 0B30 0B29   8100
_ 0C 0C2D 0C5F 0C1F 8200
= + 0D 0D3D 0D2B   8300
Backspace 0E 0E08 0E08 0E7F 0E00 [註釋 1]
Tab 0F 0F09 0F00 9400 A500 [註釋 1][註釋 2]
Q 10 1071 1051 1011 1000
W 11 1177 1157 1117 1100
E 12 1265 1245 1205 1200
R 13 1372 1352 1312 1300
T 14 1474 1454 1414 1400
Y 15 1579 1559 1519 1500
U 16 1675 1655 1615 1600
I 17 1769 1749 1709 1700
O 18 186F 184F 180F 1800
P 19 1970 1950 1910 1900
[ { 1A 1A5B 1A7B 1A1B 1A00 [註釋 1]
] } 1B 1B5D 1B7D 1B1D 1B00 [註釋 1]
Enter 1C 1C0D 1C0D 1C0A 1C00 [註釋 1]
num Enter E0 1C E00D E00D E00A A600 [註釋 1][註釋 3]
Left Ctrl 1D         [註釋 4]
Right Ctrl E0 1D         [註釋 4]
A 1E 1E61 1E41 1E01 1E00
S 1F 1F73 1F53 1F13 1F00
D 20 2064 2044 2004 2000
F 21 2166 2146 2106 2100
G 22 2267 2247 2207 2200
H 23 2368 2348 2308 2300
J 24 246A 244A 240A 2400
K 25 256B 254B 250B 2500
L 26 266C 264C 260C 2600
; : 27 273B 273A   2700 [註釋 1]
' " 28 2827 2822   2800 [註釋 1]
` ~ 29 2960 297E   2900 [註釋 1]
Left Shift 2A         [註釋 4]
SysRq E0 2A     7200   [註釋 5]
\ | 2B 2B5C 2B7C 2B1C 2B00 [註釋 1]
Z 2C 2C7A 2C5A 2C1A 2C00
X 2D 2D78 2D58 2D18 2D00
C 2E 2E63 2E43 2E03 2E00
V 2F 2F76 2F56 2F16 2F00
B 30 3062 3042 3002 3000
N 31 316E 314E 310E 3100
M 32 326D 324D 320D 3200
, < 33 332C 333C   3300 [註釋 1]
. > 34 342E 343E   3400 [註釋 1]
/ ? 35 352F 353F   3500 [註釋 1]
num / E0 35 E02F E02F 9500 A400 [註釋 1][註釋 2][註釋 3]
Right Shift 36         [註釋 4]
num * 37 372A 372A 9600 3700 [註釋 1][註釋 2]
Left Alt 38         [註釋 4]
Right Alt E0 38         [註釋 4]
Spacebar 39 3920 3920 3920 3920
Caps Lock 3A         [註釋 4]
F1 3B 3B00 5400 5E00 6800
F2 3C 3C00 5500 5F00 6900
F3 3D 3D00 5600 6000 6A00
F4 3E 3E00 5700 6100 6B00
F5 3F 3F00 5800 6200 6C00
F6 40 4000 5900 6300 6D00
F7 41 4100 5A00 6400 6E00
F8 42 4200 5B00 6500 6F00
F9 43 4300 5C00 6600 7000
F10 44 4400 5D00 6700 7100
NumLock 45         [註釋 4]
Pause E1 1D 45         [註釋 4][註釋 6]
ScrollLock 46         [註釋 4]
數字鍵 7 47 4700 4737 7700 0007 [註釋 7]
Home E0 47 47E0 47E0 77E0 9700 [註釋 1][註釋 3]
數字鍵 8 48 4800 4838 8D00 0008 [註釋 2][註釋 7]
向上箭頭 E0 48 48E0 48E0 8DE0 9800 [註釋 1][註釋 2][註釋 3]
數字鍵 9 49 4900 4939 8400 0009 [註釋 7]
PgUp E0 49 49E0 49E0 84E0 9900 [註釋 1][註釋 3]
數字鍵 - 4A 4A2D 4A2D 8E00 4A00 [註釋 1][註釋 2]
數字鍵 4 4B 4B00 4B34 7300 0004 [註釋 7]
向左箭頭 E0 4B 4BE0 4BE0 73E0 9B00 [註釋 1][註釋 3]
數字鍵 5 4C 4C00 4C35 8F00 0005 [註釋 2][註釋 7]
數字鍵 6 4D 4D00 4D36 7400 0006 [註釋 7]
向右箭頭 E0 4D 4DE0 4DE0 74E0 9D00 [註釋 1][註釋 3]
數字鍵 + 4E 4E2B 4E2B 9000 4E00 [註釋 1][註釋 2]
數字鍵 1 4F 4F00 4F31 7500 0001 [註釋 7]
End E0 4F 4FE0 4FE0 75E0 9F00 [註釋 1][註釋 3]
數字鍵 2 50 5000 5032 9100 0002 [註釋 2][註釋 7]
向下箭頭 E0 50 50E0 50E0 91E0 A000 [註釋 1][註釋 2][註釋 3]
數字鍵 3 51 5100 5133 7600 0003 [註釋 7]
PgDn E0 51 51E0 51E0 76E0 A100 [註釋 1][註釋 3]
數字鍵 0 52 5200 5230 9200   [註釋 2][註釋 7]
Ins E0 52 52E0 52E0 92E0 A200 [註釋 1][註釋 2][註釋 3]
數字鍵 . 53 5300 532E 9300   [註釋 2][註釋 7]
Del E0 53 53E0 53E0 93E0 A300 [註釋 1][註釋 2][註釋 3]
F11 57 8500 8700 8900 8B00 [註釋 8]
F12 58 8600 8800 8A00 8C00 [註釋 8]
左Windows鍵 E0 5B B6E0 C2E0 CEE0 DAE0 [註釋 8]
右Windows鍵 E0 5C B7E0 C3E0 CFE0 DBE0 [註釋 8]
Menu E0 5D B8E0 C4E0 D0E0 DCE0 [註釋 8]
註釋
  1. ^ 當“功能鍵”ALT被按下時,INT16\AH=00h 函式不會對該按鍵的輸入做出響應。
  2. ^ 當“功能鍵”CTRL被按下時,INT16\AH=00h 函式不會對該按鍵的輸入做出響應。
  3. ^ INT16\AH=00h 函式返回 00h 而不是 ASCII 程式碼 E0h,除了兩個例外:在“數字鍵 /”之後返回 ASCII 程式碼 35h,在“數字鍵 Enter”之後返回 ASCII 程式碼 1Ch。
  4. ^ 該按鍵的程式碼不會寫入鍵盤緩衝區,但會影響 INT 09 處理程式對其他按鍵程式碼的翻譯。
  5. ^ 鍵盤控制器對 SysRq 按鍵響應為“E0 2A E0 37”程式碼序列,對 SysRq 按鍵釋放響應為反向序列“E0 B7 E0 AA”。一些 INT 16 處理程式可能對 CTRL-SysRq 鍵組合返回其他響應。
  6. ^ a b c d Pause/Break 按鍵的釋放不會單獨被註冊。每次按下 Pause/Break 按鍵後,其按下程式碼緊隨釋放程式碼,形成序列“E1 1D 45 E1 9D C5”。INT 09 處理程式在收到這種程式碼序列後,會重置鍵盤緩衝區並呼叫 INT 1B (8.01-95)。
  7. ^ 顯示的按鍵程式碼對應於 Numlock 開關關閉狀態。當 Numlock 開關開啟時,表中第三列和第四列顯示的程式碼會交換。
  8. ^ INT 16\AH=00h 函式對這些按鍵沒有響應。
  9. 幾種型號的鍵盤具有三個輔助鍵用於電源控制: “電源”,“休眠”和“喚醒”。這些按鍵對應的掃描碼分別為 E0 5E,E0 5F,E0 63。

A.02-2 鍵盤佈局和國家內碼表

[編輯 | 編輯原始碼]

下表包含了 Microsoft Windows 95/98 版本中 MS-DOS 7 國家適配的相關資料。這些資料包括 COUNTRY.SYS 資料檔案、三個包含鍵盤佈局的檔案(KEYBOARD.SYS,KEYBRD2.SYS 和 KEYBRD3.SYS)以及四個包含不同內碼表字型的檔案(EGA.CPI,EGA2.CPI,EGA3.CPI 和 ISO.CPI)。

表中的第一列(縮寫)包含文字國家程式碼,第三列(ID)包含鍵盤佈局識別符號。這兩個專案對於 KEYB.COM 驅動程式(5.02-04)的命令列組成是必要的。佈局識別符號僅對使用多個鍵盤佈局的國家/地區是必要的,對於其他國家/地區可以省略。

表的第四列(Keyb)指定應載入哪個包含鍵盤佈局的檔案:數字 1 對應 KEYBOARD.SYS,數字 2 對應 KEYBRD2.SYS,數字 3 對應 KEYBRD3.SYS,“任何”對應這三個檔案中的任何一個。

表的第五列(程式碼)顯示數字國家程式碼,用於使用 COUNTRY 命令(4.05)載入 COUNTRY.SYS 資料檔案(5.02-01)。

表的最後一列(第七列)顯示了在不同國家/地區使用的內碼表。內碼表的編號對於 MORE.COM 工具(6.18)是必要的,它必須從每個 *.CPI 檔案中的一組字型中選擇一個字型(9.01-02 中的示例)。ISO.CPI 檔案提供國際標準化組織推薦的字型。專有的 Microsoft 字型位於 EGA*.CPI 檔案中,每個檔案中大約有 5 個字型。因此,表的第六列(Ega*)指定應載入哪個 EGA*.CPI 檔案:數字 1 對應 EGA.SYS 檔案,數字 2 對應 EGA2.CPI,數字 3 對應 EGA3.CPI,“任何”對應這些檔案中的任何一個。

縮寫 國家/地區 ID Keyb 程式碼 Ega* 內碼表
GR 奧地利 任何 043 任何 CP850
BE 比利時 1,2 032 任何 CP850
BG 保加利亞 442 2 359 3 CP855
BR 巴西 274, 275 1,2 055 任何 CP850
CF 加拿大法語 058 1,2 002 1 CP863
CZ 捷克共和國 243 任何 042 任何 CP852
DK 丹麥 1,3 045 1 CP865
SU 芬蘭 任何 358 任何 CP850
FR 法國 120, 189 1,3 033 任何 CP850
GR 德國 任何 049 任何 CP850
GK 希臘 319 2 030 2 CP737, 869
HU 匈牙利 任何 036 任何 CP852
IS 冰島 161 2 354 2 CP861
IT 義大利 141,142 任何 039 任何 CP850
LA 拉丁美洲 1 003 任何 CP850
NL 荷蘭 1,3 031 任何 CP850
NO 挪威 1,2 047 1 CP865
PL 波蘭 任何 048 任何 CP852
PO 葡萄牙 1 351 1 CP860
RO 羅馬尼亞 333 2 040 任何 CP852
RU 俄羅斯 441 2,3 007 3 CP866
SL 斯洛伐克 245 任何 421 任何 CP852
SP 西班牙 1,3 034 任何 CP850
SV 瑞典 任何 046 任何 CP850
SF 瑞士法語 1,3 041 任何 CP850
TR 土耳其 440, 179 2 090 2 CP857
UK 英國 + 愛爾蘭 166, 168 任何 044 任何 CP850
US 美國 + 澳大利亞 任何 001 1,3 CP437
YC 南斯拉夫西里爾文 118 2 038 3 CP855
YU 南斯拉夫拉丁文 234 任何 038 任何 CP852

註釋 1:KEYBOARD.SYS 是唯一支援鍵盤佈局打字機模式的檔案。

註釋 2:Microsoft 的國家適配檔案與 KEYRUS.COM 驅動程式(5.02-05)不相容。後者使用內部程式碼表和鍵盤佈局。

註釋 3:其他國家/地區(中國、以色列、日本等)的字型僅隨 Microsoft 作業系統的特定國家/地區版本提供。

A.02-3 BIOS 資料區中的鍵盤資料欄位

[編輯 | 編輯原始碼]

下表顯示了 BIOS 資料區中鍵盤資料的分配。所有偏移量相對於 BIOS 資料區開始的段地址 0040h 給出。

偏移量 大小 描述
17h 2 INT 16\AH=12h (8.01-85) 中 AX 返回的標誌
19h 1 透過 ALT 加 ASCII 程式碼的字元輸入
1Ah 2 鍵盤緩衝區中下一個字元的指標
1Ch 2 鍵盤緩衝區中第一個空單元的指標
1Eh 32 鍵盤的迴圈緩衝區
71h 1 標誌 如果按下了 Ctrl-Break,則位 7 設定
80h 2 鍵盤緩衝區的起始偏移量(通常為 1Eh)
82h 2 鍵盤緩衝區的 END+1 偏移量(通常為 3Eh)
96h 1 標誌 位 0 設定:最後讀取的程式碼是 E1h 字首
      位 1 設定:最後讀取的程式碼是 E0h 字首
      位 2 設定:已按下右 CTRL 鍵
      位 3 設定:已按下右 ALT 鍵
      位 4 設定:已安裝“增強型”鍵盤
      位 6 設定:已收到 2 位元組掃描碼的第一個位元組
97h 1 狀態 位 0 設定:Scroll Lock LED 處於開啟狀態
      位 1 設定:Num Lock LED 處於開啟狀態
      位 2 設定:Caps Lock LED 處於開啟狀態
      位 7 設定:鍵盤已傳送錯誤標誌

註釋 1:顯示的資料分配可能取決於 BIOS 版本(A.01-1)。

A.02-4 國家適配引數塊

[編輯 | 編輯原始碼]

INT 21\AX=6501h 函式(8.02-74)返回包含當前活動國家適配引數的資料塊。INT 21\AX=7002h 函式(8.02-74 中的註釋 3)接受相同結構的資料塊,定義 MS-DOS 7 的國家適配。

偏移量 大小 描述
00h 1 = 01h on return [註釋 1]
01h 2 返回時的表大小 [註釋 1]
03h 2 以十六進位制形式表示的國家程式碼 (A.02-2)
05h 2 十六進位制內碼表編號 (A.02-2)
07h 2 日期格式
= 0000h – 美國 (mm dd yy)
= 0001h – 歐洲 (dd mm yy)
= 0002h – 日本 (yy mm dd)
09h 5 ASCII 貨幣名稱,以 00h 位元組結尾
0Eh 2 數字的千位分隔符
10h 2 整數和小數部分的分隔符
12h 2 ASCII 日期分隔符字元
14h 2 ASCII 時間分隔符字元
16h 1 位 0 設定:貨幣符號位於值之後(否則位於之前)
    位 1 設定:值和貨幣符號之間有空格
    位 2 設定:貨幣符號替換小數點
17h 1 貨幣小數點後的位數
18h 1 位 1 設定:24 小時制時鐘,否則為 12 小時制時鐘
19h 4 大小寫對映例程的入口地址 [註釋 2]
2Dh 2 ASCII 資料列表分隔符字元
註釋
  1. ^ 當資料塊被髮送到 INT 21\AX=7002h 函式時,此項將被忽略。
  2. ^ 大小寫對映例程將國家字元(ASCII 程式碼大於 80h 的字元)轉換為大寫或小寫。大小寫對映例程應使用 CALL FAR 命令(7.03-08)呼叫。AL 暫存器用於傳送要轉換的字元的 ASCII 程式碼以及返回結果。

A.02-5 國家/地區相關檔名限制

[編輯 | 編輯原始碼]

INT 21\AX=6505h 函式(參見 8.02-74 中的注 1)返回指向此表的指標。

偏移量 大小 描述
00h 2 表的尺寸(此詞不應計入)
03h 1 檔名允許的最低字元值
04h 1 檔名允許的最高字元值
06h 1 禁止範圍內的第一個字元的值
07h 1 禁止範圍內的最後一個字元的值
09h 1 檔名終止程式碼的數量 ("N")
0Ah N 用於終止檔名的 ASCII 程式碼

A.02-6 可用內碼表資訊

[編輯 | 編輯原始碼]

下表顯示了 DISPLAY.SYS (5.02-02) 驅動程式資料塊的結構;INT 2F\AX=AD03h 函式(8.03-27)返回指向此塊的指標。

偏移量 大小 描述
00h 2 配置指定的內碼表數量 M
04h 2 預設載入的內碼表數量 N
06h 2N 預設載入的內碼表識別符號
06h+2N 2M 配置指定的內碼表識別符號(如果配置尚未準備,則為 = FFFFh)

A.02-7 AMIS 規範中“熱鍵”的定義

[編輯 | 編輯原始碼]

TSR 程式的常見做法是將功能分配給預定的“熱鍵”,而不管哪些鍵已被先前載入的 TSR 程式分配了其他任務。這種做法最無害的結果是失去了呼叫先前載入的 TSR 程式和驅動程式的功能的機會。AMIS 規範 (A.07-6) 提供了一種防止擷取“熱鍵”功能的真正機會。根據 AMIS 規範,駐留模組必須響應對多路複用中斷 INT 2D 的呼叫,操作碼為 AL = 05h,並在 DX:BX 暫存器中返回指向其活動“熱鍵”列表的指標。任何打算安排自己“熱鍵”的程式都應該被授予訪問先前“熱鍵”分配資料的許可權。

從“熱鍵”列表開頭偏移 00h 的第一個位元組通知“熱鍵”呼叫攔截方法。[注 1] 偏移 01h 的第二個位元組是響應駐留模組保持活動的“熱鍵”數量。這個數字也定義了返回列表的總長度,因為在第二個位元組之後,從偏移 02h 開始,是一組“熱鍵”描述符,每個描述符長 6 個位元組。這些描述符的結構在下表中顯示。表中的偏移是從每個描述符的開頭算起的。

偏移量 大小 描述 註釋
00h 1 “熱鍵”的掃描碼 [注 2]
01h 2 所需的移位狀態 [注 3]
03h 2 不允許的移位狀態 [註釋 4]
05h 1 輔助鍵的標誌 [註釋 5]
註釋
  1. ^ “熱鍵”列表中偏移 00h 的位元組通知“熱鍵”呼叫攔截方法。此位元組中的位 7 必須清除;其他位具有以下含義:
    位 0 設定:在 INT 09 處理程式之前攔截
    位 1 設定:在 INT 09 處理程式之後攔截
    位 2 設定:在 INT 15\AH=4Fh 之前攔截
    位 3 設定:在 INT 15\AH=4Fh 之後攔截
    位 4 設定:攔截 INT 16\AH=00h、01h、02h 呼叫
    位 5 設定:攔截 INT 16\AH=10h、11h、12h 呼叫
    位 6 設定:攔截 INT 16\AH=20h、21h、22h 呼叫。
  2. ^ 如果掃描碼的最高位是清除的,則當按下鍵時會註冊操作;如果掃描碼的最高位是設定的,則當釋放鍵時會註冊操作。如果操作完全是由“功能鍵”的特定狀態組合引起的,則應指定 00h 或 80h 值,而不是掃描碼。
  3. ^ 所需移位狀態字幾乎與 INT 16\AH=12h 函式(8.01-85)返回的鍵盤標誌字相同。唯一的區別是位 7 的含義:在所需移位狀態字中,它對應於保持按下(左或右)SHIFT 鍵。所需移位狀態字中任何位的設定狀態指定了“熱鍵”操作的必要條件。
  4. ^ 不允許的移位狀態字中的位具有與所需移位狀態字相同的含義,[注 3] 但它們的設定狀態表示相反的條件:阻止“熱鍵”操作。所需條件和不允許條件的組合有助於降低誤操作的可能性。
  5. ^ 每個“熱鍵”描述符中的最後一個位元組是輔助標誌位元組。此位元組中的位 6 和位 7 必須清除;其他位的狀態具有以下含義:
    位 0 設定:在模組執行之前操作
    位 1 設定:在模組執行之後操作
    位 2 設定:允許監控攔截
    位 3 設定:操作被其他鍵阻塞
    位 4 設定:此“熱鍵”的作用被重新定義
    位 5 設定:操作取決於執行條件。

A.02-8. ASCII 服務標記和命令

[編輯 | 編輯原始碼]

美國資訊交換標準程式碼 (ASCII) 中的第 0-31 位專門用於服務標記和命令。所有 DOS 的內碼表都繼承了這 32 個服務程式碼。在 MS-DOS 7 下,這些服務程式碼的大部分被忽略,但有些被執行為命令。

一些服務程式碼可以透過 1.05 文章中描述的按鍵組合輸入。輸入服務程式碼的另一種方法是使用數字小鍵盤上的按鍵輸入其十進位制 ASCII 編號 (0-31),同時按下 ALT 鍵。

對輸入的服務程式碼的第一個響應可能來自 CON (控制檯) 裝置驅動程式的輸入模組。進一步的響應可能由命令直譯器給出。當一個服務程式碼被髮送到輸出時,BIOS 系統能夠將其執行為命令 (8.01-21、8.01-33) 或避免其執行 (8.01-17)。預設情況下,CON (控制檯) 裝置驅動程式的輸出模組不會嘗試避免執行某些服務程式碼。可以透過向 CON 裝置驅動程式傳送引數字串 (8.02-41) 來更改這種行為,但這樣做沒有必要,因為 DOS 程式被允許透過所需的 BIOS 函式直接輸出資料。

有時 ASCII 服務程式碼可能有用,但必須事先知道每個特定服務程式碼將在哪裡以及如何解釋。因此,下表顯示了在 MS-DOS 7 下有效的服務程式碼列表,以及與這些程式碼相關的操作描述。

程式碼 編號 描述
00h 0 解釋行的結束標記,包括包含名稱和環境變數值的行。
03h 3 “文字結束”標記,終止命令檔案的執行(參見 3.21 文章中的示例)。
07h 7 “蜂鳴”程式碼。傳送到輸出時,會導致發出短暫的蜂鳴聲。
08h 8 將游標向左移動一個字元單元。透過 CON 裝置驅動程式傳送時,會擦除最後一個字元。
09h 9 水平製表符程式碼。傳送到顯示器時,會自動擴充套件為 8 個空格。
0Ah 10 “換行”程式碼,會導致轉到下一行,而不會將游標返回到行首。[注 1]
0Ch 12 印表機的“彈出紙張”命令。BIOS 和 CON 裝置驅動程式都忽略此命令。
0Dh 13 “回車”程式碼,將游標返回到行首。還在 DTA 區域 (8.02-16) 中標記行尾。
1Ah 26 文字檔案的可選結束標記;在該標記處,檔案複製可能會中斷 (3.06)。
1Bh 27 “轉義”程式碼用作針對 ANSI.SYS 驅動程式(如果已安裝)的命令的標記。
註釋
  1. ^ 服務程式碼 0Dh 0Ah 共同用作在 DOS 下鍵入的所有文字檔案的行尾標記。
  2. 有一定機率遇到響應某些服務程式碼的駐留模組,這些程式碼未在此處顯示,通常在 DOS 下被忽略。

A.03 磁碟訪問資料庫

[編輯 | 編輯原始碼]

A.03-1. 驅動程式引數塊 (DPB) 的結構

[編輯 | 編輯原始碼]

DOS 將磁碟訪問引數儲存在 DPB 塊中,每個可用的邏輯磁碟都有一個,還有一個用於預設(當前)驅動器的副本。INT 21\AX=7302h 函式(8.02-79)允許將任何 DPB 塊複製到準備好的緩衝區中。指向 DPB 塊的指標由 INT 21\AH=1Fh 和 INT 21\AH=32h 函式(8.02-24)返回,這些函式在以前版本的 DOS 中有記錄。在下面的圖 8 中,顯示了訪問磁碟 C: DPB 塊的完整路徑,包括呼叫 INT 21\AH=32h 函式,從 DS:BX 暫存器中讀取塊地址 00C9:13C0h,以及顯示 DPB 塊的轉儲。在偏移 19h 的顯示轉儲中,存在指向與下一個邏輯磁碟 D: 相關的下一個 DPB 塊的地址 00C9:13FDh。圖 8 中也顯示了磁碟 D: 的 DPB 塊的轉儲。

圖 8

提到的訪問 DPB 塊的法律功能會自動嘗試讀取請求的磁碟,以更新 DPB 塊中的資料。這會使程式的執行速度變慢,有時無法應用於可移動介質,因為這些介質可能在此時不存在於驅動器中。另一種方法是從同一磁碟的 CDS 條目 (A.03-3) 中偏移量 45h 處的單元格讀取 DPB 塊的地址。

所有 DPB 塊都具有與下面所示相同的結構。最多偏移量 20h 的位元組與以前的 DOS 版本中的位元組相同,但超過偏移量 20h 的位元組特定於 MS-DOS 7 中的擴充套件 DPB 塊。

偏移量 大小 描述
00h 1 邏輯磁碟號 (00h = A:, 02h = C:,等等)
01h 1 磁碟在驅動器磁碟列表中的編號
02h 2 扇區大小(以位元組為單位)
04h 1 簇中的最高扇區號
05h 1 將簇轉換為扇區的移位計數
06h 2 保留扇區的數量(在 FAT 之前)
08h 1 FAT 表的數量
09h 2 根目錄條目的最大數量
0Bh 2 包含使用者資料的第一個扇區的編號
0Dh 2 最高簇號(簇數 + 1)
0Fh 2 每個 FAT 表的扇區數
11h 2 根目錄第一個扇區的扇區號
13h 4 指向磁碟驅動程式頭的指標 (A.05-1)
17h 1 介質 ID 位元組 (INT 21\AH=1Ch, 8.02-17)
18h 1 標誌(= 00h 如果磁碟已訪問,或 = FFh 如果未訪問)
19h 4 指向下一個磁碟的 DPB 塊的指標
1Dh 2 開始搜尋可用空間的簇
1Fh 2 磁碟上的可用簇數(如果未知,則為 FFFFh)
21h 2 可用簇計數的最高有效字
23h 2 – 位 0–3 : 活動 FAT 的零基 FAT 編號
    – 位 7 : 不要將活動 FAT 複製到非活動 FAT
25h 2 FAT 資訊扇區的數量 [備註 2]
27h 2 備份引導扇區的扇區號
29h 4 第一個磁碟的第一個簇的第一個扇區號
2Dh 4 最後一個磁碟的簇號
31h 4 FAT 佔用的扇區數
35h 4 根目錄開始的簇號
註釋
  1. DPB 塊中的資料透過 INT 21\AH=53h 函式從同一磁碟的 BPB 塊 (A.03-4) 轉換而來。
  2. ^ a b 偏移量 25h 處的字 FFFFh 表示請求的磁碟上沒有 FAT 資訊扇區。如果存在 FAT 資訊扇區,則它在偏移量 00h 處包含一個固定的雙字簽名 61417272h,偏移量 04h 處的第二個雙字是可用簇數(如果未知,則為 FFFFFFFFh),偏移量 08h 處的第三個雙字是最近分配的簇號。

A.03-2 磁碟資料表 (DDT)

[編輯 | 編輯原始碼]

DDT 表代表塊裝置驅動程式的專用資料庫,整合到 DOS 的核心。DDT 表對應於本地磁碟,這些磁碟被 BIOS 正確檢測和支援,包括那些由 BIOS 從可啟動 CD/DVD-ROM 上的磁碟映像模擬的磁碟。IFS 驅動器、虛擬磁碟、RAM 盤以及所有其他磁碟(由驅動程式開啟以訪問,在配置檔案中指定)沒有 DDT 表。

DDT 表被排列成一個鏈狀佇列,每個表長 96h 位元組。INT 2F\AX=0803h 函式 (8.03-04) 返回指向第一個表的指標。這足以跟蹤整個佇列,因為每個表中的第一個雙字是指向下一個邏輯磁碟的 DDT 表的指標。第一個字為 FFFFh 的表是鏈中的最後一個表。

圖 9

圖 9 說明了訪問磁碟 A:、B: 和 C: 的 DDT 表,包括呼叫 INT 2F\AX=0803h 函式,從 DS:DI 暫存器中讀取返回的第一個 DDT 表的地址 (0B52:0000h),顯示磁碟 A: 的 DDT 表的部分轉儲,從該轉儲的前 4 個位元組中讀取指向下一個磁碟 B: 的 DDT 表的地址 (0B52:0096h),顯示磁碟 B: 的 DDT 表的部分轉儲,以及重複針對磁碟 C: 的 DDT 表的最後兩個操作。

下表顯示了一個 DDT 表中的資料結構。INT 2F\AX=0801 函式 (8.03-02) 接受相同的資料結構,將一個新的邏輯磁碟的 DDT 表附加到 DDT 錶鏈中。

偏移量 大小 描述
00h 4 指向下一個 DDT 表的指標(如果為最後一個表,則為 FFFFh)
04h 1 相應的物理驅動器號
從 00h 開始,用於軟盤驅動器
從 80h 開始,用於硬碟 (固定) 驅動器
05h 1 DOS 核心驅動程式訪問的磁碟列表中的邏輯磁碟號。如果磁碟的字母名稱未重新分配,則 00h = A:, 02h = C:,等等。
06h 25 當前磁碟的 BPB 塊(最多偏移量 19h,A.03-4)
3Bh 1 – 位 6: 檔案系統 FAT-16,
    – 位 7: 磁碟必須對所有請求返回“未就緒”
3Ch 2 屬於該磁碟的已開啟檔案的計數器
3Eh 1 裝置型別(作為表 A.04-3 中偏移量 01h 處的位元組)
3Fh 2 – 位 0: 固定硬碟
    – 位 1: 支援門鎖(“變更線”)
    – 位 2: 不允許更改當前 BPB
    – 位 3: 軌道中的所有扇區都具有相同的大小
    – 位 4: 必須指定 LUN 號 [備註 1]
    – 位 5: 該物理驅動器上有多個邏輯磁碟
    – 位 6: 檢測到磁碟更改
    – 位 7: 磁碟引數已更改 [備註 2]
    – 位 8: 磁碟重新格式化,介質的 BPB 已更改
    – 位 9: 訪問禁止標誌 [備註 3]
43h 25 預設磁碟的 BPB (A.03-4) 塊 [備註 4]
7Dh 12 長度為 11 個位元組的卷標,以 00h 結尾
89h 4 磁碟的序列號
8Dh 9 檔案系統型別名稱,以 00h 結尾。
註釋
  1. ^ a b c d LUN (邏輯單元號) 用於區分共享總線上的相同編號的裝置。特別是,對於光學 DVD-RAM 驅動器而言,這一點非常必要,因為它們以不同的 LUN 號呈現自身,要麼作為可移動 HDD,要麼作為 CD/DVD-ROM 磁碟。快閃記憶體卡介面卡也將不同插槽中的快閃記憶體卡表示為具有不同 LUN 號的磁碟。
  2. ^ 如果磁碟引數已更改,則必須使用 INT 21\AX=440Dh\CX=4840h 函式 (8.02-46) 重置 DDT 表中的資料。
  3. ^ 訪問禁止標誌會停用讀寫操作。它僅適用於 HDD,特別是適用於第一個主分割槽之外的其他主分割槽。訪問禁止標誌的反向狀態由 INT 21\AX=440Dh\CX=4867h 函式報告,並且可以使用 INT 21\AX=440Dh\CX=4847h 函式 (8.02-46) 重新設定。
  4. ^ 偏移量 43h 處的 BPB 資料塊 (A.03-4) 不對應於當前介質,而是對應於該驅動器的可移動介質的預設型別。通常,預設介質是容量最大的介質。

A.03-3 當前目錄結構 (CDS)

[編輯 | 編輯原始碼]

CDS 表是一個數據塊(條目)陣列。每個 CDS 條目對應於一個邏輯磁碟,並指定該磁碟的多個引數,包括指向當前(預設)目錄的路徑。

指向第一個 CDS 條目的指標儲存在 DOS 列表列表 (A.01-2) 中的偏移量 16h 處。在該位置,偏移量 21h 處的位元組儲存 CDS 表中的條目總數,由 CONFIG.SYS 檔案中的 LASTDRIVE 規範 (4.17) 定義。每個 CDS 條目長 58h 位元組。

圖 10

圖 10 說明了訪問 CDS 表。第一步是呼叫 INT 21\AH=52h 函式 (8.02-59),在暫存器 ES:BX 中返回 DOS 列表列表 (00C9:0026h) 的地址。下一步是顯示從返回地址開始的記憶體內容轉儲。顯示轉儲的長度選擇為,使偏移量 16h–19h 處的最後 4 個位元組顯示 CDS 表的地址 (D203:0000h)。從該地址開始的記憶體內容轉儲呈現了磁碟 A: 的 CDS 條目。每個以前的 CDS 條目後面跟著 58h 位元組,表示下一個邏輯磁碟的資料。

在 CDS 表條目中,有一些虛擬條目,沒有相應的邏輯磁碟。虛擬條目為那些可能在以後建立或變得可訪問的邏輯磁碟保留字母名稱:RAM 盤、IFS 磁碟、網路磁碟等。CDS 表由 IO.SYS 載入程式在 CONFIG.SYS 檔案中解釋命令時建立。稍後,不能將新條目附加到 CDS 表。因此,必須使用 LASTDRIVE 命令 (4.17) 預先訂購足夠數量的虛擬條目。

下表顯示了單個 CDS 條目的資料結構。

偏移量 大小 描述
00h 67 指向當前目錄的路徑。 [備註 1] [備註 2]
43h 2 該邏輯磁碟的屬性字
      位 7 : 從分配列表中隱藏磁碟的字母名稱
      位 12 : 由 SUBST.EXE 建立的虛擬磁碟 [備註 2]
      位 13 : 由 JOIN.EXE 建立的虛擬磁碟 [備註 2]
      位 14 : 磁碟位於物理驅動器上 [備註 3] [備註 4]
      位 15 : 透過網路重定向器訪問磁碟 [備註 4]
45h 4 指向該磁碟的 DPB 塊的指標 (A.03-1)
49h 2 當前目錄的起始簇 [備註 5]
4Fh 2 要隱藏的字元數 [備註 6]
52h 4 指向重定向器或 IFS 驅動程式的指標(如果不存在,則為零)
註釋
  1. ^ 對於本地磁碟,指向當前目錄的路徑包括磁碟的字母名稱、冒號、反斜槓以及路徑的其餘部分。路徑的結尾必須用位元組 00h 標記。
  2. ^ 如果屬性字中的位 12 或位 13 被設定,則偏移量 00h 處的路徑不是真正的路徑。
  3. ^ 當屬性位 14 和 15 都為 0 時,表示該條目為虛擬條目或已停用。這類磁碟會被隱藏。
  4. ^ 如果屬性字中的位 14 和 15 都被設定,則該磁碟表示一個 IFS 檔案系統。
  5. ^ 該簇號是從邏輯磁碟的開頭開始計算的。因此,根目錄的簇號為 0000h。如果磁碟尚未訪問,則簇欄位將填充為 FFFFh。
  6. ^ 如果偏移量 4Fh 處的字定義了非零個字元,則 DOS 可能只報告當前目錄路徑的最後一部分,這些字元將被隱藏。
  7. 在早期的 DOS 版本中,CDS 條目長 51h 位元組;從 MS-DOS 4 開始,添加了位元組 51h–57h 以供 IFS 和網路驅動程式使用。

A.03-4 磁碟的 BIOS 引數塊 (BPB)

[編輯 | 編輯原始碼]

BPB 是磁碟介質引導扇區的一部分。當 DOS 啟動時,BPB 資料被用於填充內部 DOS 的表格:DPB (A.03-1) 和 DDT (A.03-2)。此過程在每次檢測到介質更改時都會重複,以確保資料始終保持最新。

在具有 FAT-16 檔案系統的磁碟分割槽中,BPB 長 39h 位元組;其結構顯示在下表的第一列 (“F16”) 中。DDT 表格中的 BPB 資料具有略微不同的“標準”結構,顯示在第三列 (“STD”) 中。標準 BPB 塊被 INT 21\AX=440Dh\CX=0840h 函式接受,並被 INT 21\AX=440Dh\CX=0060h 函式返回 (8.02-46)。這兩個函式只能應用於具有 FAT-12 或 FAT-16 檔案系統的磁碟。

在具有 FAT-32 檔案系統的磁碟分割槽中,BPB 長 5Ah 位元組;其結構顯示在下表的第二列 (“F32”) 中。DDT 表格中的相同資料按照新的“擴充套件”結構排列,顯示在下表的第四列 (“EXT”) 中。對於這些資料結構,MS-DOS 7 提供了其他功能 (8.02-46),這些功能在以前的 DOS 版本中不可用:INT 21\AX=440Dh\CX=4840h 用於重新整理 DDT 中的 BPB 資料,INT 21\AX=440Dh\CX=4860h 用於讀取 DDT 中的 BPB 資料。這兩個新功能都應該應用於使用 FAT-32 檔案系統格式化的磁碟。

F16 F32 Std Ext 大小 描述
00h 00h     3 跳轉指令 EBh 3Ch 90h 用於 FAT-16
          EBh 5Ah 90h 用於 FAT-32
03h 03h     8 形成 BPB 塊的程式的 ID
0Bh 0Bh 00h 00h 2 扇區大小(以位元組為單位)
0Dh 0Dh 02h 02h 1 每個簇的扇區數(如果未知,則為 FFh)
0Eh 0Eh 03h 03h 2 第一個 FAT 之前的保留扇區數
10h 10h 05h 05h 1 FAT 的數量(通常為 2)
11h 11h 06h 06h 2 根目錄中的條目數
13h   08h 08h 2 = 0000h [註釋 1]
15h 15h 0Ah 0Ah 1 介質 ID 位元組 [註釋 2]
16h 16h 0Bh 0Bh 2 每個 FAT 的扇區數 [註釋 3]
18h 18h 0Dh 0Dh 2 每個磁軌的扇區數
1Ah 1Ah 0Fh 0Fh 2 磁頭數
1Ch 1Ch 11h 11h 4 起始扇區號 [註釋 4]
20h 20h 15h 15h 4 扇區總數 [註釋 1]
  24h   19h 4 每個 FAT 的扇區數 [註釋 3]
  28h   1Dh 2 與 DPB 中的字 23h 相同 (A.03-1)
    1Fh   2 柱面數 [註釋 5]
  2Ah   1Fh 2 檔案系統版本
    21h   1 裝置型別(如 A.04-3 中的位元組 01h)
  2Ch   21h 4 根目錄的第一個簇號
    22h   2 屬性(如 A.04-3 中的字 02h)
24h 40h     1 物理驅動器號
      25h 2 資訊扇區 [註釋 2 至 A.03-1]
26h 42h     1 擴充套件引導扇區簽名(= 29h)
27h 43h   27h 4 磁碟序列號(以二進位制形式)
2Bh 47h   2Bh 11 卷標(或“NO NAME ”)
36h 52h   36h 8 檔案系統型別名稱
註釋
  1. ^ 對於小於 32 Mb 的分割槽,偏移量 15h 處的雙字必須為零,此類分割槽中的扇區數必須在偏移量 08h 處的字中指定。
  2. ^ 介質 ID 位元組對應於 INT 21\AH=1Ch 函式 (8.02-17) 的規範。如果無法識別可移動介質的型別,則將 00h 值分配給介質 ID 位元組。
  3. ^ 在“擴充套件”BPB 塊中,偏移量 0Bh 處的單元格值為 0000h,FAT 表所佔的扇區數用偏移量 19h 處的單元格中的雙字值表示。
  4. ^ 在 HDD 分割槽的 BPB 中,起始扇區號與相應分割槽描述符 (A.13-5) 中偏移量 08h 處指定的起始扇區號相同。
  5. ^ 標準 BPB 塊中的字 1Fh 和後面的位元組 21h、22h 不包含在擴充套件 BPB 塊和 DDT 表格 (A.03-2) 中的 BPB 塊中。

A.04 I/O 控制資料表

[編輯 | 編輯原始碼]

A.04-1 用於 IOCTL 序列號功能的資料塊

[編輯 | 編輯原始碼]

該資料塊由函式 INT 21\AX=440Dh\CX=4866h (8.02-46) 和 INT 21\AX=6900h (8.02-77) 返回,用於從儲存介質讀取序列號。相同結構的資料塊被函式 INT 21\AX=440Dh\CX=4846h (8.02-46) 和 INT 21\AX=6901h (8.02-77) 接受,用於將新的序列號分配給磁碟。

偏移量 大小 描述
00h 2 = 0000h
02h 4 磁碟序列號(以二進位制形式)
06h 11 磁碟卷標(或“NO NAME    ”,如果不存在)
11h 8 僅在返回時 : 檔案系統型別名稱 [註釋 1]
註釋
  1. ^ 名稱“CDROM   ”對應於 High-Sierra CD-ROM 檔案系統,名稱“CD001   ”對應於 ISO 9660 CD-ROM 檔案系統。

A.04-2 檔案控制代碼的資訊字

[編輯 | 編輯原始碼]

在 SFT 條目 (A.01-4) 中偏移量 05h 處讀取的控制代碼資訊字由 INT 21\AX=4400h 函式 (8.02-40) 返回。如果指定的控制代碼引用與非檔案物件相關的 SFT 條目,則返回的資訊字應根據表 A.05-2 進行解釋。如果指定的控制代碼引用與已開啟檔案相關的 SFT 條目,則返回的資訊字應根據下表進行解釋。檔案控制代碼資訊字的顯著特徵是其第 7 位的清晰狀態。

描述
15 檔案不是本地的,它是透過重定向器(網路)訪問的
14 在關閉檔案時不要設定檔案日期/時間
11 檔案儲存在固定(不可移動)介質上
7 位 7 的清除狀態是檔案控制代碼的顯著特徵
6 寫入操作尚未執行
5-0 磁碟號(000000b = A:,000001b = B:,000010b = C:,依此類推)

A.04-3 用於磁碟引數規範的資料塊

[編輯 | 編輯原始碼]

在呼叫子函式 INT 21\AX=440Dh\CX=4840h (8.02-46) 以更新表格 DPB (A.03-1) 和 DDT (A.03-2) 中的 BPB 資料之前,應在 DS:DX 暫存器中準備指向此資料塊的指標。相同結構的資料塊由 INT 21\AX=440Dh\CX=4860h 子函式 (8.02-46) 返回。應提前在 DS:DX 暫存器中準備返回的資料塊的緩衝區地址。偏移量 00h 處的標誌位元組不會被返回,它定義了請求條件,應該在呼叫之前指定。

偏移量 大小 描述
00h 1 標誌(位 3-7 必須為零) 
位 0 : 對當前 BPB 應用操作 [註釋 1]
位 1 : 只使用磁軌佈局欄位 [註釋 2]
位 2 : 扇區大小相同 [註釋 2]
01h 1 裝置型別 
= 00h – 320 kb 或 360 kb 軟盤驅動器
= 01h – 1.2 Mb 軟盤驅動器
= 02h – 720 kb 軟盤驅動器
= 05h – 固定(硬碟)磁碟驅動器
= 06h – 磁帶驅動器儲存裝置
= 07h – 其他裝置(包括 1.44 Mb 軟盤)
= 08h – 光碟驅動器
= 09h – 2.88 Mb 軟盤驅動器
02h 2 儲存裝置屬性(位 2-15 必須為零) 
位 0 : 具有不可移動介質的裝置
位 1 : 支援介質更改註冊
04h 2 柱面數(或磁軌數)
06h 1 介質標誌 
= 01h – 320kb/360kb 磁碟
= F8h – 壓縮邏輯磁碟
= 00h – 所有其他型別的介質
07h 31 BPB 資料塊 [註釋 3]
註釋
  1. ^ 如果標誌位元組中的位 0 被設定,則更新或複製 BPB 塊 (A.03-4) 會導致嘗試訪問物理儲存介質。但是,當標誌位元組中的位 0 為清除時,不會嘗試訪問物理儲存介質:操作物件將是 DDT 表格 (A.03-2) 中偏移量 43h 處的 BPB 塊的副本,它指定了該特定裝置的預設儲存介質型別。
  2. ^ 標誌位元組中的位 1 和 2 指定了定義磁軌中扇區分配的可選子表的解釋。該子表最多可以長 256 位元組,對於子函式 CX=0840h,它可以從偏移量 26h 開始,對於子函式 CX=4840h,它可以從偏移量 5Ch 開始。不過,本書中沒有考慮扇區大小不一致的介質。對於子函式 CX=4860h,標誌位元組中的位 1 必須為清除。
  3. ^ 對於子函式 CX=0840h,偏移量 07h 處的 BPB 表格必須具有標準 BPB 結構 (A.03-4)。如果偏移量 00h 處的標誌位元組的位 0 被設定,則 BPB 塊的最後 6 個位元組被子函式 CX=0840h 接受,否則偏移量 1Eh 之後的位元組將被忽略。對於子函式 CX=4840h,偏移量 07h 處的 BPB 表格必須根據擴充套件 BPB 結構 (A.03-4) 長度為 53 位元組。

A.04-4 讀寫函式的資料塊結構

[edit | edit source]

INT 21\AX=440Dh\CX=4861h 讀取函式和 INT 21\AX=440Dh\CX=4841h 寫入函式 (8.02-46) 接收指向此資料塊的指標。在 Windows 作業系統下,除非事先鎖定所指向的邏輯磁碟 (8.01-58),否則這些函式無法在“DOS 框”中執行。

偏移量 大小 描述
00h 1 = 00h
01h 2 請求的驅動器磁頭號
03h 2 請求的驅動器柱面號
05h 2 要開始讀或寫的扇區號
07h 2 要讀或寫的扇區數量
09h 4 指向帶有資料或用於資料的緩衝區的指標

A.04-5 格式化/校驗函式的資料塊結構

[edit | edit source]

INT 21\AX=440Dh\CX=4842h 格式化函式和 INT 21\AX=440Dh\CX=4862h 校驗函式 (8.02-46) 接收指向此資料塊的指標。在 Windows 作業系統下,除非事先鎖定所指向的邏輯磁碟 (8.01-58),否則這些函式無法在“DOS 框”中執行。

偏移量 大小 描述
00h 1 位 0 : 查詢狀態碼,不要實際格式化
    位 1 : 格式化多個磁軌 (僅適用於硬碟)
01h 2 要啟用的驅動器磁頭
03h 2 磁頭應驅動到的柱面
05h 2 要格式化或校驗的磁軌數量

注意 1: 對於格式化函式,如果偏移量為 00h 的位元組的位 1 為清除狀態,則忽略 05h 處的字:在這種情況下,將只格式化一個磁軌。

注意 2: 對於校驗函式,05h 處的字中的磁軌數量應不超過 255 個扇區,偏移量為 00h 的位元組中設定的位 0 指定多個磁軌的校驗,位 1 必須為零。

注意 3: 返回時,偏移量為 00h 的位元組將被替換為狀態碼 

00h – BIOS 支援此功能,
01h – BIOS 不支援此功能,
02h – 給定的規格不適合此邏輯磁碟,
03h – 驅動器中沒有介質。

返回的狀態碼 00h 並不確認操作成功 : 成功的操作應由返回的 CF 標誌清除狀態確認。

A.05 驅動程式的資料結構

[edit | edit source]

A.05-1 驅動程式的頭結構

[edit | edit source]

下表顯示了三種類型 DOS 驅動程式頭的偏移資料 

“B”列 – 用於“塊”裝置,即磁碟和磁帶儲存驅動器 ;
“C”列 – 用於“字元”裝置,即通訊通道 ;
“D”列 – 用於與 MSCDEX.EXE 協同工作的 CD-ROM 驅動程式。

指向磁碟驅動程式頭的指標位於對應磁碟的驅動程式引數塊 (A.03-1) 中的偏移量為 13h 的雙字中。“字元”裝置驅動程式可以透過跟蹤頭地址鏈,在它們的頭的偏移量為 0Ah 處找到簽名。跟蹤起始地址可以在 DOS 的列表列表 (A.01-2) 中的偏移量為 22h 處獲得,也可以透過 INT 2F\AX=122Ch 函式 (8.03-12) 獲得。

B C D 大小 描述
00h 00h 00h 4 下一個驅動程式的地址欄位 [注意 1]
04h 04h 04h 2 驅動程式的屬性 (A.05-2)
06h 06h 06h 2 策略例程入口點的偏移量
08h 08h 08h 2 中斷例程入口點的偏移量
  0Ah 0Ah 8 驅動程式的簽名欄位
    14h 1 由驅動程式控制的第一個磁碟 [注意 2]
0Ah   15h 1 由驅動程式控制的磁碟數量
註釋
  1. ^ 下一個驅動程式的地址欄位必須初始化為 FFFF:FFFFh; 以後 DOS 將用下一個驅動程式的地址填充此欄位。如果沒有載入下一個驅動程式,則當前驅動程式頭開始處的剩餘 FFFFh 值將表示驅動程式地址引用鏈的結束。
  2. ^ 偏移量為 14h 的位元組必須初始化為 00h 值。以後 MSCDEX.EXE 程式 (5.08-03) 或 SHSUCDX.EXE 程式 (5.08-04) 將用由該驅動程式控制的第一個磁碟的數字 (8.02-17 的註釋 1) 替換初始的零值。

A.05-2 驅動程式的屬性

[edit | edit source]

驅動程式的屬性字位於驅動程式頭的偏移量為 04h 處 (A.05-1)。但屬性字中大多數位的含義對於“字元”裝置驅動程式 (下表第二列) 和“塊”裝置驅動程式 (第三列) 不同。與 MSCDEX.EXE (5.08-03) 或 SHSUCDX.EXE (5.08-04) 程式協同工作的 CD/DVD-ROM 裝置驅動程式,以及由 SUBST.EXE 程式 (6.23) 建立的虛擬磁碟驅動程式,在形式上屬於“字元”裝置驅動程式,因為它們的屬性字中的位 15 被設定。

字元裝置驅動程式的屬性字用作通道控制代碼資訊字的基礎,該字儲存在相應 SFT 條目 (A.01-4) 中的偏移量為 05h 處,並由 INT 21\AX=4400h 函式 (8.02-40) 在響應通道控制代碼請求時返回 (有關檔案控制代碼請求的資訊,請參閱 A.04-2)。“字元”裝置驅動程式的屬性字與通道控制代碼資訊字之間的差異表現在下表第二列中位 4-7 中:這些位在“字元”裝置驅動程式的屬性字中通常為清除狀態。在通道控制代碼資訊字中,位 7 被設定:這是它們與檔案控制代碼資訊字的主要區別特徵。

“字元”裝置 (通道) “塊”裝置 (磁碟、磁帶)
0 STDIN 通道 [注意 1] = 0 (保留)
1 STDOUT 通道 [注意 1] 32 位地址支援
2 NUL 通道 [注意 1] = 0 (保留)
3 CLOCK 通道 [注意 1] = 0 (保留)
4 透過 INT 29 支援輸出 = 0 (保留)
5 原始輸出 [注意 2] = 0 (保留)
6 通道在輸入時新增 EOF IOCTL 支援 [注意 3]
7 = 1 (作為非檔案控制代碼) IOCTL 支援 [注意 4]
9 = 0 (保留) 無直接 I/O [注意 5]
11 鎖定支援 [注意 6] 鎖定支援 [注意 6]
12 = 0 (保留) CD-ROM 或遠端裝置
13 支援直到忙狀態的輸出 非 IBM 格式
14 IOCTL 支援 [注意 7] IOCTL 支援 [注意 7]
15 = 1 – “字元”裝置症狀 = 0 – “塊”裝置症狀
註釋
  1. ^ 在字元裝置驅動程式的屬性位 0-3 中,只能設定一位 (或不設定)。
  2. ^ 原始 (二進位制) 輸出表示驅動程式不將任何輸出字元解釋為命令 (如 A.02-8 中所示)。
  3. ^ 設定位 6 的狀態表示支援 INT 21\AX=440Ch、440Dh、440Eh、440Fh 函式。
  4. ^ 設定位 7 的狀態表示支援 INT 21\AX=4410h、4411h 函式。
  5. ^ 設定位 9 的狀態表示由該驅動程式控制的磁碟無法被 BIOS INT 13 處理程式的函式訪問。設定位 9 的狀態對於提供對遠端磁碟、IFS 磁碟和引數磁碟 (由 DRIVPARM 命令 (4.09) 替換) 的訪問的驅動程式來說很常見。
  6. ^ 設定位 11 的狀態表示驅動程式能夠為可移動磁碟驅動器傳輸插槽蓋鎖定訊號。
  7. ^ a b設定位 14 的狀態表示驅動程式能夠處理透過 INT 21\AX=4403h 和 INT 21\AX=4405h 函式 (8.02-41) 傳送的控制引數。
  8. 在本表中未提及的驅動程式屬性位被認為是保留的,並且通常必須為清除狀態。

A.05-3 對裝置驅動程式的選定請求

[edit | edit source]

DOS 與任何裝置驅動程式之間的互動是透過向驅動程式的策略例程傳送帶有 CALL FAR 命令的 ES:BX 暫存器中的請求資料塊地址來執行的。驅動程式接收操作程式碼並啟動其執行。一段時間後,DOS 會發送另一個對驅動程式的中斷例程的呼叫,該例程會用已執行操作的請求結果填充相同的資料塊。如果返回的資料塊 (A.05-4) 中的狀態位元組確認操作成功終止,則 DOS 將接受結果。

INT 2F\AX=0802h 函式 (8.03-03) 接受相同形式的請求資料塊,該函式隱式地將請求傳送到整合到 DOS 核心中的塊裝置驅動程式。這些驅動程式控制邏輯磁碟,其引數在相應的 DDT 表 (A.03-2) 中註冊。只有這些邏輯磁碟才能被 INT 2F\AX=0802h 函式訪問。

下表的第一列指定請求資料塊的大小,第二列指定請求的操作程式碼,第四列顯示該操作可以應用於哪種驅動程式型別。第五列顯示該操作是否可以透過 INT 2F\AX=0802h 函式請求。

大小 程式碼 操作 裝置型別 802 註釋
19h 00h 初始化 兩種型別 N A.05-5
0Fh 01h 介質更改檢查 "塊" 型別 Y [注 2]
14h 03h 儲存 IOCTL 字串 [註釋 1] N A.05-7
1Eh 04h 讀取資料 兩種型別 Y A.05-6
0Eh 05h 非破壞性讀取 字元型別 N [注 3]
0Dh 06h 輸入狀態請求 字元型別 N A.05-4
0Dh 07h 重新整理輸入緩衝區 字元型別 N A.05-4
1Eh 08h 寫入(傳送)資料 兩種型別 Y A.05-6
1Eh 09h 寫入磁碟並驗證 "塊" 型別 Y A.05-6
0Dh 0Ah 輸出狀態請求 字元型別 N A.05-4
0Dh 0Bh 重新整理輸出緩衝區 字元型別 N A.05-4
14h 0Ch 接收 IOCTL 字串 [註釋 1] N A.05-7
0Dh 0Dh 裝置開啟 兩種型別 N A.05-4
0Dh 0Eh 裝置關閉 兩種型別 N A.05-4
0Dh 0Fh 檢測可移動磁碟 "塊" 型別 Y A.05-4
14h 10h 傳送資料直到繁忙 字元型別 N A.05-7
0Dh 17h 獲取磁碟編號 "塊" 型別 Y A.05-4
註釋
  1. ^ 僅針對那些在其屬性字 (A.05-2) 中設定了第 14 位的驅動程式(無論哪種型別)可以處理傳送或接收 IOCTL 字串的請求。
  2. ^ 命令 01h(介質檢查)在請求資料塊的偏移量 0Dh 處接受介質識別符號,並在同一個資料塊的偏移量 0Eh 處返回狀態位元組。狀態位元組的值應解釋如下:
    FFh – 介質未改變;
    01h – 介質已改變;
    00h – 無法確定介質更改狀態。
  3. ^ 命令 05h(非破壞性讀取)在請求資料塊的偏移量 0Dh 處返回一個數據位元組,如果偏移量 04h(A.05-4)處的狀態位元組中的 BUSY 位在返回時未設定。

A.05-4 請求頭格式

[edit | edit source]

所呈現的頭格式用於請求資料塊,這些資料塊透過 CALL FAR 命令(A.05-3)或透過呼叫 INT 2F\AX=0802h 函式 (8.03-03) 傳送到驅動程式。在這兩種情況下,指向請求資料塊的指標必須位於 ES:BX 暫存器中。頭佔用請求資料塊中偏移量 00h–0Ch 的位元組。對於許多操作(06h、07h、0Ah、0Bh、0Dh、0Eh、0Fh、17h),請求資料塊只是頭。下表顯示了對所有驅動程式請求通用的頭的結構。

偏移量 大小 描述
00h 1 請求塊的長度(表 A.05-3,第 1 列)
01h 1 被訪問的邏輯磁碟編號 [Note 2]
02h 1 操作程式碼(表 A.05-3,第 2 列)
03h 1 錯誤程式碼 [Note 3][Note 4]
04h 1 返回的狀態位元組
01h – 操作成功完成
02h – 被訪問的裝置繁忙
80h – 錯誤,操作失敗
註釋
  1. 如果操作 0Fh(檢測可移動驅動器)返回狀態 02h(繁忙),則表示被訪問的驅動器是固定驅動器。
  2. ^ 這裡,邏輯磁碟由其在被訪問的驅動程式控制的磁碟列表中的編號定義。當透過 INT 2F\AX=0802h 函式 (8.03-03) 傳送請求時,這些邏輯磁碟編號與絕對邏輯磁碟編號相同:00h = A:,02h = C:,依此類推,但僅限於那些在 DDT 表 (A.03-2) 中指定其引數的邏輯磁碟。
  3. ^ 僅當偏移量 04h 處的狀態位元組具有 80h 值,即確認錯誤結果時,才會返回錯誤程式碼。然後,應根據表 A.06-1 中 INT 2F 的記錄來解釋錯誤程式碼。
  4. ^ 成功的情況下,操作 17h(獲取磁碟編號)在偏移量 03h 處返回請求的邏輯磁碟的絕對編號。如果請求的編號超出了被訪問的驅動程式控制的邏輯磁碟列表,則返回 00h 值。無論如何,不會檢查磁碟型別和介質存在。

A.05-5 初始化請求資料塊

[edit | edit source]

僅在驅動程式由 IO.SYS 載入程式安裝時,DOS 才會向該驅動程式傳送一次初始化過程請求。請求透過 CALL FAR 命令傳送,該命令在暫存器 ES:BX 中包含指向請求資料塊的指標。初始化過程的程式碼 00h 在請求資料塊 (A.05-03) 的頭中指定。接受初始化請求後,驅動程式會探索其負責的可用硬體。一些初始資料以及驅動程式返回的資料將在請求資料塊的其餘部分中傳輸,超出其頭。下表顯示了請求資料塊 (偏移量 0Dh–18h) 這部分中的資料佈置。

偏移量 大小 描述
0Dh 1 返回時 此驅動程式控制的邏輯磁碟數量。
0Eh 4 呼叫時 指向該驅動程式可能佔用的記憶體空間末尾的下一個位元組的指標。
    返回時 指向該驅動程式的 TSR 部分實際佔用的記憶體空間後的第一個空閒位元組的指標。
12h 4 呼叫時 指向命令列引數的指標。
    僅針對 "塊" 裝置驅動程式返回時:指向 BPB 資料陣列 (A.03-4) 的指標。
16h 1 呼叫時 此驅動程式控制的第一個邏輯磁碟的基於零的編號(即 A: = 00h,C: = 02h,依此類推)。
17h 2 返回時 錯誤訊息標誌 [Note 2]
註釋
  1. "字元" 裝置驅動程式必須在偏移量 12h 處返回零。
  2. ^ 偏移量 17h 處的錯誤訊息標誌值為 0000h 不會導致顯示錯誤訊息。但是,如果驅動程式返回錯誤訊息標誌值為 0001h,則 DOS 將顯示訊息:"您的 CONFIG.SYS 檔案中的第 ... 行存在錯誤..."

A.05-6 I/O 請求資料塊的結構

[edit | edit source]

I/O 請求資料塊用於驅動程式的資料傳輸操作,這些操作透過 CALL FAR 命令(A.05-3)或透過 INT 2F\AX=0802h 函式 (8.03-03) 直接呼叫。請求資料塊的地址在 ES:BX 暫存器中給出,此請求資料塊的頭指定請求的操作程式碼:04h、08h 或 09h。資料讀取操作(程式碼 04h)將資料從介質傳輸到記憶體中準備好的緩衝區。資料寫入操作(程式碼 08h 和 09h)將資料從緩衝區傳送到磁碟或輸出通道。所有提到的資料傳輸操作都使用具有相同結構的請求資料塊,包括頭 (A.05-4) 和包含訪問引數的其餘部分。下表顯示了這些引數在頭之外的佈置。

偏移量 大小 描述
0Dh 1 介質識別符號(僅適用於塊裝置)
0Eh 4 包含資料或用於資料的緩衝區的地址
12h 2 資料包的長度 [Note 1]
14h 2 起始扇區號 [Note 2]
16h 4 指向卷識別符號的指標 [Note 3]
1Ah 4 32 位起始扇區號 [Note 2]
註釋
  1. ^ 通道驅動程式的資料包長度以位元組為單位計算。磁碟 ("塊" 裝置) 驅動程式的資料包長度以扇區數量表示。
  2. ^ 一些其他 DOS 版本使用另一種資料格式,在偏移量 14h 處包含 4 位元組起始扇區號;此資料格式的一個區別特徵是在頭 (A.05-4) 的第一個位元組中指定的請求資料塊長度為 18h。MS-DOS 7 僅向那些透過在其驅動程式的屬性字 (A.05-2) 中設定第 1 位來宣告其支援 32 位定址的驅動程式傳送 4 位元組起始扇區號。這些驅動程式的起始扇區號在偏移量 1Ah 處指定,然後偏移量 14h 處的單元格將填充為 FFFFh。
  3. ^ 指向卷識別符號的指標由驅動程式在發生錯誤 0Fh(介質更改不當)時返回。

A.05-7 字串操作的請求資料塊

[edit | edit source]

此資料塊用於驅動程式的位元組字串傳輸操作,這些操作透過 CALL FAR 命令(A.05-3)呼叫。資料塊的地址在 ES:BX 暫存器中指定,該資料塊的頭 (A.05-4) 指定請求的操作程式碼:03h、0Ch 或 10h。程式碼為 10h 的操作將資料字串傳送到通道。操作程式碼為 03h、0Ch 的請求僅可針對那些透過在其屬性字中設定第 14 位來宣告 IOCTL 支援的驅動程式[Note 7 to A.05-2]。操作程式碼為 03h 的請求建議考慮透過 INT 21\AX=4403h 或 INT 21\AX=4405h 函式 (8.02-41) 傳送的控制引數的新值。操作 0Ch 是向驅動程式發出請求,要求其報告透過 INT 21\AX=4402h 或 INT 21\AX=4404h 函式 (8.02-41) 請求的其實際控制引數。

上述操作的請求資料塊必須具有相同的結構,包括頭 (A.05-4) 和其餘部分;下表顯示了請求資料塊其餘部分中的資料佈置。

偏移量 大小 描述
0Dh 1 介質識別符號(僅適用於 "塊" 裝置驅動程式)
0Eh 4 緩衝區區域的地址(包含資料或用於資料)
12h 2 呼叫時 要讀取或寫入的位元組數
    返回時 實際讀取或寫入的位元組數

A.06 錯誤程式碼

[edit | edit source]

A.06-1 錯誤程式碼彙總表

[edit | edit source]

發生任何錯誤後,BIOS 和 DOS 函式都會返回錯誤程式碼。MS-DOS 7 的函式通常將錯誤程式碼留在 AL 中。BIOS 操作後,錯誤程式碼可能會在 AH 中返回。許多錯誤程式碼的解釋取決於哪個處理程式留下了該錯誤程式碼。為方便起見,提供的摘要表包含了幾乎所有可能在 MS-DOS 7 下遇到的錯誤程式碼解釋。在給出各種選擇的情況下,您可以根據返回錯誤程式碼的處理程式輕鬆選擇合適的解釋。

程式碼 處理程式 描述
00h INT 24-2F 嘗試寫入保護違規
  其他 無錯誤,操作成功完成
01h INT 13 無效引數或請求的磁碟不存在
  INT 15 奇偶校驗錯誤
  INT 16 鍵盤緩衝區已滿
  INT 24-2F 驅動程式未知的磁碟編號
  其他 無效的函式編號或操作編號
02h INT 13 未找到地址標記
  INT 15 中斷錯誤
  INT 24-2F 驅動器未就緒
  其他 找不到檔案
03h INT 13 磁碟為防寫
  INT 15 地址線 A20 門控失敗
  INT 24-2F 驅動程式未知的命令
  其他 路徑錯誤或路徑未找到
04h INT 13 扇區未找到或讀取錯誤
  INT 24-2F 資料錯誤(CRC 錯誤)
  其他 開啟的檔案過多(沒有更多控制代碼的空間)
05h INT 13 復位失敗
  INT 24-2F 請求資料塊的長度錯誤
  其他 拒絕訪問
06h INT 13 驅動器中沒有介質或介質已更改
  INT 24-2F 尋道錯誤
  其他 無效控制代碼
07h INT 13 驅動器引數活動失敗
  INT 24-2F 未知介質型別
  其他 記憶體控制塊 (MCB) 被破壞
08h INT 13 DMA 溢位
  INT 24-2F 扇區未找到
  其他 記憶體不足
09h INT 13 DMA 嘗試跨越 64K 或超過 80h 扇區
  INT 15 無效的 APM 裝置識別符號
  INT 24, 2F 印表機缺紙
  其他 無效的記憶體塊地址
0Ah INT 13 檢測到壞扇區標誌
  INT 24-2F 寫入嘗試失敗
  其他 無效的環境
0Bh INT 13 檢測到壞磁軌
  INT 15 指定的裝置不在 APM 控制之下
  INT 24-2F 讀取故障
  其他 格式無效
0Ch INT 13 不支援的磁軌格式或無效的介質
  INT 24-2F 一般性故障
  其他 無效的訪問模式
0Dh INT 13 格式中扇區數無效
  INT 24-26 共享衝突
  其他 無效資料
0Eh INT 13 檢測到控制資料地址標記
  INT 24-2F 鎖定衝突或介質不可用
0Fh INT 13 DMA 仲裁級別超出範圍
  INT 24-2F 無效的磁碟更改
  其他 無效的驅動器
10h INT 13 讀取時出現不可糾正的 CRC 或 ECC 錯誤
  INT 24 FCB 不可使用
  其他 嘗試刪除當前目錄
11h INT 13 資料已透過 ECC 糾正
  INT 24-26 共享緩衝區溢位
  其他 這不是同一個裝置
12h INT 24 內碼表不匹配
  其他 沒有更多檔案,檔案索引超出範圍
13h INT 24-26 輸入不足
  其他 磁碟為防寫
14h INT 24, 26 磁碟空間不足
  其他 未知單元
15h   驅動器未就緒
16h   未知命令
17h   資料 CRC 錯誤
18h   請求資料塊的長度錯誤
19h   尋道錯誤
1Ah   未知介質型別(非 DOS 磁碟)
1Bh   扇區未找到
1Ch   印表機缺紙
1Dh   寫入故障
1Eh   讀取故障
1Fh   一般性故障
20h INT 13 控制器故障
  其他 共享衝突
21h   鎖定衝突
22h   磁碟更改無效 [注 2]
23h   FCB(檔案控制塊)不可用
24h   共享緩衝區溢位
25h   內碼表不匹配
26h   無法完成檔案操作(輸入不足)
27h   磁碟空間不足
30h INT 13 驅動器沒有介質感測器
31h INT 13 驅動器中沒有介質
32h INT 13 非預設介質
  其他 不支援網路請求
33h   遠端計算機未監聽
34h   網路上存在重複名稱
35h   找不到網路名稱
36h   網路繁忙
37h   網路裝置不再存在
38h   網路 BIOS 命令限制已超過
39h   網路介面卡硬體錯誤
3Ah   網路響應不正確
3Bh   意外的網路錯誤
3Ch   遠端介面卡不相容
3Dh   列印佇列已滿
3Eh   佇列未滿
3Fh   沒有足夠的空間列印檔案
40h INT 13 尋道失敗
  其他 網路名稱已被刪除
41h   拒絕訪問網路
42h   網路裝置型別不正確
43h   找不到網路名稱
44h   網路名稱限制已超過
45h   網路 BIOS 會話限制已超過
46h   暫時暫停
47h   網路請求未被接受
48h   網路列印/磁碟重定向已暫停
50h   檔案已存在
52h   無法建立目錄
53h   INT 24h 失敗
54h   重定向過多
55h   重複重定向
56h   密碼無效
57h   引數無效
58h   網路寫入故障
59h   此功能不支援網路
5Ah   缺少必要的系統元件
60h INT 15 請求的 APM 模式不可用(被阻止)
64h Mscdex.exe 未知錯誤
65h Mscdex.exe 未就緒
66h Mscdex.exe EMS 記憶體不再有效
67h Mscdex.exe 不是 High Sierra 或 ISO-9660 格式
68h Mscdex.exe 插槽門已開啟
80h INT 13 超時,無響應(驅動器可能不存在)
  INT 67 內部錯誤
  其他 無效的命令或功能未實現
81h INT 67 硬體故障
  Himem.sys 檢測到 VDISK 驅動程式
82h Himem.sys 發生了 A20 線錯誤
83h INT 67 無效控制代碼
84h INT 67 應用程式請求的未定義功能
85h INT 67 沒有更多可用控制代碼
86h INT 67 對映上下文儲存或恢復錯誤
  其他 請求的功能不受支援
87h INT 67 記憶體頁數不足
88h INT 67 可用的記憶體頁數不足
89h INT 67 請求的頁數為零
8Ah INT 67 遇到無效的邏輯頁號
8Bh INT 67 遇到無效的物理頁號
8Ch INT 67 頁對映硬體狀態儲存區已滿
8Dh INT 67 對映上下文儲存失敗
8Eh INT 67 對映上下文恢復失敗
  Himem.sys 一般 XMS 驅動程式錯誤
8Fh INT 67 未定義的子功能
  Himem.sys 不可恢復的 XMS 驅動程式錯誤
90h INT 67 未定義的屬性型別
  Himem.sys HMA 不存在或不受 XMS 提供程式管理
91h INT 67 此功能不受支援
  Himem.sys HMA 正在使用中
92h INT 67 成功,但源區域的一部分被覆蓋
  Himem.sys DX 小於 /HMAMIN 引數 (5.04-01)
93h INT 67 資料長度超過分配給控制代碼的空間
  Himem.sys HMA 未分配
94h INT 67 常規記憶體和擴充套件記憶體區域重疊
  Himem.sys A20 線仍在啟用
95h INT 67 邏輯頁內的偏移量超過邏輯頁的大小
96h INT 67 區域長度超過 1 Mb
97h INT 67 源和目標具有相同的控制代碼並重疊
98h INT 67 記憶體源或目標型別未定義
9Ah INT 67 指定的對映暫存器或 DMA 暫存器集不受支援
9Bh INT 67 所有對映暫存器或 DMA 暫存器集都被分配
9Ch INT 67 對映暫存器或 DMA 暫存器集不受支援
9Dh INT 67 未定義或未分配的對映或 DMA 暫存器集
9Eh INT 67 專用 DMA 通道不受支援
9Fh INT 67 指定的專用 DMA 通道不受支援
A0h INT 67 沒有此控制代碼名稱
  Himem.sys 所有擴充套件記憶體都被分配
A1h INT 67 找到的控制代碼沒有名稱或控制代碼名稱重複
  Himem.sys 所有可用的擴充套件記憶體控制代碼都被分配
A2h INT 67 嘗試繞過 1 M 常規地址空間
  Himem.sys 無效控制代碼
A3h INT 67 源陣列已損壞
  Himem.sys 源控制代碼無效
A4h INT 67 作業系統拒絕訪問
  Himem.sys 源偏移量無效
A5h Himem.sys 目標控制代碼無效
A6h Himem.sys 目標偏移量無效
A7h Himem.sys 長度無效
A8h Himem.sys 複製操作存在無效的重疊
A9h Himem.sys 發生奇偶校驗錯誤
AAh INT 13 驅動器未就緒
  Himem.sys 塊未鎖定
ABh Himem.sys 塊已鎖定
ACh Himem.sys 塊鎖定計數溢位
ADh Himem.sys 鎖定失敗
B0h Himem.sys 僅可使用更小的 UMB
  INT 13 驅動器中未鎖定卷
B1h Himem.sys 沒有可用的 UMB
  INT 13 驅動器中已鎖定卷
B2h Himem.sys UMB 段編號無效
  INT 13 卷不可移動
B3h INT 13 卷正在使用中,寫入快取未清空
B4h INT 13 鎖定計數已超過
B5h INT 13 有效的彈出請求失敗
B6h   介質為防寫
BBh INT 13 未定義的硬碟錯誤
CCh INT 13 硬碟寫入故障
E0h INT 13 硬碟狀態暫存器錯誤
FFh INT 13 硬碟上的檢測操作失敗
  INT 15 啟用地址線 A20 錯誤
  其他 找不到匹配的檔案,或沒有更多檔案,或 FCB 錯誤。
註釋
  1. 如果錯誤程式碼在 AX 暫存器中返回,則其最高有效位元組(在 AH 暫存器中)為零。
  2. ^ 與錯誤程式碼 22h 一起,介質識別符號指標在 ES:DI 暫存器中返回。此介質識別符號包含
    偏移量 00h - 12 位元組:磁碟的卷標,以 00h 結尾;
    偏移量 0Ch - 1 雙字:磁碟的序列號(以二進位制形式)。
  3. HIMEM.SYS 驅動程式 (5.04-01) 將錯誤程式碼返回到 BL 暫存器。
  4. 最新執行的 DOS 函式返回的錯誤程式碼儲存在 DOS 可交換資料區 SDA (A.01-3) 的偏移量 04h 處。BIOS 函式將其錯誤程式碼寫入 BIOS 資料區 (A.01-1),很可能是在單元 0040:0074h 中。

A.06-2 錯誤類別程式碼

[edit | edit source]

INT 21\AH=59h 函式 (8.02-65) 在 BH 暫存器中返回的錯誤類別程式碼儲存在 DOS 可交換資料區 SDA (A.01-3) 的偏移量 07h 處。錯誤類別程式碼的解釋如下表所示。

程式碼 描述
01h 資源不足(儲存空間或 I/O 通道)
02h 臨時情況(檔案或記錄鎖定)
03h 授權(拒絕訪問)
04h 內部(系統軟體錯誤)
05h 硬體故障
06h 系統故障(配置檔案丟失或不正確)
07h 應用程式程式錯誤
08h 找不到物件
09h 格式錯誤
0Ah 物件已鎖定
0Bh 介質錯誤
0Ch 物件已存在
0Dh 未知錯誤類別

A.06-3 建議的操作程式碼

[edit | edit source]

INT 21\AH=59h 函式 (8.02-5) 返回的建議操作程式碼儲存在 BL 暫存器中,並存儲在 DOS 可交換區域 SDA(A.01-3)的偏移量 06h 處。

程式碼 建議的操作
01h 重試
02h 稍後重試
03h 提示使用者重新輸入
04h 關閉已開啟的檔案,刪除臨時檔案並中止
05h 立即中止
06h 忽略此錯誤
07h 在使用者干預後重試

A.06-4 錯誤位置程式碼

[edit | edit source]

INT 21\AH=59h 函式 (8.02-65) 返回的錯誤位置程式碼儲存在 CH 暫存器中,並存儲在 DOS 可交換區域 SDA(A.01-3)的偏移量 03h 處。

程式碼 錯誤的可能位置
01h 未知或不合適
02h 塊裝置(磁碟錯誤)
03h 與網路相關
04h 連線到序列埠的裝置(通道超時)
05h 與記憶體相關

A.06-5 I/O 錯誤狀態程式碼

[edit | edit source]

INT 25 和 INT 26 處理程式 (8.02-85) 返回的錯誤狀態程式碼儲存在 AH 暫存器中。

程式碼 描述
01h 無效的命令
02h 無效的地址標記
03h 磁碟防寫(僅限 INT 26)
04h 未找到請求的扇區
08h DMA 失敗
10h 資料錯誤(CRC 錯誤)
20h 控制器故障
40h 尋道操作失敗
80h 裝置未響應(超時)

A.07 執行服務結構

[edit | edit source]

A.07-1 程式段字首

[edit | edit source]

當一個程式被載入到分配的記憶體段中執行時,程式的可執行程式碼被放置在偏移量 100h 及其之後。段的前一部分(偏移量 00h-FFh)被稱為 PSP,即程式段字首。它被填充了重要的服務資料,這些資料被 DOS 函式使用,並且可能被程式本身使用。

透過 DEBUG.EXE 可以最容易地檢視 PSP,DEBUG.EXE 本身是由 COMMAND.COM 直譯器建立的。圖 11 展示了顯示 PSP 部分內容的過程。該 PSP 的剩餘部分被填充為零。

圖 11

圖 11 中的測試程式是 CJPEG.EXE 檔案。引數 "-baseline" 和 "VC01.BMP" 被傳遞給測試程式,以作為從偏移量 5Ch 和 6Ch 開始的第一個和第二個 FCB 塊填充示例。這些內容以及其他一些 PSP 資料欄位的內容在下面的表格中解釋。

偏移量 大小 描述
00h 2 INT 20 命令(用於 CP/M 相容性)
02h 2 分配給程式的記憶體段之後的第一個段
06h 2 可執行程式碼的大小(用於 *.COM 檔案)
0Ah 4 儲存的 INT 22 終止地址
0Eh 4 儲存的 INT 23 Ctrl-Break 處理程式地址
12h 4 儲存的 INT 24 嚴重錯誤處理程式地址
16h 2 父 PSP 的段 [Note 1][Note 2]
18h 20 作業檔案表 (JFT)[Note 3]
2Ch 2 當前程序環境的段
2Eh 4 最後一次呼叫 INT 21 時進入的 SS:SP
32h 2 JFT 中的條目數量(預設值為 20)
34h 4 指向 JFT 的指標(預設值為 PSP:0018h)
3Ch 1 = 00h (= 01h 用於象形文字鍵盤)
40h 2 INT 21/AH=30h 返回的 DOS 版本
50h 2 指向 INT 21 函式排程程式的呼叫
5Ch 16 第一個 FCB 區域 [Note 4]
6Ch 16 第二個 FCB 區域 [Note 4]
80h 1 命令列尾部的長度 [Note 5][Note 6]
81h 127 命令列尾部或 DTA 區域 [Note 5][Note 6]
註釋
  1. ^ 如果偏移量 16h 處父 PSP 的段地址指向當前 PSP,則該程式被視為沒有父程序,或者換句話說,它本身就是父程序。這是永久載入程式的顯著特徵,例如,命令直譯器。永久載入程式無法透過呼叫 INT 20 或 INT 21\AH=4Ch 函式來終止。
  2. ^ 在保護模式下,一些 PSP 欄位,包括偏移量 16h 處的 "父" 段欄位,可能會被覆蓋。因此,跟蹤 PSP 引用鏈可能會變得混亂,除非每個候選 "父" PSP 段都確認存在典型的簽名,例如,偏移量 00h 處的程式碼 CD20h (INT 20) 或偏移量 50h 處的程式碼 CD21h。
  3. ^ a b c 噹噹前程式啟動時,它的 JFT(作業檔案表,偏移量 18h)包含 SFT(A.01-4)條目編號(每個條目一個位元組) — 用於 "已開啟" 的物件,這些物件是從父程序繼承的。JFT 中的空閒空間用 FFh 位元組填充。JFT 中的值 80h-FEh 對應於由網路重定向器開啟的遠端檔案。JFT 的預設大小 — 20 位元組 — 對已開啟物件的數量有限制。INT 21\AH=67h 函式 (8.02-76) 能夠克服此限制:它在 PSP 之外安排一個更大的 JFT,替換 PSP 中偏移量 34h 處的 JFT 指標以及偏移量 32h 處的 JFT 條目數量。但是,子程序在任何情況下都無法從其父程序繼承超過 20 個 "已開啟" 的物件。
  4. ^ a b 偏移量 5Ch 和 6Ch 處的區域被填充為未開啟的 FCB(A.09-5),其中包含從第一個和第二個命令列引數解析的資料。引數使用 INT 21\AX=2901h 函式 (8.02-19) 解析。引數的數量包括無法解析的引數。
  5. ^ a b "命令尾部" 區域 81h-FFh 被填充為命令列的副本,其中包含所有在命令名稱之後的引數。填充的命令尾部區域部分以位元組 0Dh 結束。填充部分的長度被寫入偏移量 80h 處。如果長度被設定為 7Fh,並且偏移量 FFh 處的位元組為 0Dh,則命令尾部的實際長度超過 126 位元組,並且其未截斷的版本應該在 CMDLINE 環境變數的值中找到。
  6. ^ "命令尾部" 區域 80h-FFh 被 "查詢檔案" 函式 INT 21\AH=11h,12h,4Eh,4Fh 用作預設的 DTA(資料傳輸區域)。您可以透過使用 INT 21\AH=1Ah 函式 (8.02-16) 更改 DTA 地址來防止 "命令尾部" 被覆蓋。

A.07-2 載入程式的資料塊

[edit | edit source]

下表顯示了 INT 21\AX=4B00h 和 INT 21\AX=4B01h 函式 (8.02-53) 用於將程式載入到記憶體中以供進一步執行的資料塊結構。

偏移量 大小 描述
00h 2 子程序的環境段 [Note 1]
02h 4 指向命令列的指標 [Note 2]
06h 4 指向偏移量 5Ch 處的 FCB 資料的指標 [Note 3]
0Ah 4 指向偏移量 6Ch 處的 FCB 資料的指標 [Note 3]
0Eh 4 返回:載入程式的堆疊頂 SS:SP [Note 4]
12h 4 返回:載入程式的入口點 CS:IP [Note 4]
註釋
  1. ^ 父程序的整個環境將被複制到這個段中。如果子程序應該被賦予對父程序環境本身的訪問許可權,而不是副本,那麼應該將 0000h 值分配給此資料塊中偏移量 00h 處的字。
  2. ^ 命令列必須包含所有將被寫入到子程序 PSP 的內容,從偏移量 80h 開始。[Note 5 to A.07-1] 命令列字串必須以一個位元組開頭,指定其長度,並且必須以位元組 0Dh 結尾。
  3. ^ 這個資料字串將被複制到子程序 PSP 中相應 FCB 塊的內部。[Note 4 to A.07-1] 表格 A.09-5 的 "N" 列顯示了此資料字串的所需結構。前 12 個位元組應該被填充,然後是 4 個位元組 00h。如果 FCB 應該保持為空,那麼它的第一個位元組必須是 00h,然後是 11 個位元組 20h。
  4. ^ 偏移量 0Eh 和 12h 處的雙字僅由 INT 21\AX=4B01h 函式返回。此函式載入程式,但不啟動其執行。返回的堆疊頂和入口點允許稍後啟動載入程式的執行。

A.07-3 執行狀態描述符

[edit | edit source]

下表顯示了 INT 21\AX=4B05h 函式 (8.02-54) 使用的執行狀態描述符中的資料結構。

偏移量 大小 描述
00h 2 = 0000h (保留)
02h 2 標誌 位 0 設定:程式為 *.EXE 格式
      位 1 設定:載入的程式碼為覆蓋
04h 4 指向程式名稱的指標,以 00h 位元組結束
08h 2 載入程式的 PSP 段地址
0Ah 4 載入程式的入口點 CS:IP
0Eh 4 載入程式的大小(包括 PSP)

A.07-4 用於伺服器函式的資料塊

[edit | edit source]

由於伺服器函式 INT 21\AX=5D00h (8.02-68) 能夠將任何 INT 21 函式作為單獨的程序執行,因此此資料塊定義了執行所選函式所需的所有暫存器的狀態。在呼叫所選函式之前,所有指定的狀態將自動從資料塊複製到暫存器中。

偏移量 大小 描述
00h 2 AX 暫存器的所需內容
02h 2 BX 暫存器的所需內容
04h 2 CX 暫存器的所需內容
06h 2 DX 暫存器的所需內容
08h 2 SI 暫存器的所需內容
0Ah 2 DI 暫存器的所需內容
0Ch 2 DS 暫存器的所需內容
0Eh 2 ES 暫存器所需的內容
10h 2 = 0000h (保留)
12h 2 虛擬機器識別碼 [注意 1]
14h 2 程序識別碼(即 PSP 段地址)
註釋
  1. ^ 如果選擇的功能要在當前的 MS-DOS 7 下執行,則應將 0000h 值指定為虛擬機器識別碼。
  2. ^ 當此資料塊用於透過 INT 21\AX=5D01h 函式(8.02-69)關閉程序時,只考慮偏移量為 12h 和 14h 的位元組,所有其他位元組都將被忽略。

A.07-5 中斷共享協議

[編輯 | 編輯原始碼]

許多驅動程式和 TSR 程式載入它們的中斷處理程序,並且必須將此處理程序的地址寫入中斷表中的特定單元格。但是,此特定單元格可能已被先前載入的另一個處理程序的地址佔用。如果新的處理程序必須替換舊的處理程序,則會出現如何釋放舊處理程序佔用的記憶體的問題。如果新的處理程序補充了舊處理程序的功能,則會出現如何安排它們互動的問題。在這兩種情況下,解決方案是每個駐留模組必須提供必要的資料,供以後可能載入的其他駐留模組使用。

安排駐留模組互動的第一步是 IBM 的中斷共享協議 (ISP),它規定存在一個 16 位元組的資料塊,該資料塊相對於對應駐留模組的呼叫地址具有固定位置。ISP 協議能夠形成一個可追溯的引用鏈,這些引用鏈指向所有共享公共中斷號的模組。ISP 協議提供了改變鏈中引用順序並從鏈中刪除某些引用的機會。後者是解除安裝駐留模組的必要條件。

根據 ISP 協議,寫入中斷表中的呼叫地址必須指向一個跳轉到 16 位元組位置的短跳轉命令,在那裡開始駐留模組的可執行程式碼。跳過的那 16 位元組僅是用於資料塊的空間。此資料塊的結構顯示在下表中。表中的所有偏移量都是從駐留模組的呼叫地址開始計算的。

偏移量 大小 描述
00h 2 指向可執行程式碼的短跳轉命令 (EBh 10h)
02h 4 處理程序鏈中前一個處理程序的地址
06h 2 簽名 4Bh 42h (= "KB")
08h 1 = 00h - 此處理程序不是第一個
    = 80h - 此處理程序是鏈中的第一個
09h 2 指向具有 RETF 命令的模組解除安裝子程式的指標
0Bh 7 保留(必須為零)

注意 1:許多駐留模組不符合 ISP 協議。為了防止引用鏈追蹤或駐留模組解除安裝,可以有意忽略它。

A.07-6 備用多路複用中斷規範 (AMIS)

[編輯 | 編輯原始碼]

第 8.03 部分中描述的多路複用中斷 INT 2F 有一個嚴重的缺點:由於開發人員的決定不一致,有時會將重合的識別碼分配給不同的 TSR 模組。為了避免此類衝突,有人提出了一個想法,即不要由模組開發人員事先分配識別碼,而是在模組載入過程中自動分配識別碼。據說這個想法的作者是 Ralf Brown。這個想法被備用多路複用中斷規範 (AMIS) 正式化,並由多路複用中斷 INT 2D 實施。本文的內容基於 AMIS 規範的 3.6 版。此外,每個使用多路複用中斷 INT 2D 的駐留模組都必須符合 IBM 的中斷共享協議 ISP (A.07-5)。

根據 AMIS 規範,應在對多路複用中斷 INT 2D 進行迴圈呼叫的過程中搜索駐留模組的識別碼,操作程式碼 AL = 00h,並且 AH 暫存器中的候選識別碼從 AH = 00h 開始逐次遞增。如果任何已載入的駐留模組認為 AH 暫存器中的特定候選識別碼是它自己的,它必須設定 AL = FFh,必須在 CH:CL 暫存器中返回其版本號,並且必須在 DX:DI 暫存器中返回指向長度不超過 80 位元組的簽名的指標,以位元組 00h 結束。當 AL 暫存器中返回的值為零時,搜尋迴圈應終止:這意味著沒有已載入的駐留模組已分配最後指定的候選識別碼。因此,後者是免費的,當前駐留模組可以將此識別碼分配給自身。

為了找出特定駐留模組是否已載入,應安排一個類似的迴圈,但具有其他終止條件。對於這個目的,由 DX:DI 暫存器中返回的地址指向的簽名起著主要作用。此簽名的前 16 位元組足以識別駐留模組。前 8 個位元組必須指定公司或開發人員的名稱,後 8 個位元組必須指定載入響應駐留模組的程式或驅動程式的名稱。允許縮寫名稱。如果名稱短於 8 個位元組,則應在末尾新增空格(位元組 20h)。簽名中 16 個位元組以外的其餘部分是可選的,但可以指定版本和其他有用資料。簽名檢查可以防止重複載入相同的駐留模組。用於簽名檢查的搜尋迴圈還會顯示分配給請求的駐留模組的識別碼。當識別碼已知時,可以呼叫此駐留模組的其他函式。

由於對多路複用中斷的呼叫需要透過引用鏈進行搜尋,並且執行速度很慢,因此透過 INT 2D 對模組的特定函式進行重複呼叫是不明智的(儘管允許使用操作程式碼大於 10h 的呼叫)。使用 CALL FAR 命令(7.03-08)直接地址模組的函式是可取的。為了獲取直接地址,應使用操作程式碼 AL = 01h 和 AH 暫存器中的特定模組識別碼呼叫一次 INT 2D 中斷。應儲存 DX:BX 暫存器中返回的直接呼叫地址,然後以後就不再需要對多路複用中斷進行更多呼叫。

除了提到的操作程式碼 AL = 00h 和 AL = 01h 的操作外,AMIS 規範還規定了其他一些操作,如以下表格所示。這些操作的統一程式碼顯示在表格的第一列中,允許對所有駐留模組應用相同的服務。某些操作是可選的。如果被地址的駐留模組在 AL 暫存器中返回狀態程式碼值 00h,則它不支援請求的操作。相反,返回的狀態程式碼值 FFh 確認請求的操作受支援並已成功完成。幾個操作可能會返回其他狀態程式碼值,通知有關駐留模組的特定功能。這些以及 AMIS 操作執行的一些其他特性在以下表格後的註釋中進行了解釋。

程式碼 描述 註釋
00h 安裝檢查
01h 請求直接地址 [註釋 1]
02h 解除安裝駐留模組 [注 2]
03h 請求 TSR 程式啟用 [注 3]
04h 報告鏈式中斷 [註釋 4]
05h 請求「熱鍵」列表 [註釋 5]
06h 請求裝置驅動程式資訊 [注意 6]
  1. ^ 返回的狀態值 AL = 00h 意味著請求的駐留模組無法使用 CALL FAR 命令進行地址訪問。DX:BX 暫存器中返回的地址的有效性必須由返回的狀態程式碼值 AL = FFh 進行確認。
  2. ^ 解除安裝駐留模組的請求必須在 DX:BX 暫存器中提供解除安裝操作完成後返回的地址,儘管駐留模組可能會忽略此地址。AL 暫存器中返回的狀態程式碼值(除 00h 和 FFh 外)具有以下含義:
    01 - 解除安裝嘗試失敗;
    02 - 解除安裝操作將在以後完成;
    03 - 模組沒有解除安裝程式並保持活動狀態;
    04 - 與 03 相同,但模組已停用;
    05 - 應在以後重複解除安裝嘗試;
    06 - 模組已停用,但無法解除安裝;
    07 - 與 03 相同,以及需要解除安裝驅動程式。
    返回狀態程式碼值 03、04 或 07 意味著需要啟動一個特殊的解除安裝程式。對於此程式,被地址的駐留模組必須在 BX 暫存器中返回其可執行程式碼載入到的段地址。
  3. ^ AL 暫存器中返回的狀態程式碼值(除 00h 和 FFh 外)具有以下含義:
    01 - 啟用嘗試應在以後重複;
    02 - 程式將在以後啟用;
    03 - 程式目前處於活動狀態;
    04 - 啟用嘗試失敗。
    成功啟用後,由狀態程式碼 FFh 確認,某些程式可能會在 BX 暫存器中報告額外資訊。失敗後,由狀態程式碼 04h 確認,額外資訊可能會在 BX 和 CX 暫存器中返回。如果失敗的原因未知,則 BX 和 CX 暫存器應返回零。
  4. ^ 對操作 04h 的請求必須在 BL 暫存器中指定要檢查的中斷號(除 INT 2D 外)。AL 暫存器中返回的狀態程式碼值(除 00h 外)具有以下含義:
    01 - 檢查結果無法確定;
    02 - 指定的中斷已被攔截;
    03 - 與 02 相同,以及處理程序地址 - 在 DX:BX 中;
    04 - 在 DX:BX 中 - 指向攔截列表的指標;
    FF - 指定的中斷未被攔截。
    狀態程式碼值 04 意味著 BL 暫存器中指定的中斷號被忽略。返回的列表由每個中斷的 3 位元組組成:第一個位元組,中斷號;接下來的 2 個位元組,該中斷處理程序入口地址的偏移量(在 DX 段內)。列表的末尾用中斷號位置的程式碼 2Dh 標記。
  5. ^ 成功完成後,由狀態程式碼 FFh 確認,在 DX:BX 暫存器中返回指向「熱鍵」列表的指標。此列表的結構在附錄 A.02-7 中描述。
  6. ^ 操作 06h 在 AL 暫存器中返回被地址的駐留模組安裝的驅動程式數量,在 DX:BX 暫存器中返回 - 指向這些安裝的驅動程式中第一個的頭部的指標 (A.05-1)。在 AH 暫存器中返回一個標誌位元組;此位元組中的位 3-7 保留,必須為零。其餘標誌的設定狀態應解釋如下:
    位 0 - 驅動程式無法從記憶體中解除安裝;
    位 1 - 驅動程式未包含在 DOS 的驅動程式鏈中;
    位 2 - 安裝的驅動程式不可重入。
    如果被地址的 TSR 程式未安裝驅動程式,它必須返回 AL = 00h 值。返回時,AH、BX 和 DX 暫存器的內容可能會任意更改。

A.08 軟盤驅動器的資料結構

[編輯 | 編輯原始碼]

A.08-1 BIOS 資料區中的軟盤驅動器資料

[編輯 | 編輯原始碼]

該表格展示了 BIOS 資料區域中與軟盤驅動器相關的資訊。所有偏移量均從段地址 0040h 開始計算,即從 BIOS 資料區域的起始位置開始。

偏移量 大小 描述
10h 2 標誌 0 :軟盤能夠引導 PC
      6–7 :軟盤驅動器數量減一
3Eh 1 位 7 由 IRQ6 處理程式設定,標誌著 FDD 任務完成
3Fh 1 軟盤驅動器中的電機狀態
40h 1 軟盤電機關閉超時計數
41h 1 狀態 0–4 :上次操作錯誤 [註釋 2]
      5 :通用控制器故障
      6 :尋道錯誤
      7 :驅動器未就緒
42h 3 軟盤驅動器控制器暫存器
8Bh 1 軟盤驅動器資料速率控制
8Fh 1 軟盤驅動器註冊
      0 :驅動器 0 支援 80 軌
      2 :驅動器 0 存在得到確認
      4 :驅動器 1 支援 80 軌
      6 :驅動器 1 存在得到確認
90h 1 軟盤驅動器 0 介質狀態
      0–2 =111b for 3.5" disks
      3 :軟盤 2.88 Mb
      4 :已確定介質型別
      6–7 :當前資料傳輸速率
91h 1 軟盤驅動器 1 介質狀態(與驅動器 0 相同)
94h 1 軟盤驅動器 0 當前磁軌號
95h 1 軟盤驅動器 1 當前磁軌號
註釋
  1. BIOS 資料區域中的資料放置可能取決於 BIOS 版本(A.01-1)。
  2. ^ 偏移量 41h 處的上次錯誤位元組的特定值應根據 INT 13 的表 A.06-1 中所示進行解釋。

A.08-2 訪問和格式化引數

[編輯 | 編輯原始碼]

計算機的 BIOS 系統將每個軟盤驅動器的訪問和格式化引數儲存在單獨的 11 位元組表中。使用 INT 13\AH=00h 函式(8.01-49)可以獲取任何特定軟盤驅動器的表的指標。此外,還會為預設(“當前”)軟盤驅動器建立一個類似的 11 位元組表;指向該表的指標儲存在中斷表內的單元格 0000:0078h(也稱為 INT 1E)中。

可以透過 INT 13\AH=18h 函式(8.01-54)更改訪問和格式化引數,但這些更改要等到軟盤控制器透過呼叫 INT 13\AH=00h(8.01-44)進行重置後才會生效。

偏移量 大小 描述
00h 1 引數,第一個位元組
      7–4 :磁頭移動步進速率
      3–0 :磁頭解除安裝時間 (0Fh = 0.24 s)
01h 1 引數,第二個位元組
      7–1 :磁頭載入時間 (01h = 0.004 s)
      0 :設定狀態表示透過 DMA 進行資料傳輸
02h 1 電機關閉延遲(以時鐘滴答 1/18 秒為單位)
03h 1 每扇區位元組數
      =00h 128 位元組,
      =01h 256 位元組,
      =02h 512 位元組,
      =03h 1024 位元組。
04h 1 每個磁軌的扇區數
05h 1 扇區間隙長度
      =2Ah 適用於 5.25" 軟盤,
      =1Bh 適用於 3.5" 軟盤。
07h 1 格式化時扇區間隙長度
      =50h 適用於 5.25" 軟盤,
      =6Ch 適用於 3.5" 軟盤。
08h 1 格式化填充位元組(預設值為 F6h)
09h 1 磁頭穩定時間(毫秒)
0Ah 1 電機啟動時間(滴答)(1 滴答 = 1/18 秒)

A.08-3 BIOS 註冊的軟盤驅動器型別

[編輯 | 編輯原始碼]

BIOS 設定程式將有關已註冊軟盤驅動器的資訊儲存在 CMOS 記憶體的單元格 10h 中。為了讀取這些資料,必須將單元格地址 10h 使用 OUT 命令(7.03-66)傳送到埠 70h,然後可以使用 IN 命令(7.03-26)從埠 71h 讀取所需的資料位元組(有關更多資訊,請參閱 A.14-1 的註釋 1)。所需的資料位元組出現在 AL 暫存器中;該位元組中的位 4–7 指定第一個軟盤驅動器的功能,位 0–3 指定第二個軟盤驅動器的功能(如果存在)。每個 4 位組表示的十六進位制值應根據下表獨立解釋。

軟盤驅動器型別
0 軟盤驅動器不存在
1 適用於 360 kb 5.25" 軟盤的驅動器
2 適用於 1.2 Mb 5.25" 軟盤的驅動器
3 適用於 720 kb 3.5" 軟盤的驅動器
4 適用於 1.44 Mb 3.5" 軟盤的驅動器
5 適用於 2.88 Mb 3.5" 軟盤的驅動器

A.09 目錄和檔案資料表

[編輯 | 編輯原始碼]

A.09-1 目錄記錄和檔案資料

[編輯 | 編輯原始碼]

有關檔案、卷標和子目錄的資料儲存在相應的目錄記錄中。下表中的第一列“D”展示了具有“短”名稱的物件的普通 32 位元組目錄記錄中的資料結構。DOS 的“查詢檔案”函式 INT 21\AH=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)讀取目錄記錄,並在 DTA 區域(8.02-16)中返回找到的資料;下表中的第二列“F4E”展示了這些函式返回的資料格式。其他“查詢檔案”函式 INT 21\AH=11h(8.02-11)和 INT 21\AH=12h(8.02-12)也返回 DTA 區域中的找到的資料,但格式不同。下表中的第三列“F1N”展示了使用普通 FCB 塊(附錄 A.09-5 中的“N”列)進行搜尋請求後返回的資料格式。但如果搜尋請求以擴充套件 FCB 塊的形式呈現(附錄 A.09-5 中的“E”列),則相同函式將返回其他資料結構,該資料結構顯示在下表中的第四列“F1E”中。

D F4E F1N F1E 大小 描述
      00h 1 = FFh – 擴充套件 FCB 的簽名
      06h 1 搜尋屬性(A.09-2)
  00h 00h 07h 1 磁碟:01h = A:,03h = C:,…[註釋 1]
00h 01h 01h 08h 8 名稱,後面追加空格以填充 8 個位元組
08h 09h 09h 10h 3 字尾,後面追加空格以填充 3 個位元組
  0Ch     1 搜尋屬性(A.09-2)
  0Dh     2 目錄記錄的序號
  0Fh     2 第一個目錄簇的編號
0Bh 15h 0Ch 13h 1 物件的實際屬性(A.09-2)
0Ch       1 輔助屬性位元組 [註釋 2][註釋 3]
0Dh   0Eh 15h 1 以 0.01 秒為單位的時間 [註釋 2]
0Eh   0Fh 16h 2 物件建立時間 [註釋 2]
10h   11h 18h 2 物件建立日期 [註釋 2]
12h   13h 1Ah 2 上次訪問日期
14h   15h 1Ch 2 起始簇編號 [註釋 4]
16h 16h 17h 1Eh 2 上次更新時間
18h 18h 19h 20h 2 上次更新日期
1Ah   1Bh 22h 2 起始簇編號 [註釋 4]
1Ch 1Ah 1Dh 24h 4 物件的位元組大小(二進位制形式)
  1Eh     13 物件的名稱和字尾 [註釋 5]
註釋
  1. ^ 搜尋函式 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)返回該位元組,如果透過網路訪問磁碟,則其第 7 位被設定。
  2. ^ 如果物件是在 DOS 下建立的,則該資料欄位不會被填充。DOS 下的複製過程不會複製該欄位中可能存在的資料。
  3. ^ 該資料欄位由 Windows-2000/XP 作業系統使用,但作者沒有關於這些資料作用的資訊。
  4. ^ FAT-16 卷中物件的起始簇編號是偏移量 1Ah 處的字;偏移量 14h 處的欄位未使用。但在 FAT-32 卷中,簇編號是雙字。該雙字的最高兩位位元組儲存在偏移量 14h 處。
  5. ^ 搜尋函式 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)不會覆蓋偏移量 01h 處的名稱搜尋模板;找到物件的實際名稱,以 00h 位元組結尾,將返回到偏移量 1Eh 處。

A.09-2 屬性位元組的結構

[編輯 | 編輯原始碼]

目錄記錄中偏移量 0Bh 處的屬性位元組(A.09-1)定義了與該記錄關聯的物件的類別。下表解釋了屬性位元組的位欄位。

描述
0 只讀檔案
1 隱藏檔案
2 系統檔案
3 卷標(對於檔案和目錄必須為零)
4 目錄(對於檔案和卷標必須為零)
5 要儲存在存檔中的檔案
6,7 在 MS-DOS 下未使用,必須為零

註釋 1:屬性位元組的 0Fh 值被認為是與具有“長”名稱(A.09-3)的檔案關聯的 LFN 目錄記錄的簽名。這些記錄由 Windows-95/98/ME 作業系統建立。

註釋 2:屬性位元組中位 3 和 4 的狀態不能透過 INT 21\AX=4301h 函式(8.02-39)或 ATTRIB.EXE 實用程式(6.01)更改。

註釋 3:檔案搜尋函式 INT 21\AX=4E00h(8.02-57)和 INT 21\AH=4Fh(8.02-58)忽略屬性位元組中位 0 和 5 的狀態。

註釋 4:擴充套件的“開啟檔案”函式 INT 21\AX=6C00h(8.02-78)在 CX 暫存器中接受一個屬性字,其位 4 和 6-15 被清除。其他位的角色與表 A.09-2 中所示相同。

A.09-3 LFN 目錄記錄的格式

[編輯 | 編輯原始碼]

每個由 Windows-95/98/ME 作業系統接受的“長”檔名至少佔用幾個標準大小為 32 位元組的目錄記錄。在這些記錄中的最後一個記錄中儲存了“長”檔名的截斷版本;其結構與表 A.09-1 中所示相同。但與同一檔案關聯的其餘記錄儲存了“長”檔名的 Unicode 字元。這些剩餘的 LFN 記錄具有其他結構,如下表所示。

偏移量 大小 描述
00h 1 LFN 記錄的序號 [註釋 1]
01h 10 “長”檔名字元的第一部分
0Bh 1 = 0Fh – LFN 記錄的簽名
0Ch 1 = 00h (保留)
0Dh 1 短檔名校驗和 [注 2]
10h 12 "長" 檔名的第二部分字元
1Ah 2 = 0000h 適用於所有 LFN 記錄
1Ch 4 "長" 檔名的第三部分字元
註釋
  1. ^ 與同一“長”檔名關聯的最後一個 LFN 記錄,透過第一個位元組中的第 6 位設定為 1 來標記。
  2. ^ 短檔名校驗和位元組是透過將短檔名的 11 個位元組加起來計算的,在新增每個下一個字元位元組之前,將中間結果向右旋轉一位。

A.09-4 訪問和共享位元組的位域

[編輯 | 編輯原始碼]

在準備訪問物件時,INT 21\AH=3Dh (8.02-33) 和 INT 21\AX=6C00h (8.02-78) 函式接受一個訪問條件位元組。此位元組被寫入到相應的 SFT 條目中的偏移量 02h 位置的單元格 (A.01-4)。下表顯示了訪問和共享條件位元組中位域的作用。

描述
1-0 訪問條件
00b – 僅供讀取
01b – 僅供寫入
10b – 既可讀取也可寫入
11b – 用於執行和傳輸
2 如果設定為 1,則禁止更新檔案的最後訪問時間
3 = 0b (保留)
6-4 共享條件
000b – 相容模式
001b – 禁止其他人訪問
010b – 禁止其他人寫入
011b – 禁止其他人讀取
100b – 允許其他人完全訪問
7 如果設定為 1,則檔案控制代碼將不會被子程序繼承。

注 1:除非載入 SHARE.EXE 實用程式,否則將忽略共享條件。

注 2:以前的 MS-DOS 版本要求第 2 位為 0。

A.09-5 未開啟的檔案控制塊

[編輯 | 編輯原始碼]

檔案控制塊 (FCB) 是物件屬性規範的過時形式。它無法訪問當前目錄之外的物件,也無法訪問具有 FAT-32 檔案系統的磁碟。儘管如此,一些函式仍然使用部分填充的 (未開啟的) FCB 作為物件搜尋、重新命名和刪除的規範模板。與使用完全填充的 (已開啟) FCB 塊的操作不同,使用未開啟的 FCB 的操作 (INT 21\AH=11h, 12h, 13h, 17h) 仍然在使用,並且可以應用於具有 FAT-32 檔案系統的磁碟上的當前目錄中的物件。下表顯示了未開啟的 FCB 的資料結構。

在 MS-DOS 7 中,允許兩種形式的 FCB 塊:長度不超過 36 位元組的普通 FCB 塊和長度不超過 43 位元組的擴充套件 FCB。擴充套件 FCB 的一個顯著特點是其第一個位元組的值為 FFh。普通 FCB 塊僅定義檔案,除了那些具有“隱藏”和“系統”屬性的檔案。擴充套件 FSB 包括搜尋屬性規範,因此可以應用於不同的物件:檔案、卷標和子目錄。普通 FCB 和擴充套件 FCB 都可以完全填充 (已開啟) 和部分填充 (未開啟)。下表的“N”列顯示了未開啟的普通 FCB 塊中的資料結構,“E”列顯示了未開啟的擴充套件 FCB 塊中的相同結構。下表中未顯示的那些 FCB 位元組必須具有 00h 值。

N E 大小 描述
  00h 1 = FFh – 擴充套件 FCB 的簽名
  06h 1 搜尋屬性規範 (A.09-2)
00h 07h 1 邏輯磁碟號:00h = “當前”磁碟,01h = A:,03h = C:,依此類推 (除了 FFh 值)。
01h 08h 8 物件的名稱或其搜尋掩碼 [注 1]
09h 10h 3 物件的副檔名或其搜尋掩碼 [注 1]
0Ch 13h 1 返回時:搜尋屬性 (從偏移量 06h 開始)
0Dh 14h 2 返回時:目錄中物件的記錄號
0Fh 16h 2 返回時:當前目錄的簇號
11h 18h 8 呼叫 INT 21\AH=17h 時:檔案的新的名稱
15h 1Ch 1 返回時:磁碟號 (01h=A:,03h=C:,依此類推)
19h 20h 3 呼叫 INT 21\AH=17h 時:檔案的新的副檔名
註釋
  1. ^ 在 FCB 中,名稱和副檔名的所有字元都必須為大寫。名稱在其名義長度 8 個位元組後附加空格 (20h),副檔名在其名義長度 3 個位元組後附加空格。如果為空,則名稱和副檔名欄位都必須填充空格。上述以及一些其他填充 FCB 欄位的要求可以透過 INT 21\AH=29h 函式 (8.02-19) 來滿足。
  2. 第一次呼叫時,函式 INT 21\AH=11h (8.02-11) 和 INT 21\AH=13h (8.02-13) 要求在普通 FCB 中偏移量 0Ch 之後的所有欄位和在擴充套件 FCB 中偏移量 13h 之後的所有欄位的值為 00h。返回時,這些欄位將包含資料,這些資料必須從每次之前的搜尋呼叫完整地保留到每次接下來的搜尋呼叫。在相同的 FCB 欄位中,INT 21\AH=17h 函式 (8.02-14) 接受要重新命名的檔案的新的名稱,需要為普通 FCB 提供長度為 28 個位元組的緩衝區,為擴充套件 FCB 提供長度為 35 個位元組的緩衝區。
  3. 未開啟的 FCB 塊不受 CONFIG.SYS 檔案中的 FCBS 命令規範 (4.10) 限制。

A.09-6 CD 目錄記錄的規範結構

[編輯 | 編輯原始碼]

High Sierra 和 ISO 9660 檔案系統在 CD 目錄記錄中實現略微不同的資料結構。INT 2F\AX=150Fh 函式 (8.03-19) 可以將這兩種資料結構都轉換為一個通用的規範形式,如下所示。

偏移量 大小 描述
00h 1 屬性記錄的長度(以邏輯塊為單位)
01h 4 檔案的第一個邏輯塊號
05h 2 檔案的邏輯塊大小
07h 4 檔案的大小(以位元組為單位)
0Bh 7 日期和時間
12h 1 位標誌
13h 1 交織大小(僅限 AVI 檔案)
14h 1 交織跳過因子(僅限 AVI 檔案)
15h 2 卷集序列號
17h 1 檔名的長度
18h 38 檔名,以 00h 位元組結尾
3Eh 2 檔案版本號
40h 1 系統資料塊中的位元組數
41h 220 系統資料塊

A.10 影片資料表

[編輯 | 編輯原始碼]

A.10-1 選定的影片模式

[編輯 | 編輯原始碼]

影片模式定義螢幕外觀。BIOS 和 DOS 都使用文字影片模式:彩色影片模式 03h 或單色影片模式 07h。每個程式都可以設定最合適的影片模式,無論是文字模式還是圖形模式。

可用的影片模式取決於 PC 的硬體。在硬體演進過程中,為了相容性,一些影片模式已經變得很常見。後來,影片模式的一個子集獲得了標準的地位。下表僅列出了那些幾乎可以肯定被任何現代顯示卡支援的影片模式。內部記憶體不足的顯示卡可能無法支援高解析度的圖形影片模式。1991 年之前生產的過時的 PC 根本不支援 SVGA 影片模式。

EGA 和 VGA 影片模式由一個位元組的程式碼定義,該程式碼在下面表格的第一列中指定。可以透過 INT 10\AH=00h 函式 (8.01-10) 設定這些影片模式。

SVGA 影片模式由 2 位元組的十六進位制程式碼定義,該程式碼應在 INT 10\AX=4F02h 函式 (8.01-37) 的 BX 暫存器中指定。下表沒有指定 SVGA 影片模式程式碼的最高有效半位元組,因為這個半位元組 (位 15–12) 用於其他用途。其第 12 位和第 13 位必須為 0,第 14 位啟用線性幀緩衝區訪問,第 15 位強制保留影片記憶體內容。例如,如果要清除影片記憶體,可以指定 BX=0102h;如果要保留影片記憶體內容,可以指定 BX=8102h:在這兩種情況下,您都將獲得相同的影片模式,該模式在下面表格的第一列中指定為 102h。其他 SVGA 影片模式的程式碼以相同的方式顯示——不指定最高有效半位元組。非 SVGA 影片模式的程式碼可以在 INT 10\AX=4F02h 函式中 BX 暫存器的最低有效位元組中指定,而其位 15 和 14 用於上述目的,位 13–8 設定為 0。

表格的第二列中將文字和圖形單色影片模式標記為“b/w”(而不是顏色數)。

表格的第 3 列中將文字影片模式的特徵描述為每行字元數和每螢幕高度的行數。例如,定義 80x25 表示您可以訪問行 0–24 和每行中的字元單元格 0–79。所有列出的文字模式都接受 8x16 字型。

圖形模式的特徵描述為其以畫素為單位的解析度,顯示在第 4 列中。例如,解析度 640x480 表示您可以訪問螢幕行 0–479 和每行中的畫素 0–639。

表格的第 5 列顯示了使用 UMB 地址空間中的固定影片緩衝區的那些影片模式的影片緩衝區起始地址。

影片模式 顏色 文字 圖形 緩衝區
01h 16 40x25   B800 VGA
03h 16 80x25   B800 VGA
06h 黑白   640x200 B800 EGA,VGA
07h 黑白 80x25   B000 VGA
0Eh 16   640x200 A000 EGA,VGA
0Fh 黑白   640x350 A000 EGA,VGA
10h 16   640x350 A000 VGA
11h 黑白   640x480 A000 VGA
12h 16   640x480 A000 VGA
13h 256   320x200 A000 VGA
100h 256   640x400 *1 SVGA
101h 256   640x480 *1 SVGA
102h 16   800x600 *1 SVGA
103h 256   800x600 *1 SVGA
104h 16   1024x768 *1 SVGA
105h 256   1024x768 *1 SVGA
108h 16 80x60   *1 SVGA
109h 16 132x25   *1 SVGA
10Ah 16 132x43   *1 SVGA
10Bh 16 132x50   *1 SVGA
10Ch 16 132x60   *1 SVGA
110h 32k   640x480 *1 SVGA
111h 64k   640x480 *1 SVGA
112h 16M   640x480 *1 SVGA
113h 32k   800x600 *1 SVGA
114h 64k   800x600 *1 SVGA
115h 16M   800x600 *1 SVGA
116h 32k   1024x768 *1 SVGA
117h 64k   1024x768 *1 SVGA
118h 16M   1024x768 *1 SVGA
119h 32k   1280x1024 *1 SVGA
11Ah 64k   1280x1024 *1 SVGA
11Bh 16M   1280x1024 *1 SVGA
120h 256   1600x1200 *1 SVGA

注 1:SVGA 影片模式下,影片記憶體訪問“視窗”在地址空間中的位置和大小可能取決於 PC 的硬體。應透過呼叫 INT 10\AX=4F01h 函式(8.01-36,A.10-7)確定影片記憶體訪問引數。

注 2:當 SVGA 標準尚未被採用時,與 SVGA 的 102h 影片模式等效的是 6Ah 影片模式(800x600x16)。仍然可以透過 INT 10\AH=00h 函式(8.01-10)設定 6Ah 影片模式。

注 3:SVGA 標準為特殊影片模式保留了 BX=81FFh 程式碼,使能對影片記憶體的無限直接訪問。

A.10-2 關於影片介面卡狀態的資訊

[編輯 | 編輯原始碼]

下表顯示了 INT 10\AH=1Bh 函式(8.01-34)返回的 64 位元組資料塊的結構。此塊顯示有關影片介面卡當前狀態的資訊。

偏移量 大小 描述
00h 4 靜態功能表的地址(A.10-3)
04h 1 當前影片模式
05h 2 每行的列數或畫素數
07h 2 重新整理緩衝區的大小(以位元組為單位)
09h 2 重新整理緩衝區的起始地址
0Bh 16 頁面 0–7 的游標位置(每個 2 位元組)
1Bh 2 游標的起始和終止掃描線
1Dh 1 活動螢幕頁
1Eh 2 CRT 控制器埠地址
20h 2 傳送到埠 03x8h 和 03x9h 的最後值
22h 1 行數(或螢幕線數)減一
23h 2 每個字型字元的位元組數
25h 1 活動影片介面卡程式碼
26h 1 備用影片介面卡程式碼(如果存在)
27h 2 影片模式的顏色數(0000h = 單色)
29h 1 影片模式支援的螢幕頁數
2Ah 1 活動掃描線[注 1]
2Bh 1 字元生成器的主要字型塊
2Ch 1 字元生成器的次要字型塊
2Dh 1 當前狀態標誌[注 2]
31h 1 影片記憶體,00h–03h 分別對應於 64,128,192,256k
32h 1 標誌,與表 A.10-3 中偏移量 0Eh 處的標誌相同。
註釋
  1. ^ 活動掃描線數由偏移量 2Ah 處的位元組中一個位的設定狀態定義。位 0、1、2、3、4、5、6 的設定狀態分別對應於 200、350、400、480、512、600、768 的線數。
  2. ^ 偏移量 2Dh 處的標誌位元組中的位具有以下含義
    位 0 - 對影片模式選擇的限制
    位 1 - 灰色疊加功能開啟
    位 2 - 連線了單色顯示器
    位 3 - 停用預設調色盤載入
    位 4 - 游標模擬啟用
    位 5 - 顏色位元組中的第 7 位的作用(A.10-5)
    位 6 - 不支援 9 點寬字型
    如果標誌位元組中的第 5 位被清除,則顏色位元組中的第 7 位定義背景的亮度,否則定義閃爍。

A.10-3 靜態功能表的格式

[編輯 | 編輯原始碼]

靜態功能表告知 PC 影片介面卡可能支援的各種功能。INT 10\AH=1Bh 函式(8.01-34)在當前影片介面卡狀態表(A.10-2)的偏移量 00h 處返回指向靜態功能表的指標。

偏移量 大小 描述
00h 7 位 0–13h 對應於影片模式 00h–13h;如果一位被設定,則相應的影片模式受支援。其餘位保留用於 OEM 影片模式。
07h 1 位 0、1、2、3、4、5、6 表示支援掃描線數 200、350、400、480、512、600、768。
08h 1 文字影片模式中的最大字型數
09h 1 文字影片模式中的活動字型最大數
0Ah 2 支援的操作
位 0 - 所有顯示器上的所有模式都支援
位 1 - 支援灰色疊加功能
位 2 - 支援字元字型載入功能
位 3 - 支援啟用/停用預設調色盤載入
位 4 - 支援游標模擬功能
位 5 - 存在內部 EGA 調色盤
位 6 - 存在彩色調色盤
位 7 - 支援顏色暫存器分頁功能
位 8 - 支援光筆(INT 10\AH=04h)
位 9 - 支援儲存/恢復狀態功能 1Ch
位 10 - 支援強度/閃爍切換(A.10-5)
位 11 - 支援多個影片介面卡
0Eh 1 字型和調色盤支援
位 0 - 支援 512 字元集
位 1 - 支援動態確定儲存區域
位 2 - 支援文字字型覆蓋
位 3 - 支援圖形字型覆蓋
位 4 - 支援調色盤覆蓋
位 5 - 支援影片介面卡程式碼擴充套件

A.10-4 BIOS 關於 SVGA 擴充套件的資訊

[編輯 | 編輯原始碼]

下表顯示了 INT 10\AX=4F00 函式(8.01-35)返回的 512 位元組長資料塊中的選定資料。這些資料描述了影片介面卡的固定儲存晶片中提供的軟體。

偏移量 大小 描述
00h 4 簽名“VESA”或“VBE2”
04h 2 SVGA BIOS 擴充套件的版本號
06h 4 指向製造商(OEM)名稱的指標
0Eh 4 指向支援的影片模式列表的指標(結束標記 FFFFh)
12h 2 影片記憶體的大小(以 64 kb 塊為單位)

A.10-5 16 色程式碼

[編輯 | 編輯原始碼]

雖然 AT 相容計算機的硬體建議了各種各樣的影片模式,但 BIOS 和 MS-DOS 7 的預設影片模式都是 16 色 80x25 文字影片模式 03h。對於此影片模式和所有其他 16 色影片模式(A.10-1),顏色由 4 位程式碼定義,如下表所示。

0000 0 黑色 1000 8 灰色
0001 1 藍色 1001 9 亮藍色
0010 2 綠色 1010 10 亮綠色
0011 3 青色 1011 11 亮青色
0100 4 紅色 1100 12 亮紅色
0101 5 洋紅色 1101 13 亮洋紅色
0110 6 棕色 1110 14 黃色
0111 7 白色 1111 15 亮白色

顏色程式碼用於組合顏色位元組,也稱為顯示屬性位元組。文字影片模式下的影片記憶體充滿了交替的顏色位元組和字元位元組。在每個顏色位元組中,位 3–0 定義前景色(字元的)顏色,位 6–4 定義背景色。預設情況下,第 7 位定義字元的閃爍而不是背景的亮度,但第 7 位的作用可以透過 INT 10\AX=1003h 函式(8.01-23)重新程式設計,然後兩個 4 位組中的最高有效位將具有相同的任務。預設情況下,第 3 位定義前景色亮度,但此作用也可以透過 INT 10\AX=1103h 函式(8.01-28)重新程式設計,然後第 3 位將重定向字元生成器到另一個字型塊,從而能夠同時從兩個字型顯示字元。

A.10-6 BIOS 資料區中的影片資料欄位

[編輯 | 編輯原始碼]

下表顯示了 BIOS 資料區中與計算機影片子系統相關的選定專案。表中所有偏移量都從 BIOS 資料區的開頭(A.01-1)計算,該資料區的段地址為 0040h。

偏移量 大小 描述
10h 2 位 5–4 定義初始影片模式
00b 根據影片介面卡設定
01b 40x25 文字 CGA 彩色模式
10b 80x25 文字 CGA 彩色模式
11b 80x25 單色文字模式
49h 1 當前影片模式(A.10-1)
4Ah 2 每螢幕寬度的列數(或畫素數)
4Ch 2 影片緩衝區的螢幕頁大小(以位元組為單位)
4Eh 2 影片緩衝區中當前頁的起始地址
50h 16 每個 8 個影片頁上的游標 XY 位置
60h 2 游標起始和結束掃描線(INT 10/AH=01h)
62h 1 活動螢幕頁號
63h 2 CRT 控制器基本 I/O 埠地址(通常為 03D4h)
65h 1 傳送到埠 03B8h/03D8h 的最後一個控制位元組值
位 5 – 閃爍控制(INT 10\AX=1003h)
66h 1 最後傳送到 I/O 埠 03D9h 的控制位元組值
位 4 – 背景亮度
84h 1 螢幕上的行數(或線數)減一
85h 2 字型高度(以掃描線為單位)
87h 5 影片介面卡控制標誌
位 0: – 游標模擬停用
位 1: – 連線了單色顯示器
位 2: – 等待 CRT 顯示器啟用
位 7: – 在設定影片模式時不要清除 RAM
A8h 4 指向 VGA 影片指標表的指標

注 1: 顯示的資料位置可能取決於 BIOS 版本(A.01-1)。

A.10-7 請求的 SVGA 影片模式的功能

[編輯 | 編輯原始碼]

此表顯示了來自 256 位元組資料塊的選定資料,該資料塊由 INT 10\AX=4F01 函式(8.01-36)在響應關於計算機硬體支援的任何 SVGA 影片模式的請求時返回。

偏移量 大小 描述
00h 2 標誌 位 0 – 請求的影片模式受支援
      位 2 – 支援函式 8.01-21、8.01-33
      位 3 – 為彩色影片模式設定
      位 4 – 為圖形影片模式設定
      位 5 – 影片模式不同於 VGA 標準
      位 6 – 不支援記憶體庫切換
      位 7 – 支援線性幀緩衝區
02h 1 視窗“A”
      位 0 – 滑動視窗“A”處於活動狀態
      位 1 – 視窗“A”可讀
      位 2 – 視窗“A”可寫
03h 1 視窗“B”: 與偏移量 02h 的視窗“A”相同
04h 2 視窗“A”、“B”在影片記憶體中的移位步長(以 kb 為單位)
06h 2 滑動視窗“A”和“B”的大小(以 kb 為單位)
08h 2 視窗“A”在 CPU 地址空間中的段地址
0Ah 2 視窗“B”在 CPU 地址空間中的段地址
0Ch 4 用於滑動視窗定位程式的直接呼叫地址,類似於 INT 10\AX=4F05h(8.01-39)
10h 2 每行影片記憶體的位元組數
12h 2 圖形影片模式的螢幕行長度(以畫素為單位)或文字影片模式的字元單元長度
14h 2 圖形影片模式的螢幕高度(以畫素為單位)或文字影片模式的字元單元高度
16h 1 字元單元寬度(以畫素為單位)
17h 1 字元單元高度(以畫素為單位)
18h 1 影片記憶體平面的數量
19h 1 每個畫素的影片記憶體位數
1Ah 1 影片介面卡記憶體庫的數量
1Bh 1 影片記憶體填充模型
00h 文字、備用字元和顏色位元組
03h 16 色圖形 EGA 模型
04h 具有“打包”畫素的圖形模型
06h 每個畫素 3 個顏色位元組(HiColor)
07h 亮度-色度模型 (YUV/YIQ)
1Ch 1 影片記憶體庫大小(以千位元組為單位)
1Dh 1 螢幕頁面的數量
28h 4 線性影片緩衝區的物理地址 (VBE v2.0)

A.11 PC 的硬體規格

[編輯 | 編輯原始碼]

A.11-1 硬體配置字

[編輯 | 編輯原始碼]

硬體配置字由 INT 11 處理程式(8.01-42)返回;它在 BIOS 資料區域(A.01-1)中的地址 0040:0010h 處讀取此字(確切地址可能取決於 BIOS 版本)。硬體配置字中的位欄位應根據下表進行解釋。

描述
0 PC 可以從現有的軟盤驅動器啟動
1 存在數學協處理器
2 連線了 BIOS 控制的指向裝置(滑鼠)
4-5 初始影片模式程式碼 (A.10-1)
6-7 軟盤驅動器數量減一(如果位 0 設定)
9-11 可用序列埠(COM 埠)的數量
12 存在遊戲埠(用於操縱桿)
13 存在內部調變解調器
14-15 可用並行埠(LPT 埠)的數量

A.11-2 用於 HIMEM.SYS 驅動程式的 PC 模型識別符號

[編輯 | 編輯原始碼]

為了啟用對計算機擴充套件記憶體的訪問,HIMEM.SYS 驅動程式 (5.04-01) 必須確定 CPU 模型。但是,在某些計算機上,HIMEM.SYS 無法正確確定 CPU 模型,因此,應在驅動程式的命令列中顯式指定計算機識別符號或其數字程式碼。

下表顯示了至少對於 HIMEM.SYS 驅動程式的某些版本無法確保 CPU 確定的計算機的識別符號和相應的數字程式碼。此表中的第一個位置(程式碼 1)是一個例外:IBM AT 是一個可確定的模型,它代表預設選擇。HIMEM.SYS 驅動程式的最新版本能夠正確檢測此表中指定的大部分 PC 型別,除了 Acer 1100、Wyse 和 IBM 7552 之外。

識別符號 程式碼 PC 模型
at 1 IBM PC AT 及相容模型
ps2 2 IBM PS/2
ptlcascade 3 Phoenix Cascade BIOS
hpvectra 4 HP Vectra (A & A+)
att6300plus 5 AT&T 6300 Plus
acer1100 6 Acer 1100
toshiba 7 東芝 1600 & 1200XE
wyse 8 Wyse 12.5 兆赫 286
tulip 9 Tulip SX
zenith 10 Zenith ZBIOS
at1 11 由 IBM 保留
at2 12 由 IBM 保留
css 12 CSS Labs
at3 13 由 IBM 保留
philips 13 飛利浦
fasthp 14 HP Vectra
ibm7552 15 IBM 7552 工業計算機
bullmicral 16 Bull Micral 60
dell 17 戴爾 XBIOS

A.11-3 鍵盤控制器

[編輯 | 編輯原始碼]

鍵盤控制器是計算機主機板上的一個晶片。儘管鍵盤控制器的型別可能不同,但在所有 AT 相容計算機中,它們的任務和介面都是統一的。CPU 和鍵盤控制器之間的主要互動透過埠 60h 和 64h 進行。

埠 64h 始終透過 IN 命令 (7.03-26) 開啟,以便讀取鍵盤控制器的當前狀態。從埠 64h 讀取的狀態位元組中的位的狀態應解釋如下

位 7 – 從鍵盤傳送的資料中發生錯誤
位 6 – 鍵盤沒有響應控制器
位 4 – 鍵盤被 ADh 命令阻塞
位 2 – 鍵盤的自檢已成功
位 1 – 上一次操作尚未完成
位 0 – 準備好在埠 60h 中讀取鍵碼

在每次按鍵和每次按鍵釋放時,鍵盤控制器都會在埠 60h 中顯示轉換後的鍵碼,並且緊隨其後的是透過埠 64h 中的位 0 和控制器的輸出線的位 4 來宣佈其準備就緒狀態。[注 1] 後者訊號會呼叫 INT 09 處理程式 (8.01-09),該處理程式會從埠 60h 讀取準備好的位元組。對埠 60h 的每次讀取訪問都會清除埠 64h 中的位 0。

此外,埠 64h 接收使用 OUT 命令 (7.03-66) 傳送給鍵盤控制器的操作程式碼。由於鍵盤控制器比 CPU 慢得多,因此在傳送操作程式碼之前,CPU 必須等到從同一埠 64h 讀取的狀態位元組中的位 1 被清除:這將表示鍵盤控制器已完成其先前的操作,並準備好接收下一個操作程式碼以執行。下表顯示了可能傳送給鍵盤控制器的埠 64h 的一些重要操作的程式碼。

程式碼 操作
ADh 阻塞鍵盤(關閉它)
AEh 啟用鍵盤(開啟它)
D1h 開啟埠 60h 用於資料接收[注 1]
EDh 開啟埠 60h 用於資料接收[注 2]
FEh 向 CPU 傳送復位訊號[注 3]
註釋
  1. ^ a b 鍵盤控制器透過埠 64h 接收到操作程式碼 D1h 後,開始等待透過埠 60h 接收資料位元組,然後將接收到的資料位元組傳輸到其輸出匯流排。資料位元組的位以以下方式分配到輸出匯流排線路上
    位 7 – 透過資料線向鍵盤輸出命令;
    位 6 – 透過時鐘線向鍵盤輸出時鐘;
    位 4 – 透過 IRQ 1 線呼叫 INT 09 (8.01-09);
    位 1 – 連線到 CPU 地址線 A20 的門控;
    位 0 – 連線到 CPU 的復位引腳。
    控制器的輸出線的活動狀態對應於資料位元組中位位的清除狀態;因此,不允許傳送具有清除位 0 的資料位元組——CPU 將被阻塞。由於相同的原因,為了開啟 A20 線門控,應將資料位元組 FFh 傳送到埠 60h,為了關閉對 HMA 的訪問,應傳送資料位元組 FDh。
  2. ^ 鍵盤控制器在透過埠 64h 接收操作碼 EDh 後,開始等待透過埠 60h 接收資料位元組,然後將接收到的資料位元組的位狀態傳輸到鍵盤 LED 指示燈的控制線,具體來說:
    位 2 – 傳輸到 Caps Lock 指示燈;
    位 1 – 傳輸到 Num Lock 指示燈;
    位 0 – 傳輸到 Scroll Lock 指示燈。
    如果資料位元組中相應的位被設定,指示燈將被點亮。此資料位元組中未提及的位必須被清除。
  3. ^ 鍵盤控制器在透過埠 64h 接收操作碼 F0h–FFh 後,將該操作碼的最低四位傳送到其輸出匯流排的線 3–0。與接收操作碼 D1h 的響應不同,在接收操作碼 F0h–FFh 後,輸出線的強制狀態不會永遠保持,而是作為單個脈衝保持大約 6 毫秒。具體來說,操作碼 FEh 會導致傳送到 CPU 重置引腳的脈衝,就像在計算機系統機箱前面板上按下重置按鈕後一樣。一些影響 CPU 重置後進一步事件的方法在 [註釋 4 到 A.12-1] 中描述。

A.11-4. CPU 的標誌暫存器

[編輯 | 編輯原始碼]

在現代處理器中,從 80386 型號開始,以前 16 位的標誌暫存器已擴充套件到 32 位;此外,還引入了控制暫存器 CR0、CR2 和 CR3。後來,從奔騰 CPU 開始,又添加了一個控制暫存器 CR4。除了 CR2,所有上述控制暫存器中都存在標誌:它儲存對禁止記憶體頁面請求訪問的最後一個命令的線性地址。標誌暫存器中標誌以及控制暫存器中一些標誌的功能如下表所示。

暫存器 描述 註釋
標誌 00h CF – 進位標誌 [註釋 1]
標誌 02h PF – 最低有效位元組中位的奇偶校驗 [註釋 1]
標誌 04h AF – 中間進位標誌 [註釋 1]
標誌 06h ZF – 零(或相等)標誌 [註釋 1]
標誌 07h SF – 符號標誌 [註釋 1]
標誌 08h TF – 跟蹤(單步)標誌
標誌 09h IF – 中斷允許標誌 [註釋 1]
標誌 0Ah DF – 索引計數方向標誌 [註釋 1]
標誌 0Bh OF – 溢位標誌 [註釋 1]
標誌 0Ch I/O 許可權級別 2 位欄位 [注 2]
標誌 0Eh 巢狀任務標誌 [注 3]
標誌 0Fh CPU 8086 的特徵 [注 3]
EFLAGS 10h 忽略除錯標誌 (A.11-5) [註釋 4]
EFLAGS 11h VM – V86 模式標誌 [註釋 4][註釋 5]
EFLAGS 12h AC – 對齊檢查允許標誌 [註釋 4][註釋 6]
EFLAGS 13h VIF – 虛擬中斷標誌 [註釋 4]
EFLAGS 14h VIP – 虛擬中斷掛起 [註釋 4]
EFLAGS 15h ID – CPU 標識標誌 [註釋 3][註釋 4]
CR0 00h PE – 保護允許標誌 [註釋 7]
CR0 01h 協處理器同步 (7.02-05) [註釋 7]
CR0 02h 透過 INT 07 模擬協處理器 [註釋 7]
CR0 03h TS – 任務切換標誌 [註釋 7]
CR0 04h 協處理器命令支援 [註釋 7]
CR0 05h 協處理器錯誤時啟用異常 [註釋 7]
CR0 10h WP – 防寫 [註釋 7][註釋 8]
CR0 12h AM – 對齊掩碼 [註釋 7][註釋 6]
CR0 1Dh NW – 非寫入直通快取 [註釋 7]
CR0 1Eh CD – 快取停用 [註釋 7]
CR0 1Fh PG – 分頁啟用 [註釋 7]
CR3 03h 快取寫入直通 [註釋 7][註釋 9]
CR3 04h 頁面快取停用 [註釋 7][註釋 9]
CR4 00h VME – V86 模式擴充套件啟用 [註釋 7]
CR4 01h PVI – 虛擬中斷啟用 [註釋 7]
CR4 02h TSD – 時間戳停用 [註釋 7]
CR4 03h 除錯:允許埠呼叫時 INT 01 [註釋 7]
註釋
  1. ^ 此標誌的功能和狀態在第 6.05-15 節中描述。
  2. ^ 標誌暫存器中的位 0Ch 和 0Dh 表示執行 I/O 操作所需的許可權級別。預設情況下,在 DOS 下,位 0Ch 和 0Dh 都被設定:因此,所有程序都允許直接 I/O 操作。但是,只有具有最高(零)許可權級別的程序才能使用 POPF 命令(7.03-68)更改 0Ch 和 0Dh 位的狀態。後者功能使能夠確定當前程序是否確實在最高許可權級別執行。
  3. ^ 標誌暫存器使能夠對 CPU 型別進行粗略識別。無法清除 0Fh 標誌是過時的 8086 CPU 的特徵。無法設定 0Eh 標誌是 16 位處理器的特徵。如果 CPU 能夠設定 0Eh 標誌,則它是一個 32 位 CPU,並配備了擴充套件的 EFLAGS 暫存器。在這種情況下,EFLAGS 暫存器中的位 15 將顯示此 CPU 是否能夠正確響應 CPU 識別命令 (CPUID,機器碼 0Fh A2h)
  4. ^ a b c EFLAGS 是 16 位標誌暫存器的 32 位擴充套件。在真實模式下,可以使用 PUSHF 和 POPF 命令訪問 EFLAGS 的位 31–16,前提是這些命令之前有字首 66h,如第 7.02-06 節所述。
  5. ^ 使用 POPF 命令設定 V86 模式的機會被硬體阻止。但是,如果 CPU 處於保護模式,並且同時段描述符中的第 06 位允許 32 位定址 (A.12-2),則可以使用 IRET 命令從堆疊設定 V86 模式。
  6. ^ 此處對齊意味著記憶體中每個運算元的地址必須是該運算元大小(以位元組為單位)的倍數。對齊檢查只能在 CPU 處於保護模式時在最低(第三)許可權級別執行(註釋 1 到 8.01-42)。即使 EFLAGS 暫存器中的 AC 標誌未啟用這些異常,CR0 中的對齊掩碼位也會啟用對齊異常。
  7. ^ 控制暫存器可以使用 MOV 命令訪問(註釋 1 到 7.03-58)。此外,可以使用 INT 67\AX=DE07h 函式 (8.03-72) 讀取 CR0 暫存器的內容。
  8. ^ 位 10h 用於保護應用程式程式段免受寫入作業系統或可能具有更高許可權級別的其他程序的訪問。
  9. ^ CR3 暫存器的最高 20 位儲存頁面目錄的基地址。此基地址必須是頁面大小(通常為 4 kb)的倍數。對 CR3 暫存器的每次寫入操作都會導致更新 TLB 緩衝區的內容;這應該在每次更改頁面地址轉換表時完成。

A.11-5 CPU 的除錯暫存器

[編輯 | 編輯原始碼]

除錯暫存器使能夠在每次訪問特定目標時呼叫 INT 01 處理程式(8.01-02):埠或規定的記憶體區域,包括地址空間的不可寫區域,在這些區域中無法儲存斷點。從 80386 型號開始,所有 x86 平臺的現代處理器都配備了除錯暫存器 DR0–DR7。可以使用 INT 67\AX=DE08h-DE09h 函式 (8.03-73) 以及 MOV 命令(註釋 1 到 7.03-58)訪問除錯暫存器。

暫存器 DR0–DR3 儲存四個 32 位規定的目標點的絕對線性地址。DR7 暫存器定義訪問事件註冊的條件。DR6 暫存器儲存發生的訪問事件的一些情況(可程式設計和外部中斷不影響 DR6 的內容)。DR6 和 DR7 暫存器中選定位欄位的功能如下表所示。

暫存器 描述 註釋
DR6 00h 事件在 DR0 地址發生 [註釋 1]
DR6 01h 事件在 DR1 地址發生 [註釋 1]
DR6 02h 事件在 DR2 地址發生 [註釋 1]
DR6 03h 事件在 DR3 地址發生 [註釋 1]
DR6 0Dh 檢測到斷點除錯訪問 [註釋 1]
DR6 0Eh BS – 檢測到單步狀態 [註釋 1]
DR6 0Fh TS – 檢測到任務切換狀態 [註釋 1]
DR7 00h DR0 的 2 位許可權欄位 [注 2]
DR7 02h DR1 的 2 位許可權欄位 [注 2]
DR7 04h DR2 的 2 位許可權欄位 [注 2]
DR7 06h DR3 的 2 位許可權欄位 [注 2]
DR7 0Dh GD – 通用檢測啟用 [注 3]
DR7 10h DR0 的 4 位控制欄位 [註釋 4]
DR7 14h DR1 的 4 位控制欄位 [註釋 4]
DR7 18h DR2 的 4 位控制欄位 [註釋 4]
DR7 1Ch DR3 的 4 位控制欄位 [註釋 4]
註釋
  1. ^ 即使 DR7 暫存器中的位 0Dh 或 EFLAGS 暫存器中的位 10h (A.11-4) 不允許生成異常,訪問事件也會在 DR6 暫存器的位 01h–03h 中固定。DR6 暫存器中的位 0Eh 固定訪問事件發生時的 TF 標誌狀態;位 0Fh 固定任務切換狀態。DR6 暫存器中位 0Dh 的設定狀態提醒,即使訪問事件已發生(位 0Dh 被異常清除),但異常尚未生成。
  2. ^ 許可權欄位定義註冊訪問事件的本地許可權或全域性許可權。許可權欄位中的第一個位僅在當前任務內區域性起作用,並在每次任務更改時關閉。許可權欄位中的第二個位賦予全域性屬性,並使能夠在當前任務之外註冊訪問事件。
  3. ^ DR7 暫存器中的位 0Dh 不影響訪問事件註冊,而是允許生成由訪問事件引起的異常。DR7 中位 0Dh 的狀態無法更改,除非程序具有最高許可權級別或在真實模式下執行。
  4. ^ 每個控制欄位中的第一對位定義應攔截的訪問事件的型別
    00 – 嘗試執行機器碼
    01 – 嘗試寫入記憶體
    10 – 到埠的 I/O 地址(對於奔騰+ CPU)
    11 – 讀寫嘗試。
    每個控制欄位中的第二對位定義監視地址空間的大小:位元組、字或雙字。嘗試訪問監視地址空間中的任何位元組都被視為訪問事件。

A.12 記憶體分配和管理

[編輯 | 編輯原始碼]

A.12-1 通用記憶體對映

[編輯 | 編輯原始碼]

此表顯示了 1 Mb 以下記憶體空間的通用分配,這對於 AT 相容計算機來說是典型的,受 DOS 作業系統控制。但是,記憶體分配取決於 BIOS 版本、BIOS 設定設定和特定計算機的配置。因此,您計算機中記憶體分配的一些特徵可能與下面顯示的不同。

地址 大小 描述
0000:0000 400h 真實模式中斷表
0000:0074 4 指向影片暫存器預設設定的指標
0000:0078 4 指向預設軟盤資料表的指標 (A.08-2)
0000:007C 4 指向 8x8 圖形字型字元 80–FFh 的指標
0000:0104 4 指向第一個硬碟引數表(A.13-1)的指標
0000:010C 4 指向當前圖形字型的指標 (8.01-30)
0000:0118 4 指向第二個硬碟引數表(A.13-1)的指標
0040:0000 100h BIOS 資料區 (A.01-1)
0050:0000 1 INT 05 的印表機狀態 (8.01-06)
0050:0004 1 軟盤驅動器選擇 (A: 或 B:)
0050:0040 BCh 指向原始中斷處理程式的選定指標 [註釋 6]
0000:7C00 200h 載入和執行引導記錄的預設區域
9000:FFFF "傳統"記憶體的上邊界 [註釋 1]
A000:0000 10000h 影片記憶體訪問“視窗” [註釋 2]
B000:0000 10000h 影片記憶體訪問“視窗” [註釋 2]
B800:0000 8000h 文字影片模式 EGA+ 的影片緩衝區
C000:0000 8000h 影片介面卡的 BIOS 區域 [註釋 3]
C000:0070 7 "EXTMODE" 簽名:支援 SVGA 影片模式
C800:0000 4000h 硬碟的 BIOS 區域
D000:0000 10000h UMB 的預設區域,由 EMM386.EXE 安排
E000:0000 10000h 擴充套件記憶體頁的預設區域
F000:0000 FFFFh PC 的 ROM BIOS 的重新定位副本 [註釋 3]
F000:FFF0 重新啟動程式的入口點 [註釋 4]
F000:FFF5 8 BIOS 日期
F000:FFFD 1 BIOS 程式碼校驗和
F000:FFFE 1 計算機的型號程式碼
FFFF:0010 FFEFh 高記憶體區域 [註釋 5]
註釋
  1. ^ 傳統記憶體的 640 kb 邊界是由主機板晶片組中的動態記憶體控制器晶片硬體定義的。在這個邊界之上,接下來的 384 kb 地址空間被保留用於影片記憶體和 BIOS ROM 晶片。由於 CPU 中的地址轉換機制,這個區域中的空閒空間通常在保護模式下變得可訪問。
  2. ^ a b 地址空間區域 A000:0000–B000:FFFF 提供對影片記憶體的訪問。這個區域的具體使用方式取決於影片模式 (A.10-1)。現代影片介面卡的 SVGA BIOS 在這個區域中安排了一個或兩個“滑動”視窗,提供對大型影片記憶體中選定部分的“滑動”訪問(詳細資訊見第 8.01-39 節)。
  3. ^ a b 可以透過相同的地址空間區域直接訪問 ROM 晶片中的 BIOS 和影片 BIOS 程式碼,或者訪問這些程式碼在速度更快的 RAM 中的副本。選擇特定替代方案取決於由 BIOS 設定程式設定的相應記憶體區域的“陰影”引數設定。
  4. ^ a b c d e 重新啟動程式的入口點地址 F000:FFF0h 是由 CPU 硬體定義的:在開機時,其地址匯流排的初始狀態恰好是 FFFF0h。進一步的引導過程取決於 BIOS 的 CMOS RAM 中位元組 0Fh 中寫入的值[註釋 1 到 A.14-1]
    00h – 帶有 POST 測試的普通引導
    04h – 重新啟動並呼叫 INT 19 (8.01-90)
    05h – 重置並跳轉到 0040:0067 單元格中的地址 (A.01-1)
    0Ah – 跳轉到 0040:0067 單元格中準備的地址 (A.01-1)
    與開機後的引導不同,重新啟動後的 POST 測試取決於地址 0040:0072h 的字[註釋 1 到 A.01-1]。在重新啟動後,只有 05h 和 0Ah 兩種選擇,它們的區別在於中斷控制器是否會被重置。
  5. ^ 當段地址與偏移量相加產生進位位時,會訪問高記憶體區域,該進位位被導向地址匯流排的 A20 線。高記憶體區域在真實模式下可訪問,但需要安裝 HIMEM.SYS 驅動程式 (5.04-01),該驅動程式提供對 A20 線門的控制。
  6. ^ 0050:0040–0050:00FB 區域儲存選定中斷處理程式地址的副本(INT 00 – INT 1F,INT 40 – INT 43,INT 46,INT 70 – INT 77),由 BIOS 為隨後載入作業系統而準備。在主中斷表中,這些地址可能會被其他處理程式的地址覆蓋,這些處理程式是後來安裝的,可能是由 MS-DOS 7 本身、TSR 程式或驅動程式安裝的。

A.12-2 段描述符

[編輯 | 編輯原始碼]

在保護模式下,段邊界和訪問許可權由段描述符定義。許多最重要的段描述符構成全域性描述符表 (GDT)。CPU 轉換到保護模式意味著存在一個 GDT,至少在 CPU 處於真實模式時,要預先準備一部分。準備好的 GDT 中描述符的順序和選擇取決於該過程的要求,該過程應該控制 CPU 轉換到保護模式。

不同過程的 GDT 表示例顯示在文章 8.01-76、8.01-78 和 9.10-01 中。在所有 GDT 表中,第一個描述符必須用零填充:它是未請求的段和記憶體頁的模板。所有描述符都具有相同的內部結構,如下表所示。最低

偏移量 大小 描述
00h 2 段大小的最低 2 個位元組,最小的位元組在前
02h 3 基本地址的最低 3 個位元組,最小的位元組在前
05h 1 訪問許可權位元組 [註釋 2]
    位 0 = 0 – 段尚未被訪問
      = 1 – 段已被訪問
    位 1 = 0 – 僅資料讀取或程式碼執行
      = 1 – 允許資料寫入和程式碼讀取
    位 2: – 擴充套件方向 [註釋 3]
    位 3 = 0 – 段包含資料
      = 1 – 段包含可執行程式碼
    位 4 = 0 – 系統描述符的標記
      = 1 – 應用程式描述符的標記
    位 5–6: – 許可權級別
      = 00 – 最高
      = 11 – 最低
    位 7 = 0 – 段必須從磁碟讀取
      = 1 – 段存在於 RAM 中
06h 1 位 0–3: – 段大小的最高 4 位
    位 4: – 空閒位 [註釋 4]
    位 5 = 0 (保留)
    位 6: – 地址和運算元的大小 [註釋 5]
      = 0 – 16 位定址和運算元
      = 1 – 32 位定址和運算元
    位 7: – 粒度位
      = 0 – 段大小以位元組為單位
      = 1 – 段大小以 4 kb 為單位
07h 1 基本地址的最高位元組
註釋
  1. ^ 段描述符的位元組 06h 和 07h 被 80386 及更高版本的 CPU 模型考慮。如果程式預計將由 80286 CPU 執行,那麼位元組 06h 和 07h 必須被清除。位元組 06h 和 07h 為零是保護模式 16 位程式的顯著特徵,使它們能夠被 32 位 CPU 模型正確執行。
  2. ^ 訪問許可權位元組中位 0–3 的解釋取決於位 4。顯示的位 0–3 解釋與應用程式有關,包括它們的資料段和可執行程式碼段。在系統描述符中,位 0–3 定義了 16 種不同描述符子型別的型別。
  3. ^ 訪問許可權位元組中位 2 的解釋取決於位 3。在程式碼段中,位 2 的清除狀態意味著程式碼可以被具有相同許可權級別的程式執行(否則程式碼也可以被具有更高許可權級別的程式執行)。對於資料段,位 2 的清除狀態意味著正常的向上擴充套件方向,而位 2 的設定狀態意味著相反的向下擴充套件方向,如堆疊段中所使用的那樣。
  4. ^ 位元組 06h 中的位 4 可供程式設計師調節。在記憶體頁面描述符中,此位用作重新定義禁止標記,例如,用於將 I/O 地址空間對映到記憶體。
  5. ^ a b c d 程式碼段描述符中位元組 06h 的大小位 6 定義地址和運算元的大小。在系統段中,位元組 06h 的位 4–6 必須被清除。

A.12-3 XMS 驅動程式的選定子函式

[編輯 | 編輯原始碼]

XMS 子函式由擴充套件記憶體驅動程式 HIMEM.SYS (5.04-01) 執行。在使用這些子函式之前,需要執行兩個預操作。首先,使用 INT 2F\AX=4300h 函式 (8.03-22) 檢查 HIMEM.SYS 驅動程式是否已安裝。第二個操作是使用 INT 2F\AX=4310h 函式 (8.03-23) 找出 XMS 驅動程式的入口點的地址。返回的雙字地址應為 CALL FAR 命令 (7.03-08) 指定。在呼叫時,要執行的子函式由 AX 暫存器中的值定義,如以下表格的第一列所示。DX 暫存器的作用顯示在第二列中,返回的 AX 內容顯示在第四列中。如果 AX 返回狀態,AX=0001h 表示成功,AX=0000h 表示失敗。在失敗的情況下,幾乎所有子函式(除了 AH=00h)都會在 BL 暫存器中返回錯誤程式碼 (A.06-1)。查詢子函式 AH=08h 和 AH=88h 在任何情況下都會在 BL 暫存器中返回錯誤程式碼。

AH DX 子函式 返回的 AX 註釋
00h   報告 XMS 版本 XMS 版本 [註釋 1]
05h   開啟 A20 線門 狀態
06h   關閉 A20 線門 狀態
08h   報告空閒 XMS 記憶體 最大塊 [注 2]
09h 大小 分配 XMS 記憶體塊 狀態 [注 3]
0Ah 控制代碼 釋放 XMS 記憶體塊 狀態
0Bh   在 XMS 記憶體中複製 狀態 A.12-4
0Ch 控制代碼 鎖定 XMS 記憶體塊 狀態 [註釋 4]
0Dh 控制代碼 解鎖 XMS 記憶體塊 狀態
0Eh 控制代碼 獲取 XMS 控制代碼資訊 狀態 [註釋 5]
0Fh 控制代碼 調整 XMS 記憶體塊大小 狀態 [注意 6]
10h 大小 分配 UMB 記憶體塊 狀態 [註釋 7][註釋 8]
11h 釋放 UMB 記憶體塊 狀態 [註釋 7]
12h 調整 UMB 記憶體塊大小 狀態 [註釋 7][註釋 8]
88h   報告空閒 XMS 記憶體 最大塊 [註釋 2][註釋 9]
89h 大小 分配 XMS 記憶體塊 狀態 [註釋 3][註釋 9]
8Eh 控制代碼 獲取 XMS 控制代碼資訊 狀態 [註釋 5][註釋 9]
8Fh 控制代碼 調整 XMS 記憶體塊大小 狀態 [註釋 6][註釋 9]
註釋
  1. ^ 此子函式返回 DX 暫存器中的 HMA 區域狀態:DX=0001h 表示 HMA 區域正在使用,DX=0000h 表示 HMA 區域未被使用。
  2. ^ 呼叫子函式 08h 時,BL=00h。返回時,DX 暫存器中報告空閒 XMS 記憶體的大小(以千位元組為單位),AX 暫存器中報告最大可用 XMS 記憶體塊的大小。88h 子函式執行相同操作,但在 32 位暫存器 EDX 和 EAX 中返回類似的結果。此外,子函式 88h 在 ECX 暫存器中返回與 XMS 記憶體的最遠可用位元組對應的最大物理地址。
  3. ^ 09h 和 89h 子函式都接受以千位元組為單位的 XMS 記憶體塊的請求大小,但 09h 子函式從 DX 暫存器接受請求大小,而 89h 子函式從 32 位 EDX 暫存器接受請求大小。09h 和 89h 子函式都在 DX 暫存器中返回分配的 XMS 記憶體塊的控制代碼。
  4. ^ 如果成功,暫存器 DX:BX 將返回已鎖定記憶體塊的 32 位物理地址。
  5. ^ 0Eh 子函式在 BH 暫存器中返回請求的 XMS 塊的鎖定計數,在 BL 暫存器中返回可用控制代碼的數量,在 DX 暫存器中返回由指定控制代碼開啟的 XMS 塊的大小(以千位元組為單位)。8Eh 子函式執行相同操作,但在 CX 暫存器中返回可用控制代碼的數量,在 EDX 暫存器中返回 XMS 塊的大小。
  6. ^ a b 調整大小子函式 0Fh 從 BX 暫存器接受請求的記憶體塊的新大小(以千位元組為單位)。8Fh 子函式執行相同操作,但從 EBX 暫存器接受新大小。請求的記憶體塊不能鎖定。
  7. ^ 對於 CPU 型號 80386 及更高版本,10h-12h 子函式通常透過 CPU 的 TLB 緩衝區中的地址轉換來實現。因此,這些子函式的執行被委託給 EMM386.EXE 驅動程式 (5.04-02),該驅動程式安排地址轉換並攔截對 HIMEM.SYS 驅動程式的直接呼叫地址。但是,子函式 10h-12h 不一定需要將 CPU 切換到保護模式,並且可以透過 UMBPCI.SYS 驅動程式 (5.04-04) 在真實模式下實現。
  8. ^ 10h 和 12h 子函式都以 16 位元組單位(段落)操作 UMB 塊大小規範。調整大小子函式 12h 從 BX 暫存器接受請求的新大小。分配子函式 10h 在成功終止的情況下,在 BX 暫存器中返回 UMB 塊的段地址,在 DX 暫存器中返回 UMB 塊的實際大小。如果失敗,用 AX=0000h 值標記,則 10h 和 12h 子函式都在 DX 暫存器中返回最大可用 UMB 塊的大小。
  9. ^ 與 0xh 子函式不同,8xh 子函式不能由過時的 16 位處理器實現,並且需要 HIMEM.SYS 驅動程式的版本不低於 3.07。

A.12-4 XMS 複製請求的格式

[編輯 | 編輯原始碼]

XMS 驅動程式 HIMEM.SYS (5.04-01) 的子函式 AH = 0Bh (A.12-3) 從 DS:SI 暫存器接受指向此請求資料塊的指標。子函式 AH = 0Bh 將一組位元組從透過源控制代碼定址的一個 XMS 塊複製到透過目標控制代碼定址的另一個 XMS 塊。

偏移量 大小 描述
00h 4 要複製的位元組數(必須為偶數)
04h 2 源控制代碼
06h 4 源塊中的偏移量
0Ah 2 目標控制代碼
0Ch 4 目標塊中的偏移量

註釋 1:如果源和目標重疊,則僅保證向前複製(源基址小於目標基址)正常工作。

註釋 2:如果請求中的任一控制代碼為 0000h,則相應的偏移量雙字被解釋為直接可定址常規記憶體中的普通地址(段:偏移量)。

A.12-5 EMS 複製描述符的格式

[編輯 | 編輯原始碼]

EMS 複製描述符指定複製和交換函式 INT 67\AX=5700h-5701h (8.03-69) 的源和目標,由 EMM386.EXE 驅動程式 (5.04-02) 執行。源和目標都可以屬於 EMS 記憶體頁或常規記憶體。在後一種情況下,應寫入 0000h 值而不是相應的控制代碼號,並且應使用段地址而不是 EMS 邏輯頁號來指定位置。

偏移量 大小 描述
00h 4 要複製/交換的資料塊的長度(以位元組為單位)
04h 1 = 00h:源塊在常規記憶體中
    = 01h:源塊在 EMS 記憶體頁中
05h 2 源控制代碼(如果源在常規記憶體中,則為 0000h)
07h 2 源在頁或常規記憶體段中的偏移量
09h 2 常規記憶體中的源邏輯頁或段
0Bh 1 = 00h:目標塊在常規記憶體中
    = 01h:目標塊在 EMS 記憶體頁中
0Ch 2 目標控制代碼(如果目標在常規記憶體中,則為 0000h)
0Eh 2 目標在頁或常規記憶體段中的偏移量
10h 2 常規記憶體中的目標邏輯頁或段

註釋 1:對於移動操作,源和目標可以重疊,但只有在一個方向的複製才能提供正確的結果。

A.12-6 EMS 記憶體內部跳轉的資料塊

[編輯 | 編輯原始碼]

所示資料塊指定了由 EMM386.EXE 驅動程式 (5.04-02) 的 INT 67\AH=56h 函式 (8.03-68) 執行的 EMS 記憶體中子例程呼叫的引數。由 INT 67\AH=55h 函式 (8.03-68) 執行的 EMS 記憶體內部的遠跳轉操作使用所示資料塊的一部分,直至偏移量 09h。

偏移量 大小 描述
00h 4 目標地址(段:偏移量)
04h 1 新頁對映列表的長度
05h 4 指向新頁對映列表的指標
09h 1 當前頁對映列表的長度
0Ah 4 指向當前頁對映列表的指標
0Eh 8 (保留用於 EMM386.EXE 驅動程式的資料)

註釋 1:頁對映列表的內部結構在文章 8.03-66 的註釋 3 中進行了描述。關於要替換的當前頁對映列表的資料對於在子例程執行終止時返回到當前程式執行是必需的。

A.12-7 記憶體控制描述符

[編輯 | 編輯原始碼]

計算機的記憶體分配是作業系統特權。DOS 分配的每個記憶體塊都以 16 個位元組長的記憶體控制描述符為字首。這些描述符也被稱為 MCB(記憶體控制塊)。MCB 很容易找到:MCB 描述符的段地址始終比與該 MCB 描述符相關聯的分配記憶體塊的段地址少一個單位。

DOS 透過 MCB 描述符鏈跟蹤所有可用記憶體。[註釋 3] 分配記憶體區域之外的空閒記憶體空間被 DOS 視為一個單獨的記憶體塊:它也必須以 MCB 描述符為字首。與空閒記憶體空間相關聯的 MCB 描述符的一個顯著特徵是程式碼 0000h,而不是所有者程式的段地址。DOS 從可跟蹤的 MCB 描述符鏈中獲取有關可用空閒記憶體和特定空閒記憶體區域排列的所有資料。

MCB 描述符中的資料結構如下表所示。

偏移量 大小 描述 註釋
00h 1 = 4Dh (= M) – 不是最後一個 MCB [註釋 1]
    = 5Ah (= Z) – 鏈中的最後一個 MCB
01h 2 所有者程式的段地址 [注 2]
03h 2 關聯記憶體塊的大小 [注 3]
05h 3 未使用
08h 8 程式檔名 [註釋 4]
註釋
  1. ^ 具有主要 DOS 系統資料的記憶體塊被劃分為子塊,每個子塊都有自己的 MCB 描述符,但在偏移量 00h 處的位元組中具有其他識別符號
    42h (= B) – 具有緩衝區的子塊 (4.03)
    44h (= D) – 用於 DOS 驅動程式的子塊
    45h (= E) – 用於 DOS 驅動程式的資料子塊
    46h (= F) – 具有 SFT 表的子塊 (4.12)
    49h (= I) – 用於 IFS 資料的子塊
    4Ch (= L) – 具有 CDS 表的子塊 (4.17)
    53h (= S) – 用於 DOS 堆疊的子塊 (4.27)
    54h (= T) – 用於過渡程式碼的子塊
    58h (= X) – 用於 FCBS 的子塊 (4.10)
  2. ^ 如果關聯的記憶體空間是空閒的,則在 MCB 描述符中,偏移量 01h 處的字被填充為零。如果關聯的記憶體塊由 DOS 分配給自己,則在偏移量 01h 處的字中寫入程式碼 0008h,而不是所有者程式的段地址。
  3. a b 關聯記憶體塊的大小以 16 位元組單位(段落)指定。每個後續 MCB 描述符的段地址比當前 MCB 描述符中偏移量 03h 處指定的值與當前 MCB 描述符的段地址之和多一個單位。根據此公式,DOS 跟蹤 MCB 描述符鏈。跟蹤從第一個 MCB 描述符開始;第一個 MCB 描述符的段地址儲存在 DOS 列表列表之前的字中。該字在表 A.01-2 中標記為偏移量 −02h。
  4. ^ 程式檔案的名稱在那些與 PSP 記憶體塊、驅動程式子塊和 IFS 子塊關聯的 MCB 描述符中指定。在幾個其他 MCB 描述符中的偏移量 08h 處有以下含義的簽名
    SC – 關聯的塊包含 DOS 的可執行程式碼;
    SD – 關聯的塊包含 DOS 的資料;
    SM – 關聯的塊是 UMB 區域中的最後一個;
    UMB – 關聯的塊是 UMB 區域中的第一個。
    與其他記憶體塊關聯的 MCB 描述符中的位元組 08h-0Fh 未使用,可能包含“垃圾”。
  5. ^ 帶有 *.COM 字尾的程式檔案沒有標頭檔案,這些標頭檔案指定其他型別可執行檔案所需的記憶體空間。這就是為什麼對於帶有 *.COM 字尾的程式,DOS 會分配整個可用記憶體空間,緊隨之前分配的記憶體區域。當 DOS 沒有更多可用記憶體空間時,計算機可能會在每次後續的記憶體空間請求中掛起,這可能是由意外啟用的駐留程式或由外部中斷觸發的處理程式引起的。為了避免掛起風險,帶有 *.COM 字尾的程式必須呼叫 INT 21\AH=4Ah 函式(8.02-52),為未使用的記憶體部分形成一個獨立的 MCB 描述符,並將其宣佈為可用。此類呼叫的示例顯示在文章 9.06、9.10-01 和 9.10-02 中彙編文字的前 6 行。

A.13 硬碟資料結構

[編輯 | 編輯原始碼]

A.13-1 BIOS 物理 HDD 引數表

[編輯 | 編輯原始碼]

在 1996 年之前生產的過時計算機中的 BIOS 系統使用 CHS(柱面-磁頭-扇區)引數來定址 HDD。可用於 CHS 定址的 HDD 儲存空間限制為 528 Mb。BIOS 系統將第一個和第二個物理 HDD 的 CHS 引數儲存在資料表中;這些表的地址分別寫入記憶體單元 0000:0104h 和 0000:0118h。這兩個單元都位於中斷表(A.12-1)中,有時被稱為 INT 41 和 INT 46。如果計算機配備了兩個以上的 HDD,則獲取其餘 HDD 的 CHS 引數的唯一方法是呼叫 INT 13\AH=08h 函式(8.01-49)。

1995 年,HDD 的容量已達到 1 Gb。CHS 定址固有的 528 Mb 限制必須克服。對於較新的 BIOS 系統,已開發出 LBA 定址[註釋 4 到 A.13-6] 和擴充套件的 INT 13 函式(8.01-55 - 8.01-60)。但必須保留與以前程式的相容性。因此,在較新的 BIOS 系統中,INT 13\AH=08h 函式(8.01-49)已被“教導”產生不是實際的,而是轉換後的 CHS 引數。當程式呼叫“舊”INT 13 函式(8.01-46 - 8.01-54)並指定轉換後的 CHS 引數時,BIOS 系統會自動執行反向轉換,以便可用於 CHS 定址的 HDD 儲存空間擴充套件到 8.4 Gb(註釋 2 到 A.13-6 中有一些細節)。

儲存在單元 0000:0104h 和 0000:0118h 中的指標所指向的資料塊可能具有不同的資料結構:這取決於是否存在實際的或轉換後的 CHS 引數。兩種資料結構都顯示在下表中。第一列(Std)中顯示了實際的資料偏移量。第二列(Trs)中的偏移量對應於轉換後的 CHS 資料,符合 Phoenix-1995 規範,適用於柱面數超過 1024 的 HDD。雖然現代 BIOS 系統支援所描述的資料塊,但對於現在開發的程式來說,不建議使用這些資料塊中的引數。

Std Trs 大小 描述
00h 00h 2 HDD 的柱面數 [註釋 1]
02h 02h 1 HDD 的磁頭數 [註釋 1]
  03h 1 簽名 A0h - 符合 Phoenix-1995 規範的塊的獨特特徵。
  04h 1 每磁軌扇區數 [註釋 2]
05h 05h 2 應開始寫入預補償的柱面號 [註釋 3]
08h 08h 1 標誌 位 2 - 不重新校準;
        位 3 - 超過 8 個磁頭;
        位 5 - 存在缺陷圖[註釋 4]
        位 6 - 停用 ECC 讀取重試;
        位 7 - 停用訪問重試。
  09h 2 磁軌數(最多 65536)[註釋 2]
  0Bh 1 磁頭數(最多 16)[註釋 2]
0Ch 0Ch 2 著陸區的柱面號[註釋 3]
0Eh 0Eh 1 每磁軌扇區數 [註釋 1]
  0Fh 1 資料校驗和
註釋
  1. ^ 這些位置中的 CHS 引數適用於 INT 13 處理程式的“舊”函式(8.01-46 - 8.01-54)。但是,某些 BIOS 版本在這些位置指定了超過 1024 的柱面數,這對“舊”函式來說是不可接受的。
  2. ^ 這些位置填充了實際 HDD 引數,供不呼叫 INT 13 處理程式,而是直接呼叫 HDD 控制器埠的程式使用。這些位置不會填充在那些為 INT 13 處理程式的“舊”函式提供實際引數的資料塊中。
  3. ^ 現代磁碟驅動器獨立執行著陸和寫入預補償。嘗試影響這些操作會被忽略。
  4. ^ 編寫表面缺陷圖的磁軌號通常比 BIOS 表格中物理 HDD 引數偏移量 00h 中指定的柱面號大一個單位。

A.13-2 擴充套件的 HDD 引數表

[編輯 | 編輯原始碼]

INT 13\AH=48h 函式(8.01-60)將擴充套件的 HDD 引數表寫入準備好的緩衝區。

偏移量 大小 描述
00h 2 呼叫時:準備好的緩衝區的長度(8.01-60)
    返回時:返回資料的實際長度
02h 2 標誌 位 0 : 透明處理 DMA 邊界錯誤
      位 1 : CHS 資料(A.13-1)有效
      位 2 : 這是可移動驅動器,位 4-6 有效
      位 3 : 支援帶驗證的寫入
      位 4 : 驅動器提供更改線支援
      位 5 : 驅動器提供鎖定和解鎖
      位 6 : 介質不存在,報告預設 CHS 資料
04h 4 驅動器上的物理柱面數 [註釋 1]
08h 4 驅動器上的物理磁頭數 [註釋 1]
0Ch 4 每磁軌物理扇區數(從 1 開始計數)
10h 8 扇區總數(最後一個扇區的編號加 1)
18h 2 每扇區位元組數
1Ah 4 指向輔助 DPTE 表的指標 [註釋 2]
1Eh 2 = BEDDh: 確認路徑資料存在的簽名
20h 1 = 2Ch: 路徑資料的大小,包括簽名
24h 4 匯流排型別(ISA 或 PCI)後跟一個空格(20h)
28h 8 介面型別 [註釋 3]
30h 8 介面路徑欄位 [註釋 4]
38h 16 裝置路徑欄位 [註釋 5]
49h 1 偏移量 1Eh-48h 內位元組的補碼校驗和
註釋
  1. ^ 有效的磁軌、柱面和磁頭編號從零開始計數,因此最後一個有效編號比此欄位中指定的數值小一個單位。此欄位中的值是實際值。因此,此值不應在呼叫“舊”INT 13 函式時指定:這些函式需要 INT 13\AH=08h 函式(8.01-49)返回的轉換引數。
  2. ^ 低於 2.x 版本的 BIOS INT 13 擴充套件不返回 DPTE 表,而是將 DPTE 指標欄位填充為 FFFFh:FFFFh 值。DPTE 表的結構如附錄 A.13-3 中所示。DPTE 表顯示在臨時緩衝區中;在後續呼叫 BIOS 函式後,其內容不會被保留。
  3. ^ 介面型別欄位可以填充以下字:1394、ATA、ATAPI、SCSI、USB。這些字後跟空格,直到名義欄位長度為 8 位元組。
  4. ^ 對於 ISA 匯流排,路徑欄位包含一個 2 位元組的基本 I/O 埠地址,偏移量 32h-37h 處的位元組為零。對於 PCI 匯流排,偏移量 30h 處的位元組表示匯流排號;偏移量 31h 處的位元組表示插槽號;偏移量 32h 處的位元組表示功能號;偏移量 33h 處的位元組表示控制器號;偏移量 34h-37h 處的位元組為零。
  5. ^ 對於 1394(Firewire)介面,從偏移量 38h 開始指定一個 8 位元組的擴充套件唯一識別符號(EUI-64)。對於 ATA(IDE)介面,偏移量 38h 處的 00h 值表示主裝置,偏移量 38h 處的 01h 值表示從裝置。偏移量 38h 處的位元組對 ATAPI 介面具有相同的含義,但偏移量 39h 處的位元組表示邏輯單元號(LUN)。對於 SCSI 介面,從偏移量 38h 開始指定一個 2 位元組的裝置識別符號(SCSI ID),從偏移量 3Ah 開始指定一個 8 位元組的邏輯單元號(LUN)。對於 USB 介面,從偏移量 38h 開始寫入一個 8 位元組的序列號。未提及的偏移量 3Ah-48h 處的位元組保留,必須清除。

A.13-3 輔助裝置引數表 DPTE

[編輯 | 編輯原始碼]

BIOS INT 13 版本 2.0 及更高版本使用輔助裝置引數表 DPTE 來補充擴充套件的 HDD 引數表(A.13-2)。INT 13\AH=48h 函式(8.01-60)在擴充套件的 HDD 引數表(A.13-2)中的偏移量 1Ah 處返回指向 DPTE 表的指標。DPTE 地址指向一個臨時緩衝區,在後續呼叫 BIOS 函式後,該緩衝區不會保留其內容。DPTE 表中的資料專供那些打算直接呼叫 HDD 控制器埠的程式使用。DPTE 資料結構如以下表格所示。

偏移量 大小 描述
00h 2 裝置的物理 I/O 埠基地址
02h 2 磁碟驅動器控制暫存器埠地址
04h 1 標誌 位 0-3 被清零,位 5 和 7 被置位。
      位 4:如果為主裝置則被清零,如果為從裝置則被置位。
      位 6:如果啟用了 LBA定址則被置位。
06h 1 位 0-3:IRQ 編號,位 4-7 被清零。
07h 1 多塊傳輸的塊(扇區)計數。
08h 1 位 0-3:DMA 通道號,位 4-7:根據 ATA-2 規範的 DMA 型別。
09h 1 位 0-3:PIO 型別,如果在偏移量 0Ah 的字中位 0 被置位。
0Ah 2 標誌 位 0:快速 PIO 啟用,位元組 09h 有效。
      位 1:快速 DMA 訪問啟用。
      位 2:多扇區傳輸啟用。
      位 3:CHS 引數轉換啟用。
      位 4:LBA 轉換啟用。
      位 5:驅動器使用可移動介質。
      位 6:ATAPI 介面裝置(可能是 CD-ROM)。
      位 7:32 位傳輸模式啟用。
      位 8:ATAPI 訊號準備好進行資料包傳輸。
      位 9-10:CHS 引數轉換型別。
= 00 – 位移轉換。
= 01 – LBA 輔助轉換。
= 10, 11 – 專有轉換。
      位 11:Ultra DMA 訪問啟用。
0Eh 1 INT 13 擴充套件版本號。
0Fh 1 位元組 00h-0Eh 的校驗和。

A.13-4 磁碟地址資料包

[編輯 | 編輯原始碼]

這種形式的資料包由擴充套件讀取函式 INT 13\AH=42h(8.01-56)和擴充套件寫入函式 INT 13\AH=43h(8.01-57)使用。在應用這些函式之前,應透過呼叫 INT 13\AH=41h(8.01-55)檢查 BIOS 是否支援這些函式。

偏移量 大小 描述
00h 1 地址資料包的大小 [註釋 1]
02h 1 要傳輸的資料塊數量(最多 7Fh)[註釋 21]
04h 4 指向資料傳輸緩衝區的指標[註釋 3]
08h 8 第一個資料塊的 LBA 絕對編號[註釋 4]
10h 8 指向資料傳輸緩衝區的 64 位指標 [註釋 3]
18h 8 要傳輸的資料塊數量 [註釋 21]
註釋
  1. ^ 如果支援擴充套件磁碟地址資料包,則大小為 20h,否則大小為 10h。由 INT 13\AH=41h 函式(8.01-55)返回的 CX 暫存器中的位 3 狀態表示是否支援擴充套件磁碟地址資料包。
  2. ^ 如果支援擴充套件磁碟地址資料包,並且如果將 FFh 值寫入偏移量 02h 的位元組中,則要傳輸的塊數將從偏移量 18h 的四字中讀取。返回時,偏移量 18h 處的此數字將替換為實際傳輸的塊數。
  3. ^ 如果支援擴充套件磁碟地址資料包,並且如果將 FFFF:FFFFh 值寫入偏移量 04h 的雙字中,則指向資料緩衝區的指標將從偏移量 10h 的四字中讀取。
  4. ^ 對於不支援 LBA 定址的磁碟驅動器,[註釋 4 至 A.13-6]起始塊的絕對編號將根據以下公式計算
    (C×N + H)×T + S − 1
    其中:C – 所選柱面的編號,N – 磁頭數量(比最大磁頭號大 1),H – 所選磁頭的編號,T – 每磁軌上的扇區數量,S – 磁軌上所選扇區的編號。

A.13-5 HDD 的分割槽描述符

[編輯 | 編輯原始碼]

在可引導物理 HDD 的磁頭 00 柱面 00 的扇區 01h 中是主引導記錄 (MBR),包含最多 446 位元組的可執行程式碼、4 位元組識別符號(在偏移量 1B8h-1BBh 處)和分割槽表。識別符號僅由 Windows-NT/2000/XP 作業系統寫入,並且可能不存在。要檢視 MBR 扇區,應將其複製到一個檔案中,如文章 9.02-02 中所述。非文字檔案可以透過 Volkov Commander 檔案管理器(6.25)的檢視器或偵錯程式 DEBUG.EXE(6.05)開啟。圖 12 顯示了從實際物理磁碟複製的 MBR 扇區的片段。

圖 12

第一個片段展示了可執行程式碼的起始部分(專有的 OnTrack 的 MBR 版本)。第二個片段展示了該可執行程式碼的結束部分,並帶有準備好的錯誤訊息。第三個片段展示了分割槽表,定義了在特定計算機中將 HDD 的可寫表面劃分為分割槽的方式。

分割槽表由 4 個分割槽描述符組成,每個描述符 16 位元組長。如果從 MBR 扇區的開頭開始計算偏移量,則分割槽描述符的偏移量分別為 1BEh、1CEh、1DEh、1EEh。但是,圖 12 中顯示的 MBR 扇區副本是從偏移量 100h 開始載入的;因此,在圖 12 中,分割槽描述符的偏移量為 2BEh、2CEh、2DEh、2EEh。MBR 扇區中的最後一個字是簽名 AA55h,標記著可引導磁碟的 MBR 的結束。

四個分割槽描述符允許在任何物理 HDD 驅動器中建立最多四個主分割槽。如果分割槽少於 4 個,其餘描述符將用零填充。在圖 12 中,分割槽表中的第一個描述符用零填充。因此,這個特定 HDD 被劃分為三個有效的為主分割槽。

在一個可引導的 HDD 上,一個為主分割槽必須被標記為活動分割槽(可能可引導),在第一個描述符的位元組中使用 80h 標記。在圖 12 中,80h 標記出現在偏移量 02CEh 處,這是第二個分割槽描述符的第一個位元組。因此,這個特定 HDD 中的活動分割槽是第二個分割槽。

下表顯示了上述以及其他位元組在分割槽描述符中的作用。表中第一列中的偏移量是從每個分割槽描述符的開頭開始計算的。

偏移量 大小 描述
00h 1 狀態指示器(80h – 活動分割槽)
01h 1 分割槽的起始 HDD 磁頭
02h 1 分割槽的第一個扇區 [註釋 1]
03h 1 分割槽的第一個磁軌 [註釋 1]
04h 1 分割槽的檔案系統識別符號 (A.13-6)
05h 1 分割槽的最終 HDD 磁頭
06h 1 分割槽的最後一個扇區 [註釋 2]
07h 1 分割槽的最後一個磁軌 [註釋 2]
08h 4 在分割槽之前存在的扇區數量
0Ch 4 分割槽的長度(以扇區為單位)
註釋
  1. ^ 在偏移量 02h 的位元組中,位 5-0 表示分割槽在磁軌上的第一個扇區號,但位 6 和 7 表示分割槽 10 位第一個磁軌號的最高有效位。分割槽 10 位第一個磁軌號的 8 個最低有效位儲存在偏移量 03h 的位元組中。
  2. ^ 在偏移量 06h 的位元組中,位 5-0 表示分割槽在磁軌上的最後一個扇區號,但位 6 和 7 表示分割槽 10 位最後一個磁軌號的最高有效位。分割槽 10 位最後一個磁軌號的 8 個最低有效位儲存在偏移量 07h 的位元組中。
  3. 具有 LBA 定址的分割槽描述符[註釋 4 至 A.13-6]可能包含無效的 CHS 引數(磁軌數、磁頭數和扇區數)。但是,偏移量 08h-0Fh 的位元組中的資料必須有效。

A.13-6 選定的檔案系統識別符號

[編輯 | 編輯原始碼]

在每個分割槽描述符(A.13-5)中,偏移量 04h 的位元組是檔案系統識別符號。作業系統會讀取檔案系統識別符號並“決定”它是否可以確保對該分割槽的訪問。如果作業系統“不知道”檔案系統識別符號,則不會嘗試訪問該分割槽。很可能這樣的分割槽甚至不會顯示給使用者。一些檔案系統識別符號表示隱藏分割槽,這些分割槽可以出於系統目的訪問,但對使用者隱藏。下表顯示了對選定檔案系統識別符號的解釋。

ID 描述
00h 磁碟的空閒空間
01h 用於大小不超過 16 Mb 的卷的 FAT-12 檔案系統
04h 過時的 FAT-16(最多 32 Mb),沒有簇結構
05h 具有 CHS 定址的擴充套件分割槽 [註釋 1][註釋 2]
06h 具有 CHS 定址的 FAT-16(最多 2 Gb) [註釋 2]
07h NTFS 檔案系統 [註釋 3]
0Bh 具有 CHS 定址的 FAT-32 [註釋 2]
0Ch 具有 LBA 定址的 FAT-32 [註釋 4]
0Eh 具有 LBA 定址的 FAT-16(最多 2 Gb) [註釋 4]
0Fh 具有 LBA 定址的擴充套件分割槽 [註釋 1][註釋 4]
11h 隱藏的 FAT-12 分割槽(用於 OS/2 引導管理器)
14h 隱藏的 FAT-16 分割槽(用於 OS/2 引導管理器)
1Bh 具有 CHS 定址的隱藏的 FAT-32 [註釋 2]
1Ch 具有 LBA 定址的隱藏的 FAT-32 [註釋 4]
3Ch PowerQuest 的 Partition Magic 恢復分割槽
42h Windows Vista 作業系統的動態分割槽
43h PTS DOS 引導管理器的(BootWizard 的)分割槽
4Dh-4Fh QNX 作業系統分割槽
54h OnTrack Disk Manager 的 DDO(動態驅動器覆蓋)
64h-65h Novell Netware 作業系統分割槽
82h Linux 作業系統的交換分割槽
83h Linux 作業系統的 Ext2fs 檔案系統
84h 用於電源狀態恢復的分割槽
85h Linux 作業系統的擴充套件分割槽 [註釋 1]
A0h 用於行動式 PC 狀態恢復的分割槽
A5h FreeBSD 作業系統分割槽
A6h OpenBSD 作業系統分割槽
A8h MacOS 的 UFS 檔案系統
A9h Net BSD 作業系統分割槽
ABh MacOS 的可引導分割槽
BEh Solaris 作業系統的可引導分割槽
D8h, DBh CP/M 作業系統分割槽
EBh BeOS 的 BFS1 檔案系統
EEh 64 位 Windows 作業系統版本的 GPT 分割槽 [註釋 5]
FDh Linux 作業系統的 RAID 分割槽
註釋
  1. ^ 擴充套件分割槽是磁碟空間的形式規範,用於放置多個非主分割槽(邏輯磁碟)。非主分割槽的描述符不是寫入 MBR 中,而是寫入單獨的專用扇區中,透過一串引用跟蹤。MS-DOS 不允許此串環路閉合,否則 MS-DOS 會在查詢此環路的結束時陷入無限迴圈。
  2. a b CHS(Cylinder-Head-Sector,柱面-磁頭-扇區)引數在分割槽描述符(A.13-5)中佔用 3 個位元組,因此 CHS 引數最多可以定址 2^24 個扇區,每個扇區 512 位元組,相當於 2^23 千位元組,或者 8 GB。因此,使用 CHS 定址的分割槽不能超過磁碟空間開頭的 8 GB(之後應該使用 LBA 定址)。在表 A.13-6 中,僅標記有 CHS 的識別符號用作 CHS 定址的區分特徵。
  3. ^ Microsoft 將 07h 檔案系統識別符號解釋為可安裝檔案系統 (IFS),即對使用者進行轉換呈現的檔案系統。但實際上,除了 NTFS 外,只有很少使用的 IBM 的 HPFS 檔案系統使用 07h 識別符號。
  4. ^ a b c d e f 線性塊定址 (LBA) 基於從磁碟空間開頭算起的扇區計數,根據分割槽描述符(A.13-5)中位元組 08h-0Fh 中的資料。LBA 可以克服 CHS 定址固有的 8 GB 限制。LBA 需要磁碟驅動器和 BIOS 系統都支援 INT 13 處理程式的擴充套件功能(8.01-55)。所有現代計算機都提供此類支援。
  5. ^ 關於 GPT (= GUID 分割槽表) 分割槽的資料構成擴充套件 MBR,它佔據的不是單個扇區,而是磁碟第一個磁軌的大部分。只有 64 位版本的 Windows Server 2003、Windows XP 和 Windows Vista 作業系統才支援 GPT 分割槽。
  6. 據瞭解,分割槽識別符號 21、23、26、31、33、34、36、71、73、74、76、86、A1、A3、A4、A6、B1、B3、B4、B6、E5、E6、F3、F6 是保留的,尚未使用。

A.13-7 磁碟空閒空間表

[edit | edit source]

此表格包含有關邏輯磁碟空閒空間的資料,由 INT 21\AX=7303h 函式(8.02-80)返回,該函式可應用於使用 FAT-12、FAT-16 和 FAT-32 檔案系統格式化的邏輯磁碟。

偏移量 大小 描述
00h 2 此表格的大小(以位元組為單位)
02h 2 在呼叫時必須為 0000h
08h 4 每個扇區的位元組數
0Ch 4 空閒簇的數量
10h 4 邏輯磁碟中簇的總數
14h 4 邏輯磁碟中空閒物理扇區的數量
18h 4 邏輯磁碟中物理扇區的總數
1Ch 4 可用分配單元的數量
20h 4 邏輯磁碟中分配單元的總數

A.14 I/O 埠

[edit | edit source]

A.14-1 選擇的埠地址

[edit | edit source]

埠代表計算機的硬體,因此應透過 BIOS 函式(適用於特定計算機的主機板)或擴充套件板的裝置驅動程式進行定址。儘管有一些例外,但不建議應用程式直接訪問埠。但是,瞭解埠地址至少有利於避免與擴充套件板的地址衝突。

下表顯示了 AT 相容計算機中通用埠地址分配的相對穩定特性。當然,您特定計算機的埠地址分配可能與下表所示的略有不同。

地址範圍 目標裝置
0000h–001Fh 第一個直接記憶體訪問控制器 (DMA1)
0020h–0021h 第一個中斷控制器 (IRQ 1 – IRQ 7, 8.01-09)
0022h–0023h 動態 RAM 控制器
0060h–0064h 鍵盤控制器 (A.11-3)
0070h CMOS RAM 請求接收埠 [註釋 1]
0071h CMOS RAM 資料 I/O 埠 [註釋 1]
0080h 製造診斷埠
00A0h–00A1h 第二個中斷控制器 (IRQ 8 – IRQ 15, 8.03-75)
00B2h–00B3h 高階電源管理埠
00C0h–00DFh 第二個直接記憶體訪問控制器 (DMA2)
00F0h–00FFh 算術協處理器
0168h–016Fh IFS 裝置或擴充套件板
0170h–0177h 第二個 IDE 硬碟控制器(預設 IRQ 15)
01E8h–01Efh PS/2 滑鼠或其他裝置(IRQ 12)
01F0h–01F7h 第一個 IDE 硬碟控制器(預設 IRQ 14)
01F8h A20 線路門控控制
0200h–020Fh 遊戲埠(操縱桿)
0279h 即插即用配置暫存器埠
02E8h–02EFh 序列埠 COM4
02F8h–02FFh 序列埠 COM2(預設 IRQ 3)
0300h–031Fh 與 NE2000 相容的乙太網介面卡
0330h–0331h 樂器的 MIDI 介面
0378h–037Ah 並行埠 LPT1(預設 IRQ 7)
03C0h–03CFh 與 EGA 相容的影片介面卡的埠 [註釋 2]
03C4h EGA 序列選擇器埠 [註釋 3]
03C5h EGA 序列資料埠 [註釋 3]
03CEh 圖形暫存器選擇器埠 [註釋 4]
03CFh 圖形暫存器資料埠 [註釋 4]
03DAh CGA/EGA/VGA 影片介面卡狀態埠 [註釋 5]
03E0h–03E7h PCMCIA i82365 控制器的埠
03E8h–03EFh 序列埠 COM3
03F0h–03F7h 軟盤控制器(預設 IRQ 6)
03F8h–03FFh 序列埠 COM1(預設 IRQ 4)
0A79h 即插即用系統資料埠
0CF8h–0CFFh PCI 匯流排配置埠
註釋
  1. ^ a b c d CMOS RAM 中的一些資料可以透過 BIOS 設定程式(1.01)訪問。此外,一些硬體資料和記憶體資料由 INT 11(8.01-42)和 INT 12(8.01-43)處理程式讀取。可能需要直接訪問 CMOS RAM 來遮蔽 NMI(8.01-03 的註釋 1),以獲取有關軟盤驅動器的資訊(A.08-03 中的偏移量 10h),以及定義 CPU 在重置後的操作,這取決於 CMOS RAM 中偏移量 0Fh 處的位元組。 [註釋 4 至 A.12-1] 為了訪問 CMOS RAM 中的資料,應透過 OUT 命令(7.03-66)將請求的位元組偏移量(最多 7Fh)傳送到埠 70h;然後可以透過埠 71h,透過 IN 命令(7.03-26)讀取請求的位元組值,或透過 OUT 命令進行修改。
  2. ^ 由於使用 INT 10\AH=0Ch 函式(8.01-19)繪製圖形速度很慢,因此作業系統直接訪問影片記憶體和與 EGA 相容的影片介面卡的埠。因此,即使 EGA 介面卡本身早已不再使用,EGA 埠地址仍被保留為標準。
  3. ^ 埠 03C5h 將透過 OUT 命令(7.03-66)傳送的位元組傳輸到影片介面卡中的內部暫存器,該暫存器事先透過埠 03C4h 定義。如果事先將位元組 AL = 02h 傳送到埠 03C4h,則傳送到埠 03C5h 的下一個位元組將被接受為顏色掩碼(其正常值為 0Fh)。
  4. ^ 埠 03CFh 將透過 OUT 命令(7.03-66)傳送的位元組傳輸到影片介面卡中的內部暫存器,該暫存器事先透過埠 03CEh 定義。如果事先將位元組 AL = 08h 傳送到埠 03CEh,則傳送到埠 03CFh 的下一個位元組將被接受為 8 個連續畫素的位掩碼。如果事先將位元組 AL = 05h 傳送到埠 03CEh,則傳送到埠 03CFh 的下一個位元組將指定寫入影片記憶體的模式(00h-02h)(8.01-39 的註釋 3)。
  5. ^ 埠 03DAh 僅用於資料讀取。從埠 03DAh 讀取的位元組中的位 3 在場回溯間隔內保持設定為 1,在這些間隔之外保持設定為 0。因此,可以使用 IN 命令(7.03-26)註冊場回溯間隔,以避免影像中斷,如果在回溯間隔之外更改顯示的影像,則影像中斷會很明顯。

A.14-2 序列埠的狀態

[edit | edit source]

此表介紹了 INT 14\AH=00h – INT 14\AH=03h 函式(8.01-65 – 8.01-68)在 AH 暫存器中返回的狀態位元組中的位欄位的解釋。

描述
0 接收資料已準備好
1 溢位錯誤
2 奇偶校驗錯誤
3 幀錯誤
4 檢測到中斷
5 傳送保持暫存器為空
6 傳送移位暫存器為空
7 超時,無響應

A.14-3 連線到並行埠的印表機狀態

[edit | edit source]

此表介紹了 INT 17\AH=00h – INT 17\AH=02h 函式(8.01-86 – 8.01-88)在 AH 暫存器中返回的狀態位元組中的位欄位的解釋。

描述
0 超時,無響應
1 僅 EPP BIOS:請求的埠不受支援
2 未使用
3 I/O 錯誤
4 埠繁忙
5 印表機缺紙
6 確認
7 印表機已準備好(不繁忙)

註釋 1:使用狀態位元組 AH = 03h 返回的 CF 標誌的設定狀態表示存在 EPP BIOS,但它不支援請求的埠。

註釋 2:狀態位元組 AH = 00h 表示 EPP 資料在暫存器中返回(A.14-4)。

A.14-4 EPP BIOS 的選擇功能

[edit | edit source]

EPP 是 BIOS 的補充,根據 IEEE 1284 規範,透過 LPT 埠實現增強的​​資料傳輸模式。如果您的計算機中存在 EPP BIOS,則可以透過 INT 17\AX=0200h 函式(8.01-88)進行證明,該函式還會報告 LPT 埠基地址、EPP BIOS 版本和其入口點的地址。後者用作 CALL FAR 命令(7.03-08)的目標地址;以這種方式呼叫時,EPP BIOS 會執行操作,該操作由此時 AH 暫存器中的值指定。對於最新的 EPP BIOS 第 7 版,特定 LPT 埠的選擇由 DX 暫存器中的基地址定義;早期的 EPP BIOS 版本透過 DL 暫存器中 00h–03h 的埠號來定義 LPT 埠。除此之外,一些 EPP BIOS 函式需要其他資料,這些資料顯示在下表第二列或註釋中,註釋號顯示在第五列。除非另有說明,否則幾乎所有 EPP BIOS 函式都會在 AH 暫存器中返回狀態位元組(A.14-7),用設定的 CF 標誌狀態標記失敗,並且不會保留 BX 暫存器的內容。

AH 呼叫時 EPP BIOS 函式 返回時 註釋
00h   報告配置 AL = IRQ A.14-5
01h A.14-6 設定傳輸模式 AX 改變
02h   報告傳輸模式 AH 改變 A.14-6
03h AL=00h 啟用 LPT 中斷
03h AL=01h 停用 LPT 中斷
04h   重置 EPP AL 改變
05h AL=地址 地址寫入 I/O 週期 AL 改變
06h   地址讀取 I/O 週期 AL=地址
07h AL=位元組 傳送一個位元組
08h   傳送資料塊   [註釋 1]
09h   接收一個位元組 AL=位元組
0Ah   接收資料塊   [注 2]
0Bh AL=地址 地址位元組讀取 AL=位元組
0Ch AL=地址 地址位元組傳送   [注 3]
0Dh AL=地址 地址塊讀取   [注 2]
0Eh AL=地址 地址塊傳送   [註釋 1]
0Fh AL=埠 鎖定 LPT 埠   [註釋 4]
10h AL=埠 解鎖 LPT 埠   [註釋 4]
11h CH=00h 停用裝置中斷   [註釋 5]
11h CH=01h 啟用裝置中斷   [註釋 5]
12h AL=00h 即時裝置是否存在? 如果存在,則 AL=01h
12h AL=01h 新增即時裝置
12h AL=02h 刪除即時裝置
40h   查詢多路複用器   [註釋 6][註釋 7]
41h AL=埠 查詢多路複用器埠   [註釋 6][註釋 8]
50h AL=埠 查詢菊花鏈   [註釋 6][註釋 9]
51h AL=埠 重新分配鏈號   [注意 6]
註釋
  1. ^ 呼叫時,必須在 DS:SI 暫存器中指定指向資料塊的指標,在 CX 暫存器中指定資料塊的長度(以位元組為單位)。EPP BIOS 的早期版本(第 7 版之前)從 ES:DI 暫存器接收指向資料塊的指標。函式在 CX 暫存器中返回未傳送的位元組數。
  2. ^ 呼叫時,必須在 ES:DI 暫存器中指定指向資料緩衝區的指標,在 CX 暫存器中指定此緩衝區的長度。成功終止後,函式將返回填充的緩衝區,並在 CX 暫存器中返回未填充的緩衝區中的位元組數。
  3. ^ 呼叫時,要傳送的資料位元組必須在 CL 暫存器中指定。EPP BIOS 的早期版本(第 7 版之前)從 DH 暫存器接受資料位元組。
  4. ^ 如果外部裝置透過多路複用器連線,則應在 AL 暫存器中位元組的位 3–0 中指定多路複用器埠號 (01h–08h)。如果外部裝置以菊花鏈方式連線,則應在 AL 暫存器中位元組的位 7–4 中指定菊花鏈埠號 (10h–80h)。
  5. ^ 多路複用器埠號 (01h–08h) 應在 AL 暫存器中指定。如果未使用多路複用器,則 AL 暫存器必須清零。對於中斷啟用功能 (CH = 01h),應在 ES:DI 暫存器中指定指向中斷事件處理程式的指標。
  6. ^ 此功能在 EPP BIOS 第 7 版之前的早期版本中未實現。如果外部裝置未透過多路複用器或菊花鏈連線到特定 LPT 埠,則不應應用此功能。所請求的 LPT 埠將不按埠號識別,而是按其 I/O 基地址識別,該地址應在 DX 暫存器中指定。
  7. ^ 此函式在 AL 暫存器中返回當前活動的多路複用器埠號,並在 CH 暫存器中返回標誌位元組。標誌位元組中位 0 的設定狀態表示多路複用器埠已鎖定,標誌位元組中位 1 的設定狀態表示此多路複用器埠存在掛起的中斷。
  8. ^ 此函式在 CH 暫存器中返回標誌位元組。此標誌位元組中位的設定狀態具有以下含義:
    位 0 – 此埠已選擇(處於活動狀態)
    位 1 – 埠已鎖定
    位 2 – 此埠的中斷已啟用
    位 3 – 此埠存在掛起的中斷。
  9. ^ 此函式在 BH 暫存器中返回 EPP BIOS 版本,在 BL 暫存器中返回當前活動菊花鏈裝置的數量,在 CH 暫存器中返回標誌位元組(如 註釋 7 中所述),在 CL 暫存器中返回構成菊花鏈的裝置數量(或 00h,如果不存在菊花鏈),在 ES:DI 暫存器中返回指向驅動程式供應商標識字串的指標。

A.14-5 EPP BIOS 配置位元組

[edit | edit source]

透過 AH 暫存器中 00h 值(A.14-4)呼叫時定義的“報告配置”函式在 AL 暫存器中返回 LPT 埠的 IRQ 線號,在 BH 暫存器中返回 EPP BIOS 版本,在 ES:DI 暫存器中返回指向驅動程式資訊的指標,在 CX 暫存器中返回 LPT 埠的 I/O 基地址(僅適用於 EPP BIOS 1.0 – 3.0 版本),在 BL 暫存器中返回 EPP BIOS 配置位元組。配置位元組位域的解釋如下表所示。

描述
0 存在多路複用器
1 支援雙向資料傳輸
2 存在菊花鏈
3 支援 ECP 規範
4 支援 EPP 軟體模擬
5 支援 EPP BIOS 函式
6 支援“快速 Centronics”資料傳輸
7 標準 EPP I/O 對映

A.14-6 EPP BIOS 資料傳輸模式程式碼

[edit | edit source]

透過 AH 暫存器中 02h 值(A.14-4)呼叫時定義的“報告傳輸模式”函式在 AL 暫存器中返回當前傳輸模式的程式碼。透過 AH 暫存器中 01h 值(A.14-4)呼叫時定義的“設定傳輸模式”函式能夠根據 AL 暫存器中指定的模式程式碼更改 LPT 資料傳輸模式。此模式程式碼中位域的解釋如下表所示。

描述
0 啟用相容模式
1 啟用雙向資料傳輸
2 根據 EPP 規範進行資料傳輸
3 根據 ECP 規範進行資料傳輸 [註釋 1]
4 啟用 EPP 軟體模擬 [註釋 1]
5 啟用“快速 Centronics”資料傳輸 [註釋 1]
6 = 0b (保留)
7 啟用 EPP 埠中斷 [註釋 2]
註釋
  1. ^ 由模式程式碼中位 3–5 的設定狀態定義的模式無法由 EPP BIOS 的早期版本(第 7 版之前)實現。
  2. ^ 只要透過 AH = 11h 函式(A.11-4)啟用裝置中斷,位 7 的設定狀態就不被“設定傳輸模式”函式(AH = 01h)接受,但仍可能被“報告傳輸模式”EPP BIOS 函式(AH = 02h)報告。

A.14-7 EPP BIOS 函式的狀態程式碼

[edit | edit source]

除 01h 和 02h(A.14-4)之外,幾乎所有 EPP BIOS 函式都在 AH 暫存器中返回狀態位元組。EPP BIOS 狀態位元組程式碼的解釋如下表所示。

程式碼 描述
00h 成功終止
02h 不支援所請求的命令或功能
03h 不支援所請求的並行埠
05h 當前模式不支援該請求
06h 請求的子功能無效
07h 該請求已完成或已設定
20h 不存在 LPT 多路複用器(僅限 AMI BIOS 版本)
40h 不存在 LPT 多路複用器(其他 EPP BIOS 版本)
41h 多路複用器當前已鎖定
80h I/O 超時,無響應
FFh 所請求的功能無效或不受支援

A.15 CD/DVD 服務表

[edit | edit source]

A.15-1 可引導 CD/DVD 規範資料包

[edit | edit source]

BIOS 函式 INT 13\AH=4A00h 和 INT 13\AX=4C00h(8.01-61)模擬了一個邏輯磁碟,其基礎是該磁碟的副本,該副本從光碟 CD/DVD 讀取。模擬控制引數必須以可引導 CD/DVD 規範資料包的形式準備。此資料包的內部資料結構如下表所示。

偏移量 大小 描述
00h 1 此資料包的大小(以位元組為單位)(=13h 通常)
01h 1 磁碟副本型別(與 A.15-3 中偏移量 21h 的相同)
02h 1 要模擬的驅動器號(8.01-44 的註釋 1)
03h 1 要模擬的驅動器控制器號
04h 4 磁碟副本開始的 CD 邏輯塊地址(與表 A.15-3 中偏移量 28h 的相同)
08h 2 0 : 模擬從屬 IDE 驅動器
    7–0 : LUN 和 SCSI ID 號(對於 SCSI)
    15–8 : 匯流排號(對於 SCSI)
0Ah 2 已準備好的 3 kb 讀取緩衝區的段地址(如果沒有快取,則為 0000h 值)
0Ch 2 載入磁碟副本引導扇區的段地址(與表 A.15-3 中偏移量 22h 的相同)
0Eh 2 磁碟副本中 512 位元組虛擬扇區的數量(與表 A.15-3 中偏移量 26h 的相同)
10h 1 磁碟副本柱面數量的最低有效 8 位(如 INT 13\AH=08h 在 CH 中返回的)
11h 1 5–0 : 軌道上最後一個扇區的數量
    7–6 : 副本柱面數量的最高有效位(如 INT 13\AH=08h 在 CL 中返回的)
12h 1 模擬磁碟驅動器中的磁頭數量

A.15-2 命令包格式

[edit | edit source]

此命令包指定 INT 13\AH=4Dh 函式 (8.01-63) 的引數,該函式從光學 CD/DVD 光碟讀取扇區。在啟動過程中,此命令包指定從 CD/DVD 光碟讀取引導目錄。

偏移量 大小 描述
00h 1 包大小(以位元組為單位,通常為 08h)
01h 1 要讀取的扇區數
02h 4 指向讀取資料的緩衝區的指標
06h 2 要讀取的第一個扇區的編號

A.15-3 光學 CD/DVD 光碟的引導目錄

[edit | edit source]

光碟可能實現多種計算機啟動方案。定義每種啟動方案的初始資料必須以隱藏目錄(也稱為引導目錄)的形式存在於可引導光碟上。可以使用 INT 13\AH=4Dh 函式 (8.01-63) 讀取此目錄。與普通目錄一樣,引導目錄中的記錄具有標準長度 20h 位元組。引導目錄的最小內容由兩個必需記錄組成:第一個記錄稱為驗證條目,第二個記錄是預設可引導磁碟副本的描述符。下表顯示了這兩個必需記錄的結構。偏移量 00h-1Fh 對應於驗證條目記錄;偏移量 20h-3Fh 對應於預設可引導磁碟副本的描述符。

偏移量 大小 描述
00h 1 = 01h:驗證條目開始的簽名
01h 1 平臺型別
= 00h – AT 相容
= 01h – Power PC
= 02h – Apple Macintosh
04h 24 CD/DVD 光碟機製造商(ASCII 字串)
1Ch 2 位元組 00h-1Fh 的補碼校驗和
1Eh 2 = AA55h:驗證條目終止簽名
20h 1 = 88h:可引導磁碟描述符的簽名 [註釋 2]
21h 1 位 3-0 
= 0000b – 無效描述符
= 0001b – 1.2 Mb 軟盤副本
= 0010b – 1.44 Mb 軟盤副本
= 0011b – 2.88 Mb 軟盤副本
= 0100b – 硬碟副本
    位 6:– 具有 ATAPI 介面的磁碟副本
    位 7:– 具有 SCSI 介面的磁碟副本
22h 2 載入引導扇區的段地址(如果 = 0000h,則預設情況下段地址為 07C0h)
24h 1 磁碟副本檔案系統識別符號 (A.13-6)
26h 2 磁碟副本中 512 位元組虛擬扇區的數量
28h 4 磁碟副本開始的 CD/DVD 邏輯塊地址
註釋
  1. 除了表 A.15-3 中所示的兩個必需記錄之外,CD 引導目錄還可能包含其他 32 位元組記錄,這些記錄分組在幾個部分中。每個部分代表一個單獨的啟動選項,並且至少包含兩個記錄:一個標題記錄和該啟動選項的可引導磁碟副本描述符。標題記錄以簽名位元組 90h 開頭,除了最後一部分中的標題記錄,它以簽名位元組 91h 開頭。在每個標題記錄中,偏移量 02h 處的字宣佈該部分中 32 位元組記錄的數量。在每個部分中,啟動選項的描述符之後可能是輔助記錄。每個啟動選項描述符中的資料結構與表 A.13-3 偏移量 20h-3Fh 中所示的預設可引導磁碟描述符相同。
  2. ^ 非可引導磁碟的描述符也是允許的,它們的獨特特徵是起始簽名 00h。

A.15-4 由 CD/DVD 驅動程式執行的命令

[edit | edit source]

要向驅動程式傳送命令,您必須獲取與該驅動程式關聯的控制代碼。第一步是透過 INT 2F\AX=1501h 函式 (8.03-14) 查詢指向 CD/DVD 驅動程式頭的指標,該函式由 TSR 程式 (5.08-03) MSCDEX.EXE 或 SHSUCDX.COM (5.08-04) 執行。第二步是在驅動程式頭的偏移量 0Ah 處讀取 8 位元組的驅動程式訪問通道名稱(簽名)。驅動程式訪問通道通常以載入驅動程式的命令列中 /D: 引數後面的識別符號命名(例如,CD/DVD 驅動程式的 /D:MSCD001 識別符號,如文章 5.10-01-5.10-03 中所示)。接下來的第三步是使用 INT 21\AH=3Dh 函式 (8.02-33) 使用此名稱獲取控制代碼。該名稱必須大寫,如果它較短,則必須附加 8 個帶空格的位元組 (20h)。在將所需的命令傳送到驅動程式之前,應將返回的控制代碼放在 BX 暫存器中,這可以透過 INT 21\AX=4403h 或 INT 21\AX=4402h 函式 (8.02-41) 完成。此外,這些函式還需要準備一個請求資料塊。必須在 DS:DX 暫存器中指定指向請求資料塊的指標,以及在 CX 暫存器中指定請求資料塊的長度。不同命令的請求資料塊長度在下面的表格的第二列中顯示。第三列顯示了 CD/DVD 驅動程式命令的程式碼,這些程式碼應在請求資料塊的偏移量 00h 處指定。如果命令需要返回一些資料,驅動程式會將這些資料寫入相同請求資料塊的單元格中。

AX CX 程式碼 操作 註釋
4402h 05h 00h 報告驅動程式頭的地址 [注 2]
4402h 06h 01h 報告驅動器的磁頭位置 [注 3]
4402h 09h 04h 報告音訊控制狀態 A.15-5
4402h 05h 06h 報告 CD/DVD 光碟機狀態 A.15-6
4402h 04h 07h 讀取模式,扇區大小 [註釋 4]
4402h 05h 08h 獲取扇區數量 [注 2]
4402h 02h 09h 報告光碟更改狀態 [註釋 5]
4402h 07h 0Ah 獲取音軌數量 [注意 6]
4402h 08h 0Bh 獲取音軌的開始位置 [註釋 7]
4403h 01h 00h 彈出托盤
4403h 02h 0100h 解鎖艙門
4403h 02h 0101h 鎖定艙門
4403h 01h 02h 重置驅動器 [註釋 1]
4403h 09h 03h 音訊控制 A.15-5
4403h 01h 05h 拉入音軌
  1. ^ 在透過 INT 21\AX=4402h 函式傳送到 CD/DVD 驅動程式的任何請求之後,並且在驅動程式被啟用以用於任何其他目的之前,必須透過 INT 21\AX=4403h 函式傳送命令 02h 來重置它。
  2. ^ 在執行操作 00h 和 08h 後,所請求的結果將寫入從偏移量 01h 開始的請求資料塊中。此結果是根據所請求的操作,要麼是 4 位元組的數字,要麼是 4 位元組的地址。
  3. ^ 在請求驅動器磁頭位置後,請求資料塊中偏移量 01h 處的返回位元組表示 CD/DVD 定址格式 
    00h – HSG 格式
    01h – 紅皮書格式(幀/秒/分鐘)。
    此外,請求資料塊中偏移量 02h 處的雙字是驅動器的磁頭位置,單位取決於定址格式。
  4. ^ 在請求讀取模式後,它將在請求資料塊中偏移量 01h 處返回 
    00h – 帶糾錯讀取(已處理)
    01h – 帶 ECC 程式碼讀取,但沒有糾錯(原始)。
    此外,返回的字在偏移量 02h 處表示扇區的大小。
  5. ^ 在請求光碟更改狀態後,驅動程式在請求資料塊中偏移量 01h 處返回狀態位元組 
    00h – 更改狀態未確定,
    01h – 光碟未更改,
    FFh – 光碟已更改。
  6. ^ 在請求音軌數量後,驅動程式在偏移量 01h 處的位元組中返回第一個音軌的編號,在偏移量 02h 處的位元組中返回最後一個音軌的編號,並且第一個音軌的起始地址(紅皮書格式)將作為雙字返回到偏移量 04h 處。
  7. ^ 在呼叫音軌的開始位置時,必須在請求資料塊中偏移量 01h 處的位元組中指定所請求的音軌編號。響應此呼叫,驅動程式將所請求音軌的起始點的雙字地址(紅皮書格式)寫入請求資料塊的偏移量 02h 處。此外,驅動程式在偏移量 06h 處的字中返回標誌,其中設定的位狀態意味著以下內容 
    位 12 – 音訊音軌,以預加重寫入,
    位 13 – 允許數字複製,
    位 14 – 此音軌包含資料(而非音訊),
    位 15 – 這是一個 4 通道音訊音軌。

A.15-5 CD/DVD 音訊控制

[edit | edit source]

如果在 CD/DVD 光碟機狀態字 (A.15-6) 中位 8 被設定,則此 CD/DVD 光碟機不需要音效卡來控制音訊播放:此 CD/DVD 光碟機本身能夠控制音訊播放。

為了透過 INT 21\AX=4403h 函式 (A.15-4) 將請求傳送到 CD/DVD 光碟機,必須在 DS:DX 暫存器中指定指向包含所請求引數的資料塊的指標。下表顯示了包含音訊控制引數的資料塊的結構,這些引數應為音訊控制操作 03h 準備,以便更改音訊播放。具有相同結構的資料塊將由 INT 21\AX=4402h 函式響應音訊控制狀態請求操作 (A.15-4) 寫入準備好的緩衝區中。在呼叫 INT 21\AX=4402h 函式時,必須在準備好的緩衝區中偏移量 00h 處的位元組中填充一個位元組:它必須指定音訊控制狀態操作的程式碼 04h。

偏移量 大小 描述
00h 1 函式:AX=4403h 的 03h 或 AX=4402h 的 04h
01h 1 輸出通道 0 的輸入通道 (0-3)
02h 1 輸出通道 0 的音量
03h 1 輸出通道 1 的輸入通道 (0-3)
04h 1 輸出通道 1 的音量
05h 1 輸出通道 2 的輸入通道 (0-3)
06h 1 輸出通道 2 的音量
07h 1 輸出通道 3 的輸入通道 (0-3)
08h 1 輸出通道 3 的音量

註釋 1:輸出通道 0 和 1 對應於左聲道和右聲道;輸出通道 2 和 3 對應於後左聲道和後右聲道。透過傳送其音量值為 00h 可以關閉每個通道。

註釋 2:預設情況下,每個輸入通道都連線到具有相同編號的輸出通道,並且音量設定為最大值 FFh。

A.15-6 光碟驅動器狀態字中的位域

[edit | edit source]

此表顯示了狀態字中位域的含義,該狀態字由 INT 21\AX=4402h 函式在響應 CD/DVD 光碟機狀態請求 06h (A.15-4) 時在資料塊中偏移量 01h 處返回。

描述
0 驅動器托盤已彈出
1 托盤蓋已解鎖
2 支援“原始”讀取模式 [註釋 1]
3 驅動器啟用寫入 CD/DVD 光碟
4 CD/DVD 驅動器能夠播放音訊/影片軌道
5 CD/DVD 驅動器支援交錯 [註釋 2]
7 CD/DVD 驅動器支援預取請求 [註釋 3]
8 CD/DVD 驅動器支援音訊聲道控制
9 支援紅皮書定址(除了 HSG)
10 CD/DVD 驅動器正在播放音訊
11 CD/DVD 驅動器中沒有光碟
12 CD/DVD 驅動器具有獨立的讀寫通道
  1. ^ “原始”讀取模式意味著 ECC 程式碼與資料一起讀取併發送到輸出,但沒有執行糾錯。正常的“已處理”讀取模式意味著 ECC 程式碼用於糾錯,但不會與糾正後的資料一起傳送到輸出。
  2. ^ 這裡的交錯與影片檔案相關,由交替的影像幀和音訊幀組構成。
  3. ^ 預取請求會導致讀取到驅動器的記憶體緩衝區中,這樣以後就可以獲取請求的資料,而無需等待訪問請求的軌道。

A.16 一些相關的縮寫

[編輯 | 編輯原始碼]
ACPI 高階配置與電源介面規範規定以資料表的形式將主機板引數呈現給作業系統,這些資料表位於專用記憶體區域中。
AGP 加速圖形埠:用於插入影片介面卡的插槽,以及影片介面卡與主機板互動的規範。
AH CPU 的 8 位暫存器,表示 16 位 AX 暫存器的位 15-8。
AL CPU 的 8 位暫存器,表示 16 位 AX 暫存器的位 7-0。
AMIS 備用多路複用中斷規範(A.07-6)
ANSI 美國國家標準學會(美國)
API 應用程式程式設計介面,即 OS 為程式提供的服務。
APM 高階電源管理:計算機 BIOS 系統的擴充套件,提供對電源的控制(8.01-70 – 8.01-72)
ASCII 美國資訊交換標準程式碼。
ASCIIZ 以至少一個 00h 位元組結尾的 ASCII 程式碼字串。
ASPI 高階 SCSI 程式設計介面:SCSI 介面的增強命令集(5.07-03)。如今,許多 ASPI 命令在 ATAPI(5.07-01)和 USB(5.07-05)控制器中實現。
AT 高階技術:IBM 於 1984 年生產的 PC 機型的名稱。大多數現代計算機繼承了 AT 機型的某些功能。
ATA AT 附加:磁碟儲存裝置的介面,首次在 IBM 的 PC AT 機型中實現。
ATAPI ATA 包介面:ATA 的包增強(5.07-01)。
ATX AT 擴充套件:自 1998 年以來實施的 PC 模組構造特性的增強規範。
AUX 保留字,用於定址序列埠 COM1。
AVI 影片檔案的副檔名,由交錯的音訊和影片幀組成。
AX 16 位通用暫存器,與 CPU 的算術單元相關聯。在 32 位 CPU 中,AX 表示 32 位暫存器 EAX 的一部分(位 15-0)。
b 二進位制:二進位制數的顯著標記。
BAT 批處理檔案的副檔名,由 COMMAND.COM(6.04)解釋。與普通命令檔案不同,批處理檔案由 COMMAND.COM 直譯器從命令列接受,無需輸入重定向。
BH CPU 的 8 位暫存器,表示 16 位 BX 暫存器的位 15-8。
BIOS 基本輸入輸出系統,與 PC 主機板一起提供的系統。
BL CPU 的 8 位暫存器,表示 16 位 BX 暫存器的位 7-0。
BP 基址指標:16 位暫存器,用作定址資料陣列的基址。在 32 位 CPU 中,BP 表示 32 位暫存器 EBP 的位 15-0。
BPB BIOS 引數塊(A.03-4)。
BSD 伯克利軟體發行版,以免費軟體作業系統而聞名。
BX 16 位通用暫存器,也用作定址資料的基址。在 32 位 CPU 中,BX 表示 32 位暫存器 EBX 的位 15-0。
CD 光碟:單面 650-800 MB 光碟。
CD-ROM 只讀光碟或用於此類光碟的驅動器。
CDS 當前目錄結構(A.03-3)。
CF – (1) : CPU 的進位標誌,用於指示進位和錯誤。
CF – (2) : Compact Flash - 一種可移動儲存卡型別。
CGA 彩色圖形介面卡:IBM 的第一個彩色影片介面卡型號。
CH CPU 的 8 位暫存器,表示 16 位暫存器 CX 的位 15-8。
CHS 柱面-磁頭-扇區:HDD 定址模式。[A.13-6 的註釋 2]
CL CPU 的 8 位暫存器,表示 16 位暫存器 CX 的位 7-0。
CMOS 互補金氧半導體:BIOS 在 CMOS 晶片上的記憶體塊,當 PC 關閉時不會丟失儲存的資料。
COM – (1) : 可執行檔案的副檔名,沒有標頭檔案。
COM – (2) : 訪問序列埠的保留字。
COM – (3) : 通用物件模型 - 一種程式設計技術。
CON 控制檯,即用於輸入的鍵盤和用於輸出的顯示器。
CP 內碼表(有關 CP 的更多資訊,請參閱文章 1.06 和 A.02-2)。
CP/M 微型計算機控制程式:DR-DOS 的原型。
CPU 中央處理器 - PC 中的主要處理器晶片。
CR 控制暫存器:32 位暫存器 CR0、CR2、CR3(A.11-4),在 80386 CPU 模型中引入。CR4 後來在奔騰 CPU 中引入。
CRC 迴圈冗餘校驗:僅用於錯誤檢測的程式碼(沒有糾正)
CRT 陰極射線管。
CS 程式碼段:16 位段暫存器,定義 CPU 執行的程式碼的段地址。
CSM 相容性支援模組使用普通 BIOS 系統的功能補充 UEFI BIOS,從而能夠使用 DOS 軟體,啟動 Windows-XP 和許多其他無法在 UEFI 下啟動的作業系統。
CWR 算術協處理器的控制字暫存器。
CX 16 位通用暫存器,通常用作計數器。在 32 位 CPU 中,CX 表示 32 位暫存器 ECX 的一部分(位 15-0)。
DAC 數模轉換器。
dd 月份中的兩位數十進位制日數。
DDO 動態驅動器疊加:OnTrack 的 BIOS 擴充套件,用於在過時的 PC 中訪問超過 512 MB 的 HDD。
DH CPU 的 8 位暫存器,表示 16 位暫存器 DX 的位 15-8。
DI 目標索引:16 位暫存器,通常用於儲存目標偏移量。在 32 位 CPU 中,DI 表示 32 位暫存器 EDI 的一部分(位 15-0)。
DL CPU 的 8 位暫存器,表示 16 位暫存器 DX 的位 7-0。
DMA 直接記憶體訪問。
DOS 基於磁碟的作業系統。
DPB 驅動器引數塊(A.03-1)。
DPMI DOS 保護模式介面:為程式設計的 API 函式,旨在以 CPU 的 V86 模式執行。DPMI 是由 Windows 作業系統的“DOS 框”實現的(有關詳細資訊,請參閱 8.03-21)。
DPR 算術協處理器的資料指標暫存器。
DPTE 驅動器引數表擴充套件(A.13-3)。
DR – (1) : Digital Research - CP/M 和 DR-DOS 的開發公司。
DR – (2) : 除錯暫存器 - CPU 的暫存器 DR0-DR7(A.11-5)。
DS 資料段:16 位段暫存器,定義當前程式資料塊的段地址。
DTA 資料傳輸區(8.02-16,A.09-1)
DVD 數字通用光碟 - 光碟,每面儲存 4.7 GB 資料。
DX 16 位通用暫存器。在 32 位 CPU 中,DX 表示 32 位暫存器 EDX 的一部分(位 15-0)。
EAX 32 位 CPU 中的 32 位通用暫存器。EAX 暫存器的最低有效位(位 15-0)構成 AX 暫存器。
EBIOS BIOS 擴充套件,在過時的 PC 中提供 LBA 方式的磁碟訪問。
EBP 32 位 CPU 中的 32 位基址暫存器。EBP 暫存器的最低有效位(位 15-0)構成 BP 暫存器。
EBX 32 位 CPU 中的 32 位通用暫存器。EBX 暫存器的最低有效位(位 15-0)構成 BX 暫存器。
ECC 糾錯碼。
ECP 擴充套件功能埠:LPT 埠的資料傳輸規範。
ECX 32 位 CPU 中的 32 位通用暫存器。ECX 暫存器的最低有效位(位 15-0)構成 CX 暫存器。
EDI 32 位 CPU 中的 32 位目標偏移暫存器。EDI 暫存器的最低有效位(位 15-0)構成 DI 暫存器。
EDX 32 位 CPU 中的 32 位通用暫存器。EDX 暫存器的最低有效位(位 15-0)構成 DX 暫存器。
EFI 可擴充套件韌體介面:英特爾的 32 位 BIOS 規範,最初針對 Itanium 64 位單核 CPU(2002 年)。針對更新的 32 位多核 CPU 的 EFI 修訂版被稱為 UEFI(2007 年)。
EGA 增強型圖形介面卡:過時的 IBM 彩色影片介面卡。現代影片介面卡繼承了 EGA 的許多重要功能。
EHCI 增強型主機控制器介面:用於 USB 匯流排版本 2.x 的控制器規範(有關詳細資訊,請參閱 5.07-05)。
EMM 擴充套件記憶體管理器:EMM386.EXE 驅動程式(5.04-02)。
EMS 擴充套件記憶體規範,由 EMM(5.04-02)實現。
EOF 檔案結束:ASCII 程式碼中的 EOF 標記是位元組 1Ah。
EPP 增強型並行埠:LPT 功能的 BIOS 擴充套件(A.14-4)
ES CPU 中的 16 位段暫存器,定義目標段地址。
ESI 32 位 CPU 中的 32 位源偏移暫存器。ESI 的最低有效位(位 15-0)構成 SI 暫存器。
ESP 32 位 CPU 中的 32 位堆疊指標暫存器。ESP 的最低有效位(位 15-0)構成 SP 暫存器。
EXE 可執行:具有標頭檔案的可執行檔案的副檔名。
FASM 平面彙編器:DOS、Windows、Linux 和 Unix 的現代免費軟體彙編器。可以從 http://www.flatassembler.net/ 下載。
FAT 檔案分配表。
FCB 檔案控制塊(A.09-5)。
FCBS 命令(4.10),為 FCB 預留記憶體。
FDD 軟盤驅動器。
FS 輔助的 16 位段暫存器,從 CPU 80386 開始引入。
GDT 全域性描述符表 - 一張包含 8 位元組段描述符的表,在保護模式下定義主要系統段。(A.12-2)。
GDTR CPU 的系統暫存器。儲存 GDT 的線性地址和大小。
GS 輔助的 16 位段暫存器,從 CPU 80386 開始引入。
GUI 圖形使用者介面 - 文字命令列的替代方案。
GUID 全域性唯一識別符號 - 32 位元組長的通用識別符號。
h 十六進位制 - 十六進位制數字的特殊標記。
HDD 硬碟驅動器。
HMA 高記憶體區 - 記憶體區域 1024–1088 kb。
HRS 隱藏、只讀、系統 - 系統檔案的一組屬性。
HSG 高 Sierra 組規範 - ISO 9660 標準的原型。
IBM 國際商用機器公司。
ID 識別符號。
IDE 整合驅動電子 - HDD 介面,等效於 ATA。
IDT 中斷描述符表 - 保護模式下中斷的表。它的段描述符有時也稱為 IDT。
IDTR CPU 的系統暫存器。儲存 IDT 的線性地址和大小。
IEEE 電氣和電子工程師協會。
IFS 可安裝檔案系統 - 檔案系統 (5.08-01),透過可安裝驅動程式訪問。
IML 初始機器載入系統。
INT 中斷 - 事件或命令 (7.03-28),呼叫中斷處理程式。
I/O 輸入/輸出,即資料傳輸操作。
IOCTL 輸入/輸出控制系統 (8.02-41)。
IP 指令指標 - 16 位暫存器,定義下一個命令的偏移量。在 32 位 CPU 中,IP 代表 32 位 EIP 暫存器的部分(位 15–0)。
IPR 算術協處理器中的指令指標暫存器。
IRQ 中斷請求線。
ISA 工業標準體系結構 - 用於擴充套件卡的(已過時)匯流排。
ISO 國際標準化組織。
ISP 中斷共享協議 (A.07-5)。
JFT 作業檔案表 - 開啟控制代碼的表。[Note 3 to A.07-1]
LAN 區域網。
LBA 線性塊定址 - HDD 的定址模式。[Note 4 to A.13-6]
LCD 液晶顯示器。
LFN 長檔名 (A.09-3)。
LIM Lotus-Intel-Microsoft - EMS 規範的創始人。
LPT 行式印表機 - 埠,也稱為並行埠。
LUN 邏輯單元號 - 用於共享一個匯流排地址的裝置的識別符號。[Note 1 to A.03-2]
MASM 宏彙編器 - 微軟的低階程式碼彙編器。
MBR 主引導記錄 (A.13-5)。
MCB 記憶體控制塊 - 16 位元組長的描述符 (A.12-7)。
MDA 單色顯示介面卡,用於 IBM 的過時 PC。
mm 一年中的兩位數的十進位制月份數字。
MO 磁光碟或磁碟驅動器。
MS 微軟擁有或開發的物件的標記。
MSWR 機器狀態字暫存器 - CPU 80286 中的控制暫存器。在現代 CPU 中,MSWR 是控制暫存器 CR0 的一部分。
NTFS Windows NT/2000/XP 下 HDD 的新技術檔案系統。
NUL – (1) : 通道“無處可去”,作為真實通道的替代方案。
NUL – (2) : 00h 位元組值。
OEM 原始裝置製造商 - 直接交付元件(作為零售銷售的反義詞)。
OHCI 開放主機控制器介面 - 用於 USB 匯流排版本 1.x (5.07-05) 的控制器規範。
OS 作業系統。
PC 個人電腦。
PCI 外設元件互連 - 用於擴充套件卡的匯流排型別。
PCMCIA PC 記憶體卡國際協會 - 介面標準,最初設計用於記憶體擴充套件卡 (5.07-02)。
PD 高效能磁碟 - 一種 650 Mb 的 CD-RAM 型可重寫光碟,DVD-RAM 光碟的原型。
PIO 對具有 ATAPI 介面的裝置進行程式設計 I/O 控制。
PM CPU 操作的保護模式。
POST 開機自檢 - PC 開機時由 BIOS 執行。
PRN 用於地址印表機埠 LPT1 的保留字。
PSP 程式段字首 (A.07-1)。
PS/2 個人系統/2 - IBM 在 1987 年開發的 PC 型號。
PS2 滑鼠埠和聯結器型別,首次在 PS/2 PC 中引入。
PTS PhysTechSoft - 俄羅斯軟體供應商,以其 PTS-DOS 聞名
RAID 廉價磁碟冗餘陣列 - 分散式儲存技術,提高傳輸速度。在永久合格維護下,某些 RAID 版本也可能降低資料丟失的風險。
RAM 隨機存取記憶體 - 普通的可寫記憶體,作為對磁帶和磁碟介質的順序訪問的替代方案。
ROM 只讀儲存器,即不可重寫儲存介質。
SCSI 小型計算機系統介面 (5.07-03)。
SFT 活動控制代碼關聯的系統檔案表 (A.01-4)
SFX 自解壓壓縮檔案或模組。
SI 源索引 - 16 位暫存器,用於儲存源地址偏移量。在 32 位 CPU 中,SI 代表 32 位 ESI 暫存器的部分(位 15–0)。
SIMD 單指令多資料 - 一類命令,對一組資料項執行相同的操作。
SP 堆疊指標 - 16 位暫存器,定義堆疊頂部的偏移量。在 32 位 CPU 中,SP 暫存器代表 32 位 ESP 暫存器的部分(位 15–0)。
SS 堆疊段 - 16 位暫存器,定義堆疊的段地址。
SSE 流式 SIMD 擴充套件 - 在現代 CPU 中實現的 SIMD 命令集的擴充套件。
STDIN 輸入通道,對應於控制代碼 0000h,預設情況下與鍵盤關聯作為資料來源。
STDOUT 輸出通道,對應於控制代碼 0001h,預設情況下與顯示器關聯作為目標裝置。
STDERR 顯示錯誤訊息的通道,與控制代碼 0002h 關聯。
SVGA VESA 建議的超級 VGA 影片模式 (A.10-1)。
SWR 算術協處理器中的狀態字暫存器 (7.04-08, 7.04-64)。
TASM TurboASseMbler - Borland 公司的低階程式碼彙編器。
TLB 轉換後備緩衝區 - CPU 中的快取緩衝區,執行線性地址到物理地址的轉換。
TSR 終止並駐留 - 駐留模組或程式 (8.02-23)
TWR 算術協處理器中的標籤字暫存器。
UEFI 統一 EFI - EFI 的修訂版,於 2007 年被採用用於現代 32 位多核 CPU。UEFI 規定了圖形外殼、網路支援以及透過 CSM 模組保持與作業系統的相容性。
UHCI 通用主機控制器介面 - 用於 USB 匯流排版本 1.x (5.07-05) 的控制器規範。
UMB 上部記憶體塊 - 地址空間塊,分配用於在 640–1024 kb 區域內載入驅動程式。
USB 通用序列匯流排 (5.07-05)。
V86 虛擬 8086 模式 - 現代 CPU 對過時 CPU 8086 的模擬,在保護模式下執行。V86 模式允許在最低(第三)特權級別執行 DOS 程式。
VBE 影片 BIOS 擴充套件,由 VESA 開發 (8.01-35),用於實現 SVGA 影片模式。
VC Volkov Commander 外殼 (6.25)。
VCPI 虛擬控制程式介面 - 允許從一個控制程式到另一個控制程式的控制轉移的互動協議 (5.04-02)。
VESA 影片電子標準協會。
VGA 影片圖形陣列 - 用於 IBM PS/2 計算機的影片介面卡。
XMS 由 Himem.sys (5.04-01) 實現的擴充套件記憶體規範
YIQ 畫素表示模型,在亮度和兩個色度軸上,對應於最高和最低視覺色彩解析度。
YUV 畫素表示模型,在亮度和兩個色度軸上,符合 CIE(國際照明委員會)的規範。
yy 年份(在 MS-DOS 中,年份由一個四位數表示)。
ZIP – (1) : 由 PKZIP 實用程式壓縮的歸檔檔案的副檔名。
ZIP – (2) : 由 Iomega 公司生產的可移動磁碟驅動器的商標。
ZF CPU 的零標誌,用於指示相等或零結果。
華夏公益教科書