跳轉至內容

邁向 MS-DOS 7 下的系統程式設計的第一步/精選中斷處理程式

25% developed
來自 Wikibooks,開放書籍,為開放世界而生


Clipboard

待辦事項
整章都需要格式化


第 8 章。精選中斷處理程式

在某些情況下,需要中斷 CPU 的正常操作順序,以響應緊急請求。中斷可以由硬體和軟體發起。CPU 在發生意外錯誤(異常)時會呼叫中斷。其他硬體裝置透過中斷控制器線路 IRQ 00 – IRQ 15 傳送其中斷請求。程式使用 INT 命令 (7.03-28) 引起“軟體”中斷。在任何情況下,中斷都會導致執行特定的中斷處理程式子程式,該子程式執行請求的操作。

大量的中斷處理程式從計算機開機開始就永久地存在於計算機記憶體中。這些處理程式可以看作是標準子程式庫。程式設計工作的有效性很大程度上取決於您在使用此庫方面的技能。

中斷處理程式的入口點地址儲存在中斷表中。CPU 的真實模式和保護模式使用不同的中斷表。

保護模式中斷表填充了 8 位元組描述符,指定中斷處理程式和 API 服務的訪問許可權和入口點地址。中斷處理程式的選擇、其排列以及中斷表在記憶體中的放置是任意的,由該程式或該作業系統控制,該程式或該作業系統在保護模式下控制計算機的執行。

相反,真實模式中斷表是嚴格制度化的。在所有 AT 相容計算機中,它佔據相同的記憶體區域,從 0000:0000h 到 0000:03FFh。它不是由描述符填充,而是由中斷處理程式入口點的 4 位元組地址填充。特定 BIOS 功能的統一地址放置構成了軟體相容性的基礎。後一種特性定義了真實模式中斷表的重要作用,並引起了我們對其的特殊興趣。

將 CPU 切換到保護模式後,真實模式中斷表會完好無損地保留,並且仍然可以訪問。真實模式中斷處理程式可能需要用於特定的主機板硬體和執行 DOS 功能,這些功能由“DOS 盒”中的程式呼叫。在執行真實模式中斷處理程式期間,保護模式作業系統將 CPU 切換回真實模式。由於這些隱藏的操作,"DOS 盒"內的 DOS 程式的執行速度要比真實模式下慢得多。

真實模式中斷表中任何所需地址的偏移量由中斷號乘以 4 自動計算得出。每個地址都是一個雙字指標,應該以相反的順序解釋:第四和第三個位元組構成段地址,第二個和第一個位元組構成入口點偏移量。例如,轉儲 59 F8 00 F0 對應於處理程式的入口點地址 F000:F859h。

任何中斷請求都意味著提交的地址指向處理程式可執行程式碼的入口點。但是,也有一些例外:真實模式中斷表中的偏移量 0074h、0078h、007Ch、0104h、010Ch、0118h 指向不可執行的資料表 (A.12-1)。相應的編號 1Dh、1Eh、1Fh、41h、43h、46h 不能用於列舉中斷。

中斷表部分由 BIOS 填充,通常填充到 INT 1C。MS-DOS 7 的核心添加了自己的指標(最著名的是 INT 20 - INT 2E),後來幾乎每個驅動程式都設定了指向其自身處理程式的雙字 (dword) 指標。在每一步,任何先前載入的指標都可能被替換;有些指標被覆蓋了兩次以上。因此,中斷可能會被新的處理程式攔截。大多數情況下,中斷攔截是為了提供對新功能的條件訪問,否則會將呼叫重新定向到以前的處理程式。對於大部分中斷,無法確定它們的處理程式是屬於 BIOS 還是 DOS 還是其他程式:這可能取決於您 PC 中的特定配置設定。

由於中斷處理取決於 PC 的 BIOS,並且可能由軟體更改,因此 MS-DOS 7 無法保證其永遠嚴格定義。在幾乎任何中斷呼叫之後,都需要檢查結果的有效性。然而,存在大量 API 函式,為了相容性原因而保持完好無損,並且幾乎可以肯定會在 MS-DOS 7 下的任何 PC 中遇到。本章下面介紹了呼叫此類函式的選定中斷呼叫。

8.01 由 PC 的 BIOS 載入的中斷處理程式 (INT 00 – INT 1C)

[edit | edit source]

8.01-01 INT 00 – 除以零錯誤

[edit | edit source]

如果在執行 DIV (7.03-21) 或 IDIV (7.03-24) 命令後商溢位結果暫存器,則 CPU 會生成對 INT 00h 處理程式的呼叫。預設的 INT 00 處理程式會終止當前程式的執行,顯示一條訊息:“您的程式導致了除法溢位錯誤…”,並將控制權轉移到 DOS。

注 1:如果由 CPU 發起對 INT 00 處理程式的呼叫,則 CPU 會在堆疊中留下一個返回地址,該地址不是指向下一個命令,而是指向導致溢位的除法命令。

8.01-02 INT 01 – 單步中斷

[edit | edit source]

如果標誌暫存器中的陷阱標誌 TF (A.11-4) 被設定,則 CPU 會在執行每個命令後呼叫 INT 01 處理程式。此功能用於逐行跟蹤程式的執行。此外,從 80386 開始的現代 CPU 具有內部除錯暫存器 (A.11-5),每次 CPU 訪問預定義的記憶體區域或預定義的埠時,都會呼叫 INT 01 處理程式。INT 01 處理程式也可能由未公開的程式碼 F1h 呼叫。

PC 的 BIOS 系統沒有安裝 INT 01 處理程式的地址,而是安裝了對 IRET 命令 (7.03-30) 的引用,該命令只是將 CPU 返回到下一個命令的執行。

除錯工具必須在中斷表中用它們自己的處理程式的地址替換此引用,以便將控制權轉移到啟動程式測試執行的程序(例如,到偵錯程式 DEBUG.EXE)。

注 1:陷阱標誌 TF 在執行每個命令後被清除,但其原始狀態(即在被清除之前的狀態)會在 INT 01 處理程式被呼叫時與返回地址一起儲存在堆疊中。因此,INT 01 處理程式的程式碼本身是在 TF 標誌被清除的情況下執行的,但最終的處理程式命令 IRET 會從堆疊中恢復 TF 標誌的原始狀態。

注 2:在呼叫 INT 01 處理程式時儲存在堆疊中的返回地址通常指向程式測試中的下一個命令。但是,當除錯暫存器呼叫 INT 01 處理程式時,返回地址只指向滿足預定義條件的命令。除錯暫存器 DR6 (A.11-5) 中的標誌可以用來區分 INT 01 呼叫的原因。

8.01-03 INT 02 – 不可遮蔽中斷

[編輯 | 編輯原始碼]

INT 02 處理程式的呼叫是由傳送到 NMI(不可遮蔽中斷)CPU 引腳的訊號引起的。與其他硬體中斷不同,透過 NMI 引腳的呼叫不能被 CLI 命令(7.03-12)或中斷控制器中的掩碼阻塞。INT 02 處理程式具有特殊任務:它響應緊急事故,例如記憶體故障。對於大多數此類事故,INT 02 處理程式會顯示錯誤訊息並停止進一步執行,使 CPU 停止執行。在許多 PC 中,傳送到 NMI 引腳的訊號會通知即將發生的電源故障的第一個症狀。在這種情況下,INT 02 處理程式會採取緊急措施,旨在防止資料丟失,然後將控制權返回給被中斷的程序:如果警報被證明是錯誤的,並且電源故障實際上沒有發生,則該程序有機會恢復。

筆記
  1. 如果透過 OUT 命令(7.03-66)將一個第 7 位設定為 1 的位元組傳送到 CMOS 記憶體埠 70h,則可以暫時阻止對 CPU 的 NMI 引腳的呼叫。此操作意味著隨後向埠 71h 傳送另一個位元組。[註釋 A.14-1 的註釋 1] 阻塞對 CMOS 記憶體訪問期間的 NMI 請求可以防止 CMOS 資料失真。

8.01-04 INT 03 – 斷點

[編輯 | 編輯原始碼]

當機器指令中第一個位元組的位置遇到程式碼 CCh(7.03-28)時,處理器會生成對 INT 03 處理程式的呼叫。程式碼 CCh 通常由除錯實用程式插入,以便在所需點(斷點)停止被測程式的執行。特別是,偵錯程式 DEBUG.EXE 就是透過這種方式設定斷點的。

PC 的 BIOS 系統安裝對 IRET 命令(7.03-30)的引用,而不是 INT 03 處理程式的地址,IRET 命令只是將 CPU 返回到下一個命令的執行。除錯實用程式必須在中斷表中將此引用替換為其自身處理程式的地址,該處理程式將用於處理 INT 03 呼叫。

8.01-05 INT 04 – 溢位錯誤響應

[編輯 | 編輯原始碼]

與迫使立即響應溢位錯誤的中斷 INT 00 不同,中斷 INT 04 允許透過 INTO 命令(7.03-29)延遲響應溢位。遇到 INTO 命令的程式碼 CEh 時,處理器會檢查溢位標誌 OF 的狀態:如果它沒有被清除,則會呼叫 INT 04 處理程式。預設的 INT 04 處理程式只是將控制權返回給呼叫程式。每個程式都有機會用自己的 INT 04 處理程式替換預設的 INT 04 處理程式,從而為溢位錯誤提供所需的響應。

8.01-06 INT 05 – 螢幕轉儲和邊界檢查

[編輯 | 編輯原始碼]

由於 IBM 和 Intel 的技術決策相互矛盾,INT 05 真實模式處理程式被賦予了兩個不同的任務。

在 IBM 相容的 PC 中,BIOS 安裝了中斷 INT 05 處理程式,它將活動螢幕頁面傳送到印表機。列印過程由使用者的 Shift-PrtSc 鍵擊啟動。INT 09 處理程式(8.01-09)識別此鍵組合後,會呼叫 IBM 的 INT 05 處理程式。後者會在 BIOS 資料區(A.12-1)中地址 0000:0500h 處檢查印表機狀態位元組。印表機狀態位元組的狀態具有以下含義:

00h – 印表機連線到 LPT1 埠並已準備就緒;
01h – 印表機繁忙,之前的任務尚未完成;
FFh – 前一個對印表機的請求已失敗。

如果狀態位元組處於 00h 狀態,則活動螢幕頁面將被髮送到 LPT1 埠並被列印。

從 i80286 開始的英特爾處理器,如果 BOUND 機器指令(程式碼 62h)檢測到邊界違規,就會呼叫 INT 05 處理程式。顯然,INT 05 處理程式的這一任務必須完全不同。

DEBUG.EXE “不認識” BOUND 命令,因此在第 7 章中沒有描述它。為了避免在真實模式下使用 BOUND 命令引起的衝突,相關程式必須安裝自己的中斷處理程式,這些處理程式能夠處理呼叫源歧義問題。這個問題在保護模式下並不存在,因為保護模式的中斷表重新排列,因此 INT 05 呼叫不再承擔螢幕頁面列印任務。

註釋 1:原始的 INT 05 處理程式通常被另一個處理程式替換,該處理程式由影片卡提供,並由 PrtSc 鍵呼叫(8.01-66)。

註釋 2:如果 BOUND 命令觸發了對 INT 05 處理程式的呼叫,那麼 CPU 在堆疊中留下的返回地址不是下一個命令的地址,而是 BOUND 命令本身的地址。此類呼叫不應指向 IRET 命令,因為 PC 將陷入無限的呼叫和返回迴圈中。

8.01-07 INT 06 – 無效程式碼異常

[編輯 | 編輯原始碼]

CPU 會以呼叫 INT 06 處理程式的方式響應對無效程式碼執行嘗試,特別是對

  • 處理器在真實模式下工作時的保護模式命令;
  • 對不寫入記憶體的命令應用 LOCK 字首;
  • 為僅接受記憶體運算元的命令指定暫存器;
  • CPU 無法識別的命令程式碼。

由於對 INT 06 處理程式的呼叫是由任何“未知”機器程式碼觸發的,因此 INT 06 處理程式有時用於在配備有舊式 CPU 的 PC 上模擬現代 CPU 的命令。但預設的 INT 06 處理程式只是將控制權返回給呼叫程式中的下一個命令。

8.01-08 INT 07 – 協處理器服務異常

[編輯 | 編輯原始碼]

如果在控制暫存器 CR0(A.11-4)中其位 02h(“協處理器模擬”)被設定,CPU 會呼叫 INT 07 處理程式以響應嘗試執行 ESC 命令(7.03-22)或任何協處理器的命令(7.04)。可以故意設定位 02h 以呼叫處理程式,該處理程式模擬協處理器的功能。一些 BIOS 系統會在那些沒有配備算術協處理器的 PC 中自動執行此操作。

現代 PC 擁有整合在主 CPU 中的算術協處理器,因此不需要模擬協處理器的功能。因此,INT 07 處理程式可以承擔另一個任務:對算術協處理器中未遮蔽的異常進行登記時採取適當的措施。為此,如果在控制暫存器 CR0(A.11-4)中位 01h 和 03h 都被設定,則 WAIT 字首(7.02-05)可能會觸發對 INT 07 處理程式的呼叫。為了忽略 WAIT 字首,CR0 暫存器中的位 01h 應該被清除。

任何 INT 07 任務的實現都意味著載入相應的處理程式。預設的 INT 07 處理程式只是將控制權返回給呼叫程式中的下一個命令。

8.01-09 INT 08 – INT 0F:中斷請求 IRQ 0 – IRQ 7

[編輯 | 編輯原始碼]

當 CPU 處於真實模式時,INT 08 – INT 0F 中斷處理程式組會響應透過 IRQ 0 – IRQ 7 線從各種裝置傳送到第一個中斷控制器的請求。一些 IRQ 線有專門的硬體源,列在以下表格的第四列中,但其他 IRQ 線可以自由地接收來自任何裝置的請求,這些裝置已調整為透過這些線之一發送請求,並且受載入了對應中斷處理程式的驅動程式的支援。

除了響應外部 IRQ 請求外,同一 INT 08 – INT 0F 組中的一些中斷處理程式也可以由 CPU 呼叫,以處理某些特定的錯誤(異常)。這些異常可能會在真實模式下引起對 INT 08 – INT 0F 處理程式的呼叫,在以下表格的註釋中進行了描述。中斷控制器不記錄由 CPU 生成的中斷呼叫。如果透過 OUT 命令(7.03-66)將位元組 0Ah 傳送到中斷控制器的埠 20h,那麼透過同一個埠 20h,IN 命令(7.03-26)將能夠讀取一個位元組,該位元組表示透過每個 IRQ 線接收了一個請求,透過設定對應位的 TRUE 狀態來表示,這些位在以下表格的第三列中指定。對應位的清除狀態表明該特定中斷是由 CPU 啟動的。

如果中斷處理程式的呼叫是由異常引起的,那麼 CPU 在堆疊中留下的返回地址不是下一個命令的地址,而是當前命令的地址,該命令引起了異常呼叫。這使得有機會重複操作,如果異常的原因可以消除,但是另一方面,這種呼叫不應該指向 IRET 命令,因為 PC 會陷入無限迴圈的呼叫和返回中。如果中斷處理程式無法糾正這種情況,則必須透過終止執行或糾正堆疊中的返回偏移來阻止重複操作。除此之外,當處理程式執行其工作時,必須阻止透過中斷控制器接收併發中斷請求。這可以透過 OUT 命令(7.03-66)來完成,將一個掩碼位元組傳送到埠 21h,該位元組具有與併發 IRQ 線對應的位的 TRUE 狀態,如以下表格的第三列所示。

中斷 掩碼 請求來源 註釋
INT 08 IRQ 0 位 0 系統定時器 註釋 *1
INT 09 IRQ 1 位 1 鍵盤控制器 註釋 *2
INT 0A IRQ 2 位 2 第二個中斷控制器 註釋 *3
INT 0B IRQ 3 位 3   註釋 *4
INT 0C IRQ 4 位 4 序列埠 COM 1 註釋 *5
INT 0D IRQ 5 位 5   註釋 *6
INT 0E IRQ 6 位 6 軟盤驅動器控制器 註釋 *7
INT 0F IRQ 7 位 7 並行埠 LPT 1

註釋 1: 對 INT 08 處理程式的呼叫每秒定期進行 18.2 次,以維持時間計數。反過來,INT 08 處理程式呼叫 INT 1C(8.01-96),為應用程式提供了攔截後者的機會。INT 08 處理程式也可以在發生“雙重故障”異常的情況下由 CPU 呼叫,這通常會導致重新啟動。

註釋 2: INT 09 處理程式感知每個按鍵,控制鍵盤緩衝區並準備程式碼,如附錄 A.02-1 中所示,並透過 INT 16 嚮應用程式呈現。但 INT 09 處理程式只對文章 1.01 中列出的幾個鍵組合進行明確的立即操作。

註釋 3: 第二個中斷控制器透過線路 IRQ 8 – IRQ 15 接受中斷請求,並引起對 INT 70 – INT 77 處理程式(8.03-75)的呼叫。

註釋 4: IRQ 3 線中斷請求的最可能來源是第二個序列埠 COM 2(如果存在)。

註釋 5: INT 0C 處理程式也可以在發生“堆疊溢位”異常的情況下由 CPU 呼叫,此時堆疊超過其預定義的限制。

註釋 6: INT 0D 處理程式可以在發生段限制違規異常的情況下由 CPU 呼叫,即嘗試訪問超出預定義段限制的程式碼或資料。

註釋 7: 對 INT 0E 處理程式的呼叫可能是由 CPU 在響應嘗試訪問“關閉”記憶體頁面(那些在 CPU 的 TLB 緩衝區中找不到的頁面)時發起的。

註釋 8: 將外部請求 IRQ 0 – IRQ 7 對映到對 INT 08 – INT 0F 處理程式的呼叫可以透過重新程式設計中斷控制器來更改,以便外部請求不會呼叫那些旨在處理 CPU 異常的處理程式。這種重新程式設計通常在準備將 CPU 切換到保護模式的過程中進行,與為保護模式形成新的中斷表相協調。

8.01-10 INT 10\AH=00h – 設定影片模式

[edit | edit source]

準備:AH = 00h AL – 要設定的影片模式程式碼(A.10-1) 返回:AL 內容可能被更改

註釋 1: 此函式將所有影片卡(包括現代影片卡)切換到與過時的 VGA 影片卡相容的影片模式。現代 SVGA 影片模式應透過函式 INT 10\AX=4F02h 設定。

註釋 2: 當前影片模式的程式碼寫入 BIOS 資料區(A.10-6)地址 0040:0049h。

註釋 3: 與滑鼠指向裝置引數切換相協調的影片模式切換可以由滑鼠驅動程式執行,該驅動程式透過中斷 INT 33\AX=0028h 呼叫。

註釋 4: 影片模式的切換會導致螢幕變黑(變暗),持續時間長達 2 秒,視覺感知不舒服。因此,應避免過度切換影片模式。為了清除螢幕,應優先呼叫 INT 10\AH=06h(8.01-15)。

8.01-11 INT 10\AH=01h – 文字影片模式下的游標大小

[edit | edit source]

準備:AH = 01h CH – 位 7, 6, 5: – 清零 – 位 0–4: – 游標最上面的行號 CL – 位 7, 6, 5: – 清零 – 位 0–4 – 游標最下面的行號

註釋 1: 行是從上到下在當前字型高度內計數。游標最上面的行號和最下面的行號的當前數字寫入 BIOS 資料區(A.10-6)地址 0040:0060h。當前字型高度可以透過呼叫 INT 10\AX=1130h 處理程式來確定,也可以直接從 0040:0085h 記憶體單元讀取。

註釋 2: 將 CH 暫存器中的位 5 設定為 TRUE 狀態會使游標不可見。

8.01-12 INT 10\AH=02h – 設定游標位置

[edit | edit source]

準備:AH = 02h BH – 螢幕頁號(INT 10\AH=05h 的註釋 1 和 2) DH – 行號(從 00h 開始計數 – 最上面的行) DL – 列號(從 00h 開始計數 – 最左邊的列)

註釋 1: 游標位置是為每個螢幕頁面單獨定義的。

註釋 2: 最多 8 個螢幕頁的游標座標對寫入 BIOS 資料區,從地址 0040:0050h 開始(A.10-6)。

8.01-13 INT 10\AH=03h – 確定游標的大小和位置

[edit | edit source]

準備:AH = 03h BH – 螢幕頁號(INT 10\AH=05h 的註釋 1 和 2) 返回:CH – 游標大小最上面的行號 CL – 游標大小最下面的行號 DH – 行號(從 00h 開始計數 – 最上面的行) DL – 列號(從 00h 開始計數 – 最左邊的列)

註釋 1: 一些 BIOS 版本在 AX 暫存器中返回零。

8.01-14 INT 10\AH=05h – 選擇活動螢幕頁面

[edit | edit source]

準備:AH = 05h AL – 請求的螢幕頁號

註釋 1: 如果請求的頁號大於當前影片模式允許的最大頁號,則 INT 10\AH=0Fh 函式將不會確認選擇。VGA 影片模式允許的最大頁號在 INT 10\AX=1B00h 函式(A.10-2,偏移 29h)返回的表格中顯示,對於 SVGA 影片模式,則在 INT 10\AX=4F01h 函式(A.10-7,偏移 1Dh)返回的表格中顯示。

註釋 2: 螢幕頁面從 00h 開始編號,因此允許的最大頁號比螢幕頁面的總數少 1。最流行的文字影片模式 03h 提供 4 個螢幕頁面,編號從 00h 到 03h。

註釋 3: 與滑鼠游標切換到同一頁面相協調的螢幕頁面的選擇可以由滑鼠驅動程式執行,該驅動程式透過中斷 INT 33\AX=001Dh(8.03-47)呼叫。

8.01-15 INT 10\AH=06h–07h – 在螢幕視窗上滾動

[edit | edit source]

術語“滾動”表示在整個螢幕或“視窗”內上下移動顯示的內容,即構成整個螢幕一部分的矩形區域。從“視窗”邊框下方出現的行沒有內容,只是用規定的顏色填充。給定 AL = 00h,滾動過程可以清除並用統一的顏色填充整個矩形“視窗”或整個螢幕。

準備: AH – 滾動方向: = 06h – 向上滾動, = 07h – 向下滾動 AL – 滾動行數(或 00h – 清空整個視窗) BH – 填充新行的顏色:位 0–3: – 清空為零,位 4–7: – 表 A.10-5 第 1 列中的顏色程式碼。 CH – 行, CL – 視窗左上角的列 DH – 行, DL – 視窗右下角的列

注意 1:滾動過程僅適用於文字影片模式。

注意 2:滾動過程僅影響活動螢幕頁,其他螢幕頁保持不變。

注意 3:從滾動過程返回後,某些 BIOS 版本可能會更改 BP 或 DS 暫存器的內容。

8.01-16 INT 10\AH=08h – 讀取游標位置的字元

[編輯 | 編輯原始碼]

準備: AH = 08h BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) 返回: AH – 顏色位元組,如表 A.10-5 所示(僅在文字影片模式下) AL – 讀取字元的 ASCII 程式碼

注意 1:在圖形影片模式下,僅以白色前景畫素繪製的字元才能正確識別。如果字元無法識別,則返回 AL = 00h。

8.01-17 INT 10\AH=09h–0Ah – 在游標位置顯示字元

[編輯 | 編輯原始碼]

準備: AH = 09h AL – 要顯示的字元的 ASCII 程式碼 BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) BL – 顏色位元組,如附錄 A.10-5 所示。 CX – 寫入字元的重複次數

注意 1:所有符號都顯示,包括 0Dh(CR)、0Ah(LF)、08h(BS)和其他特殊符號,這些符號在附錄 A.02-8 中提到。

注意 2:在顏色少於 256 色的圖形影片模式下,如果 BL 暫存器中第 7 位的 TRUE 狀態被設定,則透過 XOR 邏輯運算將指定的字元寫入影片記憶體。

注意 3:在圖形影片模式下,CX 暫存器中指定的重複次數不得超過當前游標位置右側同一行中的字元位置數。

注意 4:INT 10\AH=0Ah 處理程式以相同的方式顯示字元,但會忽略 BL 中的顏色位元組。顯示的字元將與所有先前的螢幕內容具有相同的顏色。

注意 5:顯示操作不會移動游標位置,並且不依賴於 CX 暫存器中指定的重複次數。

注意 6:對於 256 色圖形影片模式(例如,在影片模式 13h 中),BH 暫存器必須指定背景顏色位元組,而 BL 暫存器必須指定前景顏色位元組。

8.01-18 INT 10\AH=0Bh – 背景或邊框顏色

[編輯 | 編輯原始碼]

對於圖形影片模式,此函式定義背景顏色,但對於文字影片模式,它定義邊框顏色。 準備: AH = 0Bh BX – 位 3–15: – 清空為零 – 位 2、1、0: – 對應於紅色、綠色和藍色顏色

注意 1:許多現代 LCD 顯示器要麼無法正確顯示螢幕邊框,要麼根本不顯示。

8.01-19 INT 10\AH=0Ch – 繪製點

[編輯 | 編輯原始碼]

準備: AH = 0Ch AL – 畫素的顏色位元組(A.10-5) BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) CX – 畫素的列號 DX – 畫素的行號

注意 1:點繪製功能僅適用於圖形影片模式。

注意 2:在顏色少於 256 色的圖形影片模式下,如果 AL 暫存器中第 7 位的 TRUE 狀態被設定,則透過 XOR 邏輯運算將點寫入影片記憶體。

注意 3:如果活動影片模式僅支援一個螢幕頁,則會忽略 BH 的內容。

注意 4:INT 10\AH=0Ch 函式適合繪製線條,但它對於填充螢幕區域來說太慢。為了達到後一種目的,應該優先考慮更快的直接寫入影片記憶體 (8.01-39)。

8.01-20 INT 10\AH=0Dh – 讀取畫素的顏色

[編輯 | 編輯原始碼]

準備: AH = 0Dh BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) CX – 畫素的列號 DX – 畫素的行號 返回: AL – 顏色位元組(A.10-5)

注意 1:INT 10\AH=0Dh 函式僅適用於圖形影片模式。

注意 2:如果活動影片模式僅支援一個頁面,則會忽略 BH 的內容。

8.01-21 INT 10\AH=0Eh – 以電傳打字機方式顯示字元

[編輯 | 編輯原始碼]

INT 10\AH=0Eh 函式在當前游標位置顯示一個字元,然後將游標移至下一個字元單元格。如果當前行沒有可用空間,則游標將被轉移到下一行的開頭。

準備: AH = 0Eh AL – 要顯示的字元的 ASCII 程式碼 BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) BL – 前景顏色(僅在圖形影片模式下)

注意 1:附錄 A.02-8 中列出的特殊程式碼,包括 07h (BEL) 和 08h (BS),不會顯示,而是作為命令執行。

注意 2:在文字影片模式下,顯示的字元將繼承為前一個字元單元格指定的顏色。

8.01-22 INT 10\AH=0Fh – 確定當前影片模式

[編輯 | 編輯原始碼]

準備: AH = 0Fh 返回: AH – 一行或一列中的字元列數 AL – 當前影片模式的程式碼 (A.10-1) BH – 活動螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2)

注意 1:如果影片模式的程式碼最初以其第 7 位設定為 TRUE 狀態(螢幕未清除)指定,則返回的程式碼的第 7 位也將設定為 TRUE 狀態。

注意 2:INT 10\AH=0Fh 函式無法正確確定 SVGA 影片模式的程式碼:對於文字 SVGA 影片模式,它返回 AL=07h (單色影片模式) 或 AL=03h (彩色影片模式)。

8.01-23 INT 10\AX=1003h – 切換第 7 位任務

[編輯 | 編輯原始碼]

在文字影片模式下,顏色位元組 (A.10-5) 中的第 7 位可以定義閃爍或背景強度:它取決於控制位的狀態,該狀態可以透過 INT 10\AX=1003h 函式更改。

準備: AX = 1003h BX – 操作型別: = 0000h – 啟用背景強度控制; = 0001h – 啟用前景閃爍控制。

注意 1:控制位的狀態由 BIOS 資料區域 (A.10-6) 中地址 0040:0065h 處的位元組中的第 5 位表示,也由 INT 10\AX=1B00h 函式返回的資料塊 (A.10-2) 中偏移量 2Dh 處的位元組中的第 5 位表示。

8.01-24 INT 10\AX=1010h – 設定顏色強度

[編輯 | 編輯原始碼]

INT 10\AX=1010h 函式將主顏色(紅色、綠色和藍色)的所需部分強度(從 00h 到 3Fh)寫入 DAC 的某個暫存器中。部分強度的組合將產生該顏色色調,該色調應由此特定 DAC 的暫存器定義。

準備: AX = 1010h BX – 目標 DAC 的暫存器號 CH – 綠色顏色的部分強度 CL – 藍色顏色的部分強度 DH – 紅色顏色的部分強度

注意 1:所有 DAC 的暫存器都可用於寫入,但並非所有暫存器都處於活動狀態:這取決於當前的影片模式。特別是,16 色影片模式中的背景顏色調色盤由 DAC 的暫存器 0000h–0007h 定義。

8.01-25 INT 10\AX=1015h – 讀取顏色強度

[編輯 | 編輯原始碼]

INT 10\AX=1015h 函式讀取儲存在 DAC 的某個暫存器中的主顏色(紅色、綠色和藍色)的部分強度。這些部分強度的組合將產生由此特定 DAC 暫存器定義的顏色色調。

準備: AX = 1015h BX – 目標 DAC 的暫存器號

返回: AX 暫存器中的值可能會被更改; CH – 綠色顏色的部分強度; CL – 藍色顏色的部分強度; DH – 紅色顏色的部分強度。

8.01-26 INT 10\AX=1018h – 設定顏色掩碼

[編輯 | 編輯原始碼]

準備:AX = 1018h BL – 要設定的新掩碼

注意 1:在掩碼中,位 0-2 控制背景的藍色、綠色和紅色。位 3-5 對前景色做同樣的事情。位 6 和 7 的狀態無關緊要。顏色掩碼的正常狀態由位元組 FFh 表示:所有顏色都開啟。

注意 2:CLS 命令(3.05)不會將顏色掩碼重置為其正常狀態。

8.01-27 INT 10\AX=1100h – 文字影片模式的字型載入

[編輯 | 編輯原始碼]

準備:AX = 1100h BH – 每個字元圖案的位元組數 BL – 目標記憶體塊的識別符號(見 8.01-28 的注意 1) CX – 要載入或替換的字元圖案數量 DX – 載入的偏移量,從目標記憶體塊的開頭開始計算 ES:BP – 指向要載入的圖案表的指標

注意 1:隱含的是整個字體表包含 FFh 個字元圖案。

注意 2:字元圖案中的每個位元組代表一行螢幕,因此圖案中的位元組數(BH 暫存器的值)與字型高度中的螢幕行數相同。

注意 3:此函式設定與載入的字型相對應的文字影片模式,但不會清除影片緩衝區。

注意 4:如果要載入多個字型,則 DISPLAY.SYS 驅動程式 (5.02-02) 必須事先準備好相同數量的字元生成器記憶體塊。否則,只能使用一個識別符號為 00h 的預設記憶體塊。

注意 5:INT 10\AX=1110 函式也為文字影片模式載入字型,並接受相同的規格,但會重新計算影片控制器的當前狀態。在呼叫 INT 10\AX=1110 之前,必須使用活動影片頁 00h 設定文字影片模式。

8.01-28 INT 10\AX=1103h – 在已載入的字型之間切換

[編輯 | 編輯原始碼]

INT 10\AX=1103 函式將字元生成器切換到另一個字型,該字型必須事先載入到字元生成器的某個記憶體塊中。EGA 相容和 VGA 相容影片卡中的字元生成器能夠同時保持兩個記憶體塊活動,從而有機會顯示兩種字型的字元。每個字元的字型選擇取決於顏色位元組(A.10-5)中的位 3,該位元組由字元顯示函式(特別是 INT 10\AH=09h 和 INT 10\AH=0Eh 函式)接受,這些函式從 BL 暫存器接受顏色位元組。

準備:AX = 1103h BL – 所選記憶體塊的識別符號(見下面的注意 1)

注意 1:字元生成器記憶體塊的識別符號是一個位元組,有兩個專用欄位。一個欄位由位 4、1、0 表示。另一個欄位由位 5、3、2 表示。在每個欄位中,應該寫入記憶體塊的編號(從 0 到 7)。此記憶體塊中的字型必須已載入。如果兩個欄位中的記憶體塊編號相等,則將定址一個字型,然後顏色位元組(A.10-5)中的位 3 將定義強度。特別是,在 EGA 相容影片卡中,最多允許 4 種字型,它們的記憶體塊可以透過識別符號 00h、05h、0Ah、0Fh 定址。

注意 2:同時保持兩個字型活動的能力由靜態功能表(A.10-3)中的第 9 個位元組的值指示。該表的地址由 INT 10\AX=1B00h 函式報告。

注意 3:為了同時啟用兩個字型,識別符號位元組的兩個欄位中應該儲存不同的記憶體塊編號。顏色位元組中位 3 被清除的字元將從記憶體塊中選擇,該記憶體塊的編號儲存在識別符號的第一個欄位(位 4、1、0)中。顏色位元組中位 3 被設定的字元將從記憶體塊中選擇,該記憶體塊的編號儲存在識別符號的第二個欄位(位 5、3、2)中。

8.01-29 INT 10\AX=1104h – 載入標準 8x16 字型

[編輯 | 編輯原始碼]

INT 10\AX=1104 函式將 BIOS 的預設 8x16 字型(代表美國內碼表 CP437)載入到字元生成器的記憶體塊中。同時設定文字影片模式 03h,因為它的格式 (80x25) 對應於 8x16 字型。

準備:AX = 1104h BL – 所選記憶體塊的識別符號(見 8.01-28 的注意 1)

注意 1:INT 10\AX=1114 函式也為文字影片模式 03h 載入 BIOS 的標準 8x16 字型,並接受相同的規格,但會重新計算影片控制器的當前狀態。在呼叫 INT 10\AX=1114 之前,必須使用活動影片頁 00h 設定影片模式 03h。

注意 2:如果要載入多個字型,則 DISPLAY.SYS 驅動程式 (5.02-02) 必須事先準備好相同數量的字元生成器記憶體塊。否則,只能使用一個識別符號為 00h 的預設記憶體塊。

注意 3:8x8 和 8x14 CP437 字型也可以從 BIOS 的只讀記憶體中載入。8x8 字型透過 INT 10\AX=1102h 和 INT 10\AX=1112h 函式以類似的方式載入。單色 8x14 字型透過 INT 10\AX=1101h 和 INT 10\AX=1111h 函式以類似的方式載入。呼叫 INT 10\AX=1111h 和 INT 10\AX=1112h 函式會導致重新計算影片控制器的當前狀態,並且必須在設定適當的文字影片模式之前進行。

8.01-30 INT 10\AX=1121h – 圖形影片模式的字型載入

[編輯 | 編輯原始碼]

準備:AX = 1121h BL – 字元行數規格:= 01h – 14 行,= 02h – 25 行,= 03h – 43 行,= 00h – 行數由 DL 暫存器定義。CX – 每個字元圖案的位元組數 DL – 行數,如果 BL = 00h(否則忽略 DL) ES:BP – 指向要載入的字元圖案表的指標

注意 1:呼叫 INT 10\AX=1121h 函式必須緊接在設定(或重置)圖形影片模式之前。

注意 2:圖形影片模式的字型不需要準備字元生成器的記憶體塊。相反,必須將指向已載入字型的指標寫入中斷表的地址 0000:010Ch。這個指標有時被稱為向量 INT 43。

注意 3:BIOS 的 8x8 預設字型的字元 80h-FFh 的使用者定義圖案可以透過 INT 10\AX=1120h 以類似的方式載入。由於此字型的格式已知,因此 BL、CX 和 DL 暫存器的值將被忽略,並且字體表將具有固定長度 400h。必須將指向已載入字型的指標寫入中斷表的地址 0000:007Ch。這個指標有時被稱為向量 INT 1F。

8.01-31 INT 10\AX=1124h – 載入標準圖形字型

[編輯 | 編輯原始碼]

INT 10\AX=1124h 函式載入 BIOS 的標準 8x16 字型,代表圖形影片模式的美國內碼表 CP437。指向該字型的指標將寫入中斷表的地址 0000:010Ch。這個指標有時被稱為向量 INT 43。

準備:AX = 1124h

注意 1:呼叫 INT 10\AX=1124h 函式必須緊接在設定(或重置)圖形影片模式之前。

注意 2:來自 BIOS 的只讀記憶體的 8x14 字型可以透過 INT 10\AX=1122h 函式以類似的方式載入。

注意 3:來自 BIOS 的只讀記憶體的雙點 8x8 字型可以透過 INT 10\AX=1123h 函式以類似的方式載入。

8.01-32 INT 10\AX=1130h – 獲取有關字型的資訊

[編輯 | 編輯原始碼]

準備:AX = 1130h BH – 請求的指向字體表的指標:= 00h – 指向 8x8 圖形字型(從 0000:007Ch)= 01h – 指向當前圖形字型(從 0000:010Ch)= 02h – 指向 BIOS 的 8x14 文字字型 (CP437) = 03h – 指向 BIOS 的 8x8 字型,字元 00h-7Fh = 04h – 指向 BIOS 的 8x8 字型,字元 80h-FFh = 05h – 指向 BIOS 的備用 9x14 字型 = 06h – 指向 BIOS 的標準 8x16 文字字型 (CP437) = 07h – 指向 BIOS 的備用 9x16 字型

返回時:ES:BP – 指向請求的字體表的第一個位元組 CX – 當前字型的每個字元的位元組數 DL – 螢幕上當前字型的最高字元行

注意 1:CX 和 DL 暫存器中返回的資料與請求的字型無關,而是與當前顯示在螢幕上的字型有關。

8.01-33 INT 10\AH=13h – 顯示字元字串

[編輯 | 編輯原始碼]

INT 10\AX=13h 函式顯示一個字元字串,該字串可以以 ASCII 位元組序列或文字影片模式下的影片記憶體字串的形式指定,其中每個 ASCII 位元組後面跟著一個顏色位元組 (A.10-5)。在後一種情況下,BL 暫存器中的值會被忽略。

準備: AH = 13h AL – 位 7–2: – 清零 – 位 1 設定 – 具有交替 ASCII 和顏色位元組的字串 – 位 0 設定 – 沿顯示的字元移動游標 BH – 螢幕頁碼(INT 10\AH=05h 的註釋 1 和 2) BL – 顏色位元組 (A.10-5),如果字串僅包含 ASCII 碼 CX – 要顯示的字串中的字元數 DH – 要開始顯示的字元的行 DL – 要開始顯示的字元的列 ES:BP – 指向要顯示的字串的第一個位元組的指標

註釋 1:附錄 A.02-8 中列出的特殊程式碼 ASCII 不會顯示,而是作為命令執行。

註釋 2:如果字元字串被定向到當前未啟用的螢幕頁,則某些過時的影片卡模型可能無法正確執行退格鍵 (BS) 和回車鍵 (CR) 特殊程式碼。

8.01-34 INT 10\AX=1B00h – 獲取影片狀態資訊。

[編輯 | 編輯原始碼]
準備
  AX = 1B00h
  BX = 0000h
  ES:DI 指向 64 位元組緩衝區的指標,用於資料表
返回時
  AL = 1Bh,如果此函式受 BIOS 支援
  ES:DI 指向帶有影片狀態資料的表的第一個位元組的指標。表的內容在附錄 A.10-2 中描述。

8.01-35 INT 10\AX=4F00h – 關於 BIOS 的 VBE 擴充套件的資訊

[編輯 | 編輯原始碼]

INT 10\AX=4F00h 函式報告可用影片 BIOS 擴充套件和支援的影片模式。如果特定計算機中不存在影片 BIOS 擴充套件,則該計算機中的所有 INT 10\AX=4Fxxh 函式都不受支援。

準備: AX = 4F00h ES:DI – 指向 512 位元組緩衝區的指標,用於資料表

返回時: AL = 4Fh – 任何其他值表示不存在 VBE AH = 00h – 成功終止,資料表已寫入;= 01h – 寫入表嘗試失敗;= 02h – 函式不受硬體配置支援;= 03h – 函式在當前影片模式下無效。ES:DI – 指向返回的 VBE 資料表的第一個位元組的指標 (A.10-4)。

8.01-36 INT 10\AX=4F01h – 關於 SVGA 影片模式的資訊

[編輯 | 編輯原始碼]

準備: AX = 4F01h CX – SVGA 影片模式程式碼 ES:DI – 指向 256 位元組緩衝區的指標,用於資料表

返回時: AL = 4Fh – 任何其他值表示函式不受支援 AH = 00h – 成功終止 = 01h – 操作失敗。ES:DI – 指向返回的影片模式資料表的指標 (A.10-7)。

8.01-37 INT 10\AX=4F02h–4F03h – 設定/獲取 SVGA 影片模式

[編輯 | 編輯原始碼]

準備: AX = 4F02h – 重新設定影片模式;= 4F03h – 獲取當前影片模式程式碼 BX – 僅針對 AX = 4F02h:影片模式程式碼 (A.10-1),包括位 14 設定: – 啟用線性幀緩衝區 位 15 設定: – 不要清除影片記憶體

返回時: AL = 4Fh – 任何其他值表示函式不受支援 AH – 終止程式碼,與 INT 10\AX=4F01h (8.01-36) 後相同 BX – 當前影片模式程式碼 (A.10-1),包括位 14 設定: – 啟用線性幀緩衝區 位 15 設定: – 保留影片記憶體的內容

註釋 1:如果透過中斷 INT 33\AX=0028h 呼叫滑鼠驅動程式,則可以執行與切換滑鼠控制引數相協調的影片模式切換。

註釋 2:顯示裝置不一定支援所有 SVGA 影片模式。在切換到任何影片模式之前,您必須知道您的顯示裝置是否支援此特定影片模式。

註釋 3:影片模式切換會導致螢幕變黑(變暗)長達 2 秒,這對於視覺感知來說很不舒服。

8.01-38 INT 10\AX=4F04h – 儲存/恢復 SVGA 影片模式

[編輯 | 編輯原始碼]

準備: AX = 4F04h CX – 儲存(或要儲存)的配置的一部分: = 0001h – 影片硬體狀態(CX 中的位 0 設定) = 0002h – BIOS 資料(CX 中的位 1 設定) = 0004h – 顏色暫存器和 DAC(CX 中的位 2 設定) = 0008h – SVGA 狀態(CX 中的位 3 設定) = 000Fh – 整個影片配置(位 0–3 設定) DL – 子函式: = 00h – 確定用於儲存影片模式的緩衝區大小 = 01h – 儲存影片控制器的當前狀態 = 02h – 恢復影片控制器的先前狀態 ES:BX – 指向準備好的緩衝區的第一個位元組的指標(僅針對子函式 01h 和 02h,對於子函式 02h,它必須用資料填充)。從子函式 DL = 00h 返回: BX – 需要的 64 位元組記憶體塊數 從子函式 DL = 01h 返回: ES:BX – 指向儲存的影片模式資料的緩衝區的指標

8.01-39 INT 10\AX=4F05h – 控制“視窗”進入影片記憶體

[編輯 | 編輯原始碼]

在過時的計算機中,影片記憶體佔據了地址空間區域 A000:0000–B000:FFFFh 的一部分。表 A.10-1 中顯示了與 EGA 相容和與 VGA 相容的影片模式的地址空間活動區域。但是現代顯示卡是為 SVGA 影片模式設計的,這些模式需要更大的記憶體。整個專用地址空間區域對於 SVGA 影片模式來說太窄了。因此,SVGA BIOS 安排了滑動“視窗”,透過地址空間 A000:0000–B000:FFFFh 訪問影片卡大記憶體的指定區域。

地址空間中滑動“視窗”的數量、大小和位置可能取決於影片卡和所選影片模式。特定影片卡和影片模式的這些資料可以在表 A.10-7 中找到,該表由函式 INT 10\AX=4F01h (8.01-36) 返回。最有可能的是,會安排一個或兩個 64 千位元組的“視窗”:“視窗 A”A000:0000h–A000:FFFFh 和“視窗 B”B000:0000h–B000:FFFFh。INT 10\AX=4F05h 函式報告影片記憶體到指定地址空間“視窗”的當前對映,並允許更改它。

準備: AX = 4F05h BH = 00h – 設定影片記憶體中對映區域的起始點 = 01h – 獲取影片記憶體中對映區域的起始點 BL = 00h – 視窗“A”的請求 = 01h – 視窗“B”的請求 DX – 指向影片記憶體中對映區域的指標(僅針對 BH = 00h)

返回時: AL = 4Fh – 任何其他值表示函式不受支援 AH – 終止程式碼,與 INT 10\AX=4F01h (8.01-36) 後相同 DX – 指向影片記憶體中對映區域的指標(僅在 BH = 01h 後)

註釋 1:影片記憶體中對映區域的位置以粒度單位表示。一個粒度單位的大小不是固定的,但它以千位元組為單位給出,在表 A.10-7 中偏移量為 04h 的字中,由 INT 10\AX=4F01h 函式 (8.01-36) 返回。

註釋 2:INT 10\AX=4F05h 函式也可以透過 CALL FAR 命令 (7.03-08) 呼叫,該命令的地址在表 A.10-7 中偏移量為 0Ch 的雙字中給出。

註釋 3:透過“視窗”傳送到影片記憶體的資料的解釋取決於表 A.10-7 中位元組 1Bh 指定的模型型別。除此之外,某些模型型別允許解釋的變體。例如,圖形 EGA 模型實現了 3 種解釋模式

模式 00h — 每個位元組 8 個畫素 — 用於根據位掩碼和顏色掩碼覆蓋畫素值;
模式 01h 用於從一個影片記憶體地址複製到另一個影片記憶體地址,只考慮地址;
模式 02h 用於用傳送位元組的 4 個最低有效位定義的顏色填充 8 個連續的畫素。

表 A.14-1 的註釋 3 和 4 中描述了一些更改模型型別和解釋模式的機會。

8.01-40 INT 10\AX=4F06h – 顯示行的邏輯長度

[編輯 | 編輯原始碼]

INT 10\AX=4F06h 函式允許將顯示行的邏輯長度設定為 2 的整數次冪或其倍數。因此,一些可承受的有效影片記憶體容量損失換來了座標計算的簡單性和速度的顯著提高。此函式在文字影片模式和圖形影片模式下同樣適用。

準備:AX = 4F06h BL = 00h - 設定邏輯行畫素長度 = 01h - 獲取顯示行的實際長度 = 02h - 設定邏輯行位元組長度 = 03h - 獲取顯示行的最大長度 CX - 行長度(僅限於 BL=00h 和 BL=02h) 返回:AL = 4Fh - 任何其他值表示該功能不支援 AH - 終止程式碼,與 INT 10\AX=4F01h 後的程式碼相同 (8.01-36) BX - 邏輯行位元組長度 CX - 邏輯行畫素長度 DX - 指定長度的螢幕行的最大可用數量。

注意 1:實際行長度可能超過標稱值,但不能超過特定顯示卡的最大值。如果請求的行長度小於當前影片模式的標稱行長度,則實際行長度可能會取最接近的可接受值,不一定等於請求的行長度。

8.01-41 INT 10\AX=4F07h - 控制顯示的影片記憶體部分

[編輯 | 編輯原始碼]

INT 10\AX=4F07h 函式可實現螢幕滾動,以及在可用影片記憶體空間內切換到其他螢幕頁。此功能在文字和圖形影片模式下同樣適用。

準備:AX = 4F07h BX = 0000h - 立即設定顯示部分的新起始位置 = 0001h - 獲取顯示部分的起始位置 = 0080h - 在場重繪間隔期間設定新的起始位置 CX - 一行中最左邊的畫素編號(對於 BX = 0001h 不需要) DX - 第一顯示行的編號(對於 BX = 0001h 不需要)

返回:AL = 4Fh - 任何其他值表示該功能不支援 AH - 終止程式碼,與 INT 10\AX=4F01h 後的程式碼相同 (8.01-36) CX - 一行中最左邊的畫素編號(僅限於 BX = 0001h 後) DX - 第一顯示行的編號(僅限於 BX = 0001h 後)。

8.01-42 INT 11 - 獲取裝置列表

[編輯 | 編輯原始碼]

準備:無

返回:AX - 裝置列表字。解釋見附錄 A.11-1。

注意 1:在保護模式或 V86 模式下執行時,CPU 可能會在出現未對齊異常時為 INT 11 處理程式生成呼叫,即提供運算元地址不是運算元長度的倍數。僅在第三(最低)特權級別執行未對齊監控,如果標誌暫存器中的位 12h 和控制暫存器 CR0 中的位 12h 都設定為 TRUE 狀態(參見 A.11-4 的注意 6)。使用未對齊監控的程式必須在保護模式的中斷表中攔截對 INT 11 處理程式的呼叫。

8.01-43 INT 12 - 1 Mb 以下傳統 RAM 的大小

[編輯 | 編輯原始碼]

準備:無

返回:AX - 傳統 RAM 的大小(以 KB 為單位)(參見注意 2 和 3)

注意 1:INT 12 處理程式從 BIOS 資料區 (A.01-1) 地址 0040:0013h 的字中讀取傳統 RAM 的大小。此外,RAM 大小儲存在 CMOS RAM 單元 15h 和 16h 中(參見 A.14-1 的注意 1)。

注意 2:INT 12 處理程式不會報告 PC 的 RAM 超過 1 Mb 邊界,但這些資料由函式 INT 15\AH=88h、INT15\AX=E801h 和 INT15\AX=E820h 報告。

注意 3:整個 RAM 大小包括未釋放或無法訪問的記憶體(16 位定址)。INT 21\AH=48h 函式報告了可由 DOS 分配給程式的可用傳統 RAM 的大小(參見 8.02-50 的注意 1)。

8.01-44 INT 13\AH=00h\0Dh - 磁碟控制器復位

[編輯 | 編輯原始碼]

復位操作強制磁碟控制器用從指定磁碟驅動器引數表中讀取的資料重新填充其內部暫存器 (A.08-2、A.13-1)。每次訪問硬碟或軟盤失敗後都必須進行復位操作,只有在復位後才能重複訪問嘗試。

準備:AH = 00h - 應用於軟盤控制器 = 0Dh - 應用於硬碟控制器 DL - 磁碟驅動器編號(參見注意 1) 返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注意 1:軟盤驅動器的編號是從 0 開始的:00h - 第一個,01h - 第二個,依此類推。硬碟的編號從 80h 開始:80h - 第一個,81h - 第二個,依此類推。磁碟驅動器(物理磁碟)的編號與邏輯磁碟的字母名稱無關:每個物理硬碟可能包含多個邏輯磁碟。

注意 2:如果兩個磁碟驅動器連線到一個控制器,則復位操作會導致兩個磁碟驅動器中的磁頭移至零道(重新校準)。當不需要控制器的復位時,應透過呼叫 INT 13\AH=11h 函式啟動重新校準(所有其他規範相同)。

8.01-45 INT 13\AH=01h - 上次磁碟操作的狀態

[編輯 | 編輯原始碼]

準備:AX = 0100h DL - 磁碟驅動器編號(參見 8.01-44 的注意 1) 返回:AH - 狀態程式碼 (A.06-1)

注意 1:一些過時的 BIOS 版本在 AL 中返回狀態程式碼。

8.01-46 INT 13\AH=02h - 將磁碟扇區(s)讀入記憶體

[編輯 | 編輯原始碼]

準備:AH = 02h AL - 要讀取的扇區數量(參見注意 1) CH - 柱面(磁軌)編號的低 8 位 CL - 位 0-5:起始扇區編號(從 1 到 63),- 位 6-7:柱面(磁軌)編號的兩位最高位 DH - 磁頭編號(參見注意 2) DL - 磁碟驅動器編號(參見 8.01-44 的注意 1) ES:BX - 指向要讀取資料的緩衝區的指標 返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。AL - 實際讀取的扇區數量(參見注意 5) ES:BX - 指向已填充的緩衝區,該緩衝區包含從磁碟讀取的資料。

注意 1:AL 暫存器中指定的扇區數量不能為零。一些過時的 BIOS 版本不允許 AL 中的值超過當前磁軌上的剩餘扇區數量(有關詳細資訊,請參見文章 4.22)。

注意 2:一些過時的 BIOS 版本僅接受 DH 中的 4 位最低位,因此最多隻能指定 16 個磁頭。帶有資料塊 A.13-1 中籤名 A0h 的現代 BIOS 系統接受轉換後的 CHS 引數,允許最多 256 個磁頭。在任何情況下,INT 13\AH=08h 函式都會報告任何特定磁碟驅動器的最大引數值 (8.01-49)。

注意 3:當從軟盤讀取失敗時,之後應重複至少兩次讀取嘗試,並在每次下一次嘗試之前對軟盤控制器進行復位 (8.01-44)。

注意 4:在 Windows 作業系統下,禁止透過 INT 13 函式直接訪問磁碟,除非使用 LOCK 操作對目標磁碟進行鎖定以防止併發訪問(參見 INT 21\AX=440Dh 的注意 2)。

注意 5:一些過時的 BIOS 版本不會在 AL 暫存器中返回實際讀取的扇區數量。在發生讀取錯誤(錯誤程式碼 AH = 11h)時,現代 BIOS 系統會在 AL 暫存器中返回已更正的資料塊的長度。

注意 6:INT 13\AH=0Ah 函式(所有其他規範相同)會讀取硬碟的扇區(s),以及包含 4 到 7 個位元組的錯誤糾正程式碼的 22 位元組“尾部”。INT 13\AH=0Ah 函式不會糾正錯誤,並在遇到第一個損壞的扇區後停止讀取。

8.01-47 INT 13\AH=03h - 將資料寫入磁碟的扇區(s)。

[編輯 | 編輯原始碼]

準備:AH = 03h AL - 要寫入的扇區數量(必須非零)CH、CL、DH、DL - 與 INT 13\AH=02h (8.01-46) 相同 ES:BX - 指向要寫入資料的緩衝區的指標 返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。AL - 實際寫入的扇區數量

注 1:INT 13\AH=02h 函式的注 1-4 (8.01-46) 同樣適用於 INT 13\AH=03h 函式。

注 2:可以使用 INT 13\AH=04h 函式 (所有其他規格相同) 驗證寫入的資料與緩衝區內容是否一致。

注 3:可以使用 INT 13\AH=0Bh 函式 (所有其他規格相同) 將帶有 ECC (錯誤糾正碼) 的扇區寫入 HDD。

8.01-48 INT 13\AH=05h - 磁軌的低階格式化

[編輯 | 編輯原始碼]

低階格式化只能應用於沒有內在磁軌結構的介質。因此,INT 13\AH=05h 函式可以應用於軟盤,但不能應用於現代 HDD:它們的原始磁軌結構可能會因低階格式化而損壞。

格式化引數表必須事先透過 INT 10\AH=18h 函式 (8.01-54) 在 PC 的記憶體中準備。對於過時的軟盤型別,類似的表由 INT 10\AH=17h 函式準備。特別是,指向軟盤格式化引數表的指標儲存在 0000:0078h 記憶體單元 (A.08-2) 中。

準備:AH = 05h AL - 要格式化的扇區數量 CH - 磁軌號 DH - 磁頭號 DL - 磁碟驅動器號 (注 1 至 8.01-44) ES:BX - 指向資料緩衝區的指標,該緩衝區包含磁軌中每個扇區的 4 個位元組:第一個 - 磁軌號,第二個 - 磁頭號,第三個 - 扇區號,第四個 - 扇區大小 (00h、01h、02h、03h 分別對應於每扇區 128、256、512、1024 位元組的大小)。

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:在 ES:DX 指向的資料塊中,磁軌和磁頭的計數為從零開始,扇區的計數為從一開始。

注 2:扇區號、磁頭號和磁軌號的最大值應由 INT 13\AH=08h 函式 (8.01-49) 確定。雖然物理值可能不同,但返回的最大值反映了這些轉換 (A.13-1),這些轉換可能由特定計算機的 BIOS 系統應用於磁碟引數。

8.01-49 INT 13\AH=08h - 確定驅動器的引數

[編輯 | 編輯原始碼]

準備:AH = 08h DL - 磁碟驅動器號 (注 1 至 8.01-44)

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後:BL - 驅動器型別 (僅限於可移動介質驅動器):= 01h - 360 kb 軟盤驅動器,= 02h - 1.2 Mb 軟盤驅動器,= 03h - 720 kb 軟盤驅動器,= 04h - 1.44 Mb 軟盤驅動器,= 06h - 2.88 Mb 軟盤驅動器,= 10h - 任何其他型別的驅動器。CH - 最大柱面 (磁軌) 號的 8 個最低有效位 CL - 位 0-5:最大扇區號 (從 1 到 63),- 位 6-7:最大柱面號的最高有效位 DH - 最大磁頭號 DL - 同類型附加驅動器的數量 (注 2) ES:DI - 指向引數表的指標 A.08-2 (僅限於軟盤驅動器返回)。

注 1:即使請求的驅動器不存在,也可能會返回成功終止狀態 (AH = 00h)。為了確定返回資料的有效性,必須檢查 CF 標誌的狀態和 DL 暫存器中返回的數字。

注 2:某些 BIOS 系統無法在 DL 暫存器中返回大於 2 的數字。應透過 INT 13\AH=15h 函式 (8.01-52) 單獨檢查是否存在更多驅動器的疑慮。

注 3:表 A.13-1 中偏移量為 03h 的位元組中的簽名 A0h 表示對於 HDD,INT 13\AH=08h 函式返回的不是物理 CHS 引數,而是轉換後的 CHS 引數。在這種情況下,僅應在計算 INT 13\AH=02h - INT 13\AH=18h (8.01-46 - 8.01-54) 函式的請求值時考慮這些轉換後的 CHS 引數。

8.01-50 INT 13\AH=0Ch - 將磁碟驅動器的磁頭移動到所需的磁軌

[編輯 | 編輯原始碼]

準備:AH = 0Ch CH、CL、DH、DL - 與 INT 13\AH=02h (8.01-46) 相同

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

8.01-51 INT 13\AH=10h - 檢查 HDD 是否已準備好

[編輯 | 編輯原始碼]

INT 13\AH=10h 函式返回的狀態程式碼表示請求的 HDD 是否存在以及它是否已準備好執行下一個任務。

準備:AH = 10h DL - 驅動器號 (80h = 第一個 HDD,81h = 第二個 HDD,依此類推) 返回:AH - 狀態位元組 (表 A.06-1)。CF 標誌的清除狀態表示成功終止。CF 標誌的設定狀態表示錯誤。

8.01-52 INT 13\AH=15h - 磁碟驅動器型別檢查

[編輯 | 編輯原始碼]

準備:AH = 15h DL - 磁碟驅動器號 (注 1 至 8.01-44) 返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後:AH - 磁碟驅動器型別:= 00h - 請求的驅動器不存在;= 01h - 沒有媒體變更線路支援的軟盤驅動器;= 02h - 任何具有可移動媒體變更線路支援的驅動器 = 03h - 固定磁碟驅動器 (HDD)。CX:DX - 512 位元組扇區的 4 位元組數量 (僅限於 HDD 返回)。

注 1:具有可移動媒體的 HDD 可能被歸類為型別 01h 或 02h。

注 2:INT 13\AH=15h 函式不依賴於儲存的資料,它掃描控制器的匯流排以獲取新的有效資料。

8.01-53 INT 13\AH=16h - 媒體變更檢測

[編輯 | 編輯原始碼]

準備:AH = 16h DL - 磁碟驅動器號 (注 1 至 8.01-44) 返回:如果磁碟未發生更改,則 CF 標誌被清除,AH = 00h;如果 CF 標誌被設定,AH = 06h,則磁碟已發生更改;如果 CF 標誌被設定,但 AH 具有任何其他值,則此值應根據表 A.06-1 解釋為返回程式碼。

注 1:在向 INT 13\AH=16h 函式傳送有關未知磁碟驅動器的請求之前,必須使用 INT 13\AH=15h 函式調查該磁碟驅動器是否支援媒體變更線路。

注 2:大多數磁碟驅動器型號中的媒體變更線路透過開啟 (或關閉) 磁碟插槽蓋來啟用,即使磁碟變更事件實際上沒有發生。

注 3:每個媒體變更事件只報告一次:呼叫 INT 13\AH=16h 函式後,媒體變更標誌被清除到其原始狀態。

注 4:擴充套件媒體變更函式 INT 13\AH=49h (具有相同的其他規格) 可應用於任何磁碟驅動器,包括物理編號為 80h 及更高的 CD 驅動器。應透過 INT 13\AH=41h 函式 (8.01-55) 確認 BIOS 對這些擴充套件功能的支援。

8.01-54 INT 13\AH=18h - 設定格式化的媒體型別

[編輯 | 編輯原始碼]

準備:AH = 18h CH、CL、DH、DL - 與 INT 13\AH=02h (8.01-46) 相同

返回:AH - 狀態程式碼:= 00h - 請求的引數受支援;= 01h - 請求的功能不可用;= 0Ch - 當前磁碟型別不受支援或未知;= 80h - 驅動器中不存在可移動媒體。ES:DI - 指向軟盤驅動器引數表的指標 A.08-2

注 1:INT 13\AH=18h 函式不會將返回的指向軟盤驅動器引數表的指標寫入記憶體地址 0000:0078h,也稱為 INT 1E 向量 (A.12-1)。INT 1E 向量的準備被認為是呼叫者的責任。

注 2:當應用於 HDD 時,INT 13\AH=18h 函式返回 CF 標誌設定和狀態程式碼 AH = 01h。對於過時的 5.25" 軟盤和 720 kb 軟盤,應改為應用 INT 13\AH=17h 函式。

8.01-55 INT 13\AH=41h - INT 13 擴充套件檢查

[edit | edit source]

由於 INT 13 擴充套件,自 1997 年以來,現代計算機的許多常用功能已經實現,特別是從 CD-ROM 啟動 PC 的可能性和對大型硬碟的 LBA定址(參見 A.13-6 的注 4)。

準備:AH = 41h BX = 55AAh DL – 磁碟驅動器號(參見 8.01-44 的注 1)

返回:出錯時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後:AH – INT 13 擴充套件版本:= 01h – 版本 1.x,= 20h – 版本 2.0,= 21h – 版本 2.1。BX = AA55h 簽名確認支援 INT 13 擴充套件 CX – API 子集字的位表示對函式的支援:位 0 – INT 13\AH=42h–44h,47h,48h;位 1 – INT 13\AH=45h,46h,48h,49h, INT 15\AH=52h;位 2 – INT 13\AH=48h,4Eh;位 3 – 擴充套件磁碟地址包支援(參見注 2)

注 1:AL 和 DH 暫存器中的資料在返回時可能會丟失。

注 2:所有版本的 INT 13 擴充套件都支援對容量高達 127 Gb 的磁碟進行 10 位元組包定址。除此之外,對 20 位元組擴充套件磁碟地址包的支援能夠實現超過 127 Gb 的定址。10 位元組和 20 位元組地址包的結構如附錄 A.13-4 所示。

8.01-56 INT 13\AH=42h – 擴充套件磁碟讀取函式

[edit | edit source]

準備:AH = 42h DL – 磁碟驅動器號(參見 8.01-44 的注 1)DS:SI – 指向磁碟地址包的指標 (A.13-4)

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:返回時,成功讀取的資料塊數量被寫入磁碟地址包偏移量 02h 處的字中。

注 2:指向包含讀取資料的緩衝區的指標由磁碟地址包偏移量 04h 處的雙字表示。

注 3:軌跡尋道函式 INT 13\AH=47h 在之前使用相同的其他規範啟動,允許 CPU 在磁碟驅動器將磁頭移動到指定軌道時執行大量工作。適當地使用軌跡尋道函式使實際訪問特定軌道變得更快。

8.01-57 INT 13\AH=43h – 擴充套件磁碟寫入函式

[edit | edit source]

準備:AH = 43h AL – 標誌:= 00h – 跳過驗證過程,= 02h – 驗證寫入的資料。DL – 磁碟驅動器號(參見 8.01-44 的注 1)DS:SI – 指向磁碟地址包的指標 (A.13-4)

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:指向要寫入資料的緩衝區的指標由磁碟地址包偏移量 04h 處的雙字表示。

注 2:返回時,成功寫入(或成功驗證)的資料塊數量儲存在磁碟地址包偏移量 02h 處的字中。

注 3:INT 13 擴充套件的版本 1.x 使用標誌 AL = 01h 來驗證寫入的資料。如果請求驗證,但不受支援,則 INT 13\AH=43h 函式返回標誌 CF 被置位,AH = 01h(無效函式)。

注 4:可以透過 INT 13\AH=44h 單獨啟動驗證;其他規範相同,除了 AL 中的值被忽略。

8.01-58 INT 13\AH=45h – 鎖定/解鎖驅動器

[edit | edit source]

一些磁碟處理過程,被外部訪問請求中斷,可能會造成嚴重的資料丟失。典型的例子是碎片整理。在碎片整理進行時,必須阻止對目標磁碟的外部訪問嘗試。被阻止後,可移動磁碟無法從其驅動器中彈出。在多工環境中阻止磁碟可以避免併發干預。允許最多 255 級巢狀過程,這些過程需要對磁碟進行獨佔訪問。完成其工作後,每個這樣的過程都必須使用解鎖操作釋放目標磁碟。

準備:AX – 子函式:= 4500h – 鎖定驅動器中的介質:將鎖定級別增加 1 = 4501h – 解鎖介質:將鎖定級別減少 1 = 4502h – 報告介質鎖定級別 DL – 磁碟驅動器號(參見 8.01-44 的注 1)

返回:出錯時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AL – 介質鎖定級別(= 00h 如果已解鎖)

8.01-59 INT 13\AH=46h – 彈出可移動介質

[edit | edit source]

準備:AX = 4600h DL – 磁碟驅動器號(參見 8.01-44 的注 1)返回:出錯時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:在彈出之前,INT 13\AH=46h 處理程式呼叫 INT 15\AH=52h 函式,以確保當前指定介質未參與與快取緩衝區或多工環境中的其他程式進行資料傳輸。

8.01-60 INT 13\AH=48h – 請求驅動器的引數

[edit | edit source]

準備:AH = 48h DL – 磁碟驅動器號(參見 8.01-44 的注 1)DS:SI – 指向資料緩衝區的指標。緩衝區中的第一個字必須宣告其可用長度,不小於:001Ah – 對於 INT 13 擴充套件版本 1.x,001Eh – 對於 INT 13 擴充套件版本 2.x,0049h – 對於 INT 13 擴充套件版本 3.x。

返回:出錯時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後:DS:SI – 指向填充有資料表 A.13-2 的緩衝區的指標。

注 1:如果實際指定的長度對應於更舊的版本,則較新的版本會根據指定長度的格式截斷返回的表。

8.01-61 INT 13\AX=4A00h – 從 CD 模擬驅動器

[edit | edit source]

此函式安排一個虛擬邏輯磁碟,該磁碟從儲存在光碟或 DVD 光碟中的磁碟映像中複製。準備:AX = 4A00h DS:SI – 指向啟動規範包 A.15-1 的指標

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:INT 13\AX=4C00h 函式接受相同的其他規範(除了 AX),並執行相同的操作,但隨後繼續從安排的虛擬磁碟啟動 PC。

8.01-62 INT 13\AH=4Bh – 驅動器模擬子函式

[edit | edit source]

準備:AH = 4Bh AL – 子函式:= 00h – 終止磁碟模擬 = 01h – 獲取模擬狀態 DL – 模擬的磁碟號(參見 8.01-44 的注 1)DS:SI – 指向用於啟動資料包的 13 位元組緩衝區的指標

返回:出錯時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後:DS:SI – 指向填充有啟動資料包 A.15-1 的緩衝區的指標。

注 1:給定 DL = 7Fh 後,子函式 AL = 00h 會終止所有當前模擬。

注 2:如果未執行模擬,則返回 CF 標誌的清除狀態。

8.01-63 INT 13\AH=4Dh – 讀取光碟扇區

[edit | edit source]

準備:AX = 4D00h DS:SI – 指向命令包的指標 (A.15-2)

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:返回的資料被寫入準備好的緩衝區。指向此緩衝區的指標必須由命令包偏移量 02h 處的雙字指定 (A.15-2)。

注 2:INT 13\AH=4Dh 函式最常用於讀取光碟的引導目錄。引導目錄結構如表 A.15-3 所示。

8.01-64 INT 13\AH=4Eh – 控制驅動器的硬體

[edit | edit source]

準備:AH = 4Eh AL - 子功能:= 00h - 啟用預取(讀取到驅動器緩衝區)= 01h - 停用預取 = 02h - 設定最大 PIO 資料傳輸模式 = 03h - 設定 PIO 資料傳輸模式 0 = 04h - 設定預設 PIO 資料傳輸模式 = 05h - 啟用 INT 13 DMA 最大模式 = 06h - 停用 INT 13 DMA 資料傳輸 DL - 磁碟驅動器編號(注意 1 到 8.01-44)

返回:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌清除表示成功終止,然後:AL = 00h - 命令隻影響指定的驅動器 = 01h - 其他裝置也受到影響(注意 2)

注意 1:DMA 和 PIO 資料傳輸模式是互斥的。選擇 DMA 會停用 PIO,選擇 PIO 會停用 DMA。

注意 2:資料傳輸模式的更改可能會影響連線到相同控制器的其他裝置。

8.01-65 INT 14\AH=00h - 初始化序列埠

[編輯 | 編輯原始碼]

準備:AH = 00h AL - 資料傳輸引數:位 7–5:值從 000b 到 111b 分別對應於資料速率 110、150、300、600、1200、2400、4800、9600 位元每秒 位 4–3:00b 或 10b - 無奇偶校驗,01b - 奇校驗,11b - 偶校驗。位 2:如果清除 - 1 個停止位,如果設定 - 2 個停止位。位 1–0:值從 00b 到 11b 分別對應於資料字長 5、6、7、8 位。DX - 序列埠號 (0000h–0003h) 返回:AH - 線路狀態位元組 (A.14-2) AL - 調變解調器的狀態,如果它連線到請求的埠。

8.01-66 INT 14\AH=01h - 向序列埠傳送一個字元

[編輯 | 編輯原始碼]

準備:AH = 01h AL - 要傳送的字元 DX - 序列埠號 (0000h–0003h) 返回:AH - 線路狀態位元組 (A.14-2)

注意 1:傳輸錯誤由返回狀態位元組中位 7 的置位狀態標記:這意味著等待響應的時間超過了預設的時間限制(超時)。

8.01-67 INT 14\AH=02h - 從序列埠讀取一個字元

[編輯 | 編輯原始碼]

準備:AX = 0200h DX - 序列埠號 (0000h–0003h) 返回:AH - 線路狀態位元組 (A.14-2) AL - 接收到的字元,如果返回線路狀態位元組中位 7 清除。

8.01-68 INT 14\AH=03h - 獲取序列埠狀態

[編輯 | 編輯原始碼]

準備:AX = 0300h DX - 序列埠號 (0000h–0003h) 返回:AH - 線路狀態位元組 (A.14-2) AL - 調變解調器的狀態,如果它連線到請求的埠。

8.01-69 INT 15\AH=52h - 查詢驅動器是否繁忙

[編輯 | 編輯原始碼]

INT 15\AH=52h 函式報告驅動器當前是否正在進行資料傳輸。INT 15\AH=52h 函式特別由 INT 13\AH=46h 處理程式呼叫,以防止在資料傳輸過程未完成時彈出可移動介質。

準備:AH = 52h DL - 磁碟驅動器編號(注意 1 到 8.01-44) 返回:如果 CF 標誌置位,則驅動器繁忙,AH 返回錯誤程式碼(A.06-1)。CF 標誌清除表示請求的驅動器不繁忙。

注意 1:在應用 INT 15\AH=52h 函式之前,應透過呼叫 INT 13\AH=41h 檢查 BIOS 是否支援此函式。

注意 2:預設情況下,BIOS 為 INT 15\AH=52h 安裝一個虛擬處理程式,該處理程式始終返回 CF 標誌清除。響應將反映驅動器流量的實際狀態,當對 INT 15\AH=52h 函式的呼叫被磁碟快取驅動程式安裝的另一個處理程式攔截時。

8.01-70 INT 15\AX=5301h - 啟用 APM 真實模式介面

[編輯 | 編輯原始碼]

當計算機開機時,其電源管理系統 (APM) 處於非活動狀態。當 CPU 處於真實模式時,可以透過呼叫 INT 15\AX=5301 函式來啟動 APM 介面啟用。

準備:AX = 5301h BX = 0000h(BIOS 的 APM 擴充套件識別符號) 返回:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌清除表示成功終止。

注意 1:INT 15\AX=5301h 函式強制 APM 系統模擬 APM 版本 1.0 的規範。為了執行未定義為 APM 版本 1.0 的操作,應透過 INT 15\AX=530Eh 函式(8.01-72)強制模擬較新的 APM 版本。

8.01-71 INT 15\AX=5307h - 切換電源模式

[編輯 | 編輯原始碼]

ATX 外形尺寸的計算機可以透過機器命令關閉,將電源塊切換到待機模式。然後僅為那些使 PC 開機機會的模組供電。當然,電源塊的待機模式必須由電源塊本身和 PC 主機板硬體支援。

準備:AX = 5307h BX = 0001h(所有 APM 控制裝置的識別符號)CX = 0003h(關閉請求程式碼) 返回:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。成功時,其餘部分無關緊要。

注意 1:關閉操作由 APM 版本 1.2 的規範定義。如果 APM 系統模擬版本 1.0(注意 1 到 8.01-70),則應透過 INT 15\AX=530Eh 函式(8.01-72)解除關閉 PC 的機會。

注意 2:在過時的 AT 外形尺寸的計算機中,允許呼叫 INT 15\AX=5307h 函式,但會被忽略。

8.01-72 INT 15\AX=530Eh - APM 版本模擬請求

[編輯 | 編輯原始碼]

為了保持與作業系統的相容性,較新的 APM 版本的規範規定了模擬以前 APM 版本的機會。那個要控制電源管理的程式或那個作業系統,可以請求模擬所需的 APM 版本。響應中,APM BIOS 模擬請求的或最近的可行 APM 版本,並返回該版本的編號。進一步的電源管理必須根據實際模擬的 APM 版本執行。

準備:AX = 530Eh BX = 0000h(BIOS 的 APM 擴充套件識別符號)CX - 請求的 APM 版本模擬(注意 1) 返回:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌清除表示成功終止,然後 AX - 實際模擬的 APM 版本(注意 1)。

注意 1:APM 版本號的整數部分和小數部分必須分別指定在 CX 暫存器的單獨位元組中。例如,對於版本 1.2 請求,應指定 CX = 0102h 值。返回的 AX 版本號符合相同的格式。

注意 2:版本模擬請求由 APM 版本 1.1 的規範定義。如果版本模擬請求返回錯誤程式碼 80h 或 86h,而 INT 15\AX=5301h(8.01-70)函式已成功終止,則表示這臺計算機僅實現 APM 版本 1.0。

8.01-73 INT 15\AH=83h,86h - BIOS 定時器控制

[編輯 | 編輯原始碼]

準備:AX – 子功能:= 8300h – 初始化延遲計數並讓呼叫者繼續執行 = 8301h – 停止計數會話(CX、DX、ES:BX 被忽略) = 8600h – 初始化延遲計數並掛起呼叫者程序直到延遲計數過期(AL 和 ES:BX 被忽略) CX – 32 位延遲的最顯著 16 位(以微秒為單位) DX – 32 位延遲的最低顯著 16 位(以微秒為單位) ES:BX – 指向標記位元組的指標:當延遲計數過期時,其最顯著的第 7 位被置位(注 3)。

返回時:CF 標誌的清除狀態表示成功終止。CF 標誌在錯誤或計數會話尚未啟動時被置位,然後 AH 暫存器返回錯誤程式碼(A.06-1)。

注 1:時間段最可能的解析度是 977 微秒。

注 2:一些過時的 BIOS 版本不支援子功能 8301h。

注 3:標記位元組的預設地址為 0040:00A0h(A.12-1)。當延遲計數過期時,一些 BIOS 版本會將標記位元組的值分配為 80h。

注 4:在 Windows 作業系統下,BIOS 定時器無法從“DOS 框”訪問。

8.01-74 INT 15\AH=84h – 讀取操縱桿狀態

[編輯 | 編輯原始碼]

準備:AH = 84h DX – 子功能:= 0000h – 讀取開關狀態 = 0001h – 讀取位置感測器的訊號

返回時:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止,然後

  • DX=0000h 子功能在 AL 暫存器的位 4–7 中返回開關狀態;
  • DX=0001h 子功能返回以下資料

AX – 第一個操縱桿的 X 座標值
BX – 第一個操縱桿的 Y 座標值
CX – 第二個操縱桿的 X 座標值
DX – 第二個操縱桿的 Y 座標值

注 1:位置感測器的典型電阻為 250 kOhm,座標值的典型限制範圍為 0000h–01A0h。

注 2:暗示操縱桿是透過遊戲埠連線的。如果特定 PC 中沒有遊戲埠,則子功能 DX=0001h 返回零座標值,子功能 DX=0000h 返回 AL=00h,相當於開關的斷開狀態。

8.01-75 INT 15\AH=85h – PrintScreen 鍵活動鉤子

[編輯 | 編輯原始碼]

INT 15\AH=85h 函式由 INT09 處理程式響應使用者的 PrtScr 鍵擊呼叫。暗示應該由顯示卡驅動程式安裝 INT 15\AH=85h 函式的處理程式,以實現基於特定顯示卡的特定資源的增強 Print Screen 過程。但直到該特定處理程式未安裝之前,BIOS 的虛擬處理程式只會將控制權返回給呼叫程式,就像其請求已得到滿足一樣。

準備:AH = 85h AL = 00h – 當按下 PrintScreen 鍵時啟動過程 = 01h – 當釋放 PrintScreen 鍵時啟動過程 CF 標誌必須事先被清除

返回時:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態和 AH = 00h 表示成功終止。

8.01-76 INT 15\AH=87h – 複製並訪問擴充套件記憶體

[編輯 | 編輯原始碼]

INT 15\AH=87h 函式在 16 Mb 地址空間內複製資料塊。資料塊的最大大小為 64 kb。複製是在保護模式下執行的,同時停用外部中斷,因此無需為保護模式準備中斷表。但是需要 GDT 表,並且應該根據以下模板進行準備

保留描述符:00 00 00 00 00 00 00 00
保留描述符:00 00 00 00 00 00 00 00
源段描述符:ss ss aa aa aa 93 00 00
目標段描述符:ss ss dd dd dd 93 00 00
保留描述符:00 00 00 00 00 00 00 00
保留描述符:00 00 00 00 00 00 00 00

在顯示的模板中,字母“a”表示源段的線性地址欄位,字母“d”表示目標段的線性地址欄位,字母“s”表示源段和目標段的大小欄位。由於資料塊的大小由 CX 暫存器中的雙位元組字數量指定,因此兩個段的大小(以位元組為單位)必須不小於 (2*CX) –1。在大小欄位和地址欄位中,第一個是最不顯著位元組;最顯著位元組是最後指定的。源段描述符和目標段描述符中的屬性位元組必須為 93h。描述符結構的更詳細說明在附錄 A.12-2 中給出。

最初填充為零的保留描述符將由 INT 15\AH=87h 處理程式填充資料,並在保護模式下使用。複製完成後,INT 15\AH=87h 處理程式將 CPU 切換回真實模式並恢復原始狀態,以繼續執行呼叫程式的執行。

準備:AH = 87h CX – 要複製的字數,不超過 7FFFh ES:SI – 指向準備好的 GDT 表的第一個位元組的指標

返回:發生錯誤時,CF 標誌被設定,AH 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注 1:由於複製期間停用外部中斷,因此一些外部中斷呼叫可能會被遺漏。如果透過 HIMEM.SYS 驅動程式(A.12-4)安排了超出常規記憶體的複製,則這種情況不會發生。

注 2:HIMEM.SYS 驅動程式會攔截 INT 15\AH=87h 呼叫,並不會直接訪問原始 BIOS 的處理程式。但是,如果該區域由 /INT15 引數(5.04-01)保留,則程式可能會被允許透過 INT 15\AH=87h 呼叫訪問擴充套件記憶體的有限區域。

8.01-77 INT 15\AH=88h – 擴充套件記憶體大小,最大為 16 Mb

[編輯 | 編輯原始碼]

準備:AH = 88h 返回時:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AX – 超過 1024 kb 的擴充套件記憶體大小(以 KB 為單位)。

注 1:如果有效地址空間是間斷的,則將報告其從 100000h(1024 kb)到第一個間隙的連續部分的大小。

注 2:INT 15\AH=88h 處理程式從 BIOS 的 CMOS 資料庫的單元 30h 和 31h 讀取擴充套件記憶體大小。

注 3:HIMEM.SYS 和 EMM386.EXE 驅動程式會攔截 INT 15\AH=88h 函式的預設 BIOS 處理程式。

注 4:有關超過 16 Mb 的擴充套件記憶體的資訊可以透過 INT 15\AX=E801h\E881h(8.01-79)和 INT 15\AX=E820h(8.01-80)報告。

8.01-78 INT 15\AH=89h – 將 CPU 切換到保護模式

[編輯 | 編輯原始碼]

INT 15\AH=89h 處理程式將 CPU 切換到保護模式,並執行保護模式下執行的最緊急的準備工作,包括用段選擇符填充段暫存器,並根據保護模式規範重新程式設計中斷控制器。

為了確保呼叫程式在將 CPU 切換到保護模式後繼續執行,應該事先準備保護模式的中斷表(IDT)和全域性描述符表(GDT)。IDT 填充了 8 位元組描述符(“門”),指定了保護模式處理程式的地址和呼叫條件。IDT 表本身的大小和線性地址必須寫入 GDT 表中的 IDT 段描述符。

為 INT 15\AH=89h 處理程式準備的 GDT 表包含 8 個描述符,每個描述符 8 位元組長。GDT 表中描述符的排列必須與以下模板相對應

保留描述符:00 00 00 00 00 00 00 00
GDT 段描述符:3F 00 aa aa aa 00 00 00
IDT 段描述符:FF 03 aa aa aa F2 00 00
DS 段描述符:ss ss aa aa aa 92 0s aa
ES 段描述符:ss ss aa aa aa 92 0s aa
SS: 段描述符 ss ss aa aa aa 92 0s aa
CS: 段描述符 ss ss aa aa aa 9A 0s 00
保留描述符:00 00 00 00 00 00 00 00

在顯示的模板中,字母“a”表示每個段的線性地址欄位,字母“s”表示段大小欄位。保留描述符必須填充為零。作為示例,模板顯示屬性位元組的特定值,以及 GDT 和 IDT 段的特定大小。描述符結構的更詳細說明在附錄 A.12-2 中給出。

準備:AH = 89h BL – IRQ 0 的中斷號(注 2) BH – IRQ 8 的中斷號(注 2) ES:SI – 指向 GDT 表的第一個位元組的指標

返回時:出錯時 CF 標誌被置位,AH 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AH = 00h,段暫存器填充了段選擇符,中斷控制器被重新程式設計。BP 暫存器中的前一個值可能會被更改。

注 1:GDT 表中的 CS 段描述符必須只指定由真實模式中的 CS 段地址定義的段。該條件確保在保護模式下,從呼叫 INT 15\AH=89h 處理程式的命令之後繼續執行呼叫程式的執行。

注 2:分配給 BL 和 BH 暫存器的中斷號必須是 8 的倍數(三位最不顯著位必須被清除)。在 BL 暫存器中的值後面的中斷號將被分配給請求線 IRQ 1 – IRQ 7。類似地,在 BH 暫存器中的值後面的中斷號將被分配給請求線 IRQ 9 – IRQ F。選擇重新程式設計的中斷號的一個重要因素是,中斷 00h–1Fh 可能由 CPU 的異常呼叫。

注 3:由於定址格式已更改且中斷控制器已重新程式設計,因此切換到保護模式後,對真實模式中斷處理程式的直接呼叫將被禁止。

8.01-79 INT 15\AX=E801h,E881h – 擴充套件記憶體大小

[編輯 | 編輯原始碼]

準備: AX = E801h 或 AX = E881h 返回: 發生錯誤時,CF 標誌被置位,AH 返回錯誤程式碼 (A.06-1)。CF 標誌清零表示成功終止,此時 AX – 擴充套件記憶體大小(以 KB 為單位),位於 1 MB 到 16 MB 之間的地址空間區域。BX – 擴充套件記憶體大小(以 64 KB 塊為單位),位於 16 MB 之上的地址空間區域。CX – 配置的記憶體大小(以 KB 為單位),位於 1 MB 到 16 MB 之間的地址空間區域。DX – 配置的記憶體大小(以 64 KB 塊為單位),位於 16 MB 之上的地址空間區域。

注意 1: 如果成功終止後 AX = BX = 0000h,則應從暫存器 CX 和 DX 中讀取擴充套件記憶體大小。

注意 2: 與 INT 15\AX=E801h 不同,INT 15\AX=E881h 處理程式能夠返回超過 4 GB 的值。最高位數字儲存在 32 位暫存器 EBX 和 EDX 的位 31-16 中。訪問位 31-16 的方法(適用於真實模式程式)在文章 7.02-06 中描述。

注意 3: INT 15\AX=E801h\E881h 函式不受 1995 年之前開發的舊版 BIOS 支援。

8.01-80 INT 15\AX=E820h – 記憶體分配對映

[編輯 | 編輯原始碼]

記憶體分配對映由一系列 20 位元組的描述符組成,每個描述符對應一個獨立的記憶體區域,用於特定目的。每個描述符以區域首位元組的 8 位元組地址開頭,然後是該區域的 8 位元組長度,最後 4 位元組是該區域的分配程式碼(注意 1)。一次呼叫 INT 15\AX=E820h 函式返回一個描述符;因此需要多次呼叫該函式。對於第一次呼叫,應在 EBX 暫存器中準備零值 (00000000h)。第一次呼叫後,將返回一個非零 EBX 值,定義了下次呼叫的目標描述符。呼叫迴圈的終止以 EBX 暫存器中返回零值或 CF 標誌被置位為標誌。

準備: AX = E820h EBX – 記憶體分配對映中目標描述符的指標 ECX – ES:DI 緩衝區的大小,不小於 20 (=14h) 位元組 EDX = 534D4150h – “SMAP” 簽名 ES:DI – 為描述符準備的緩衝區的指標

返回: 發生錯誤時,CF 標誌被置位,EAX 值不等於 534D4150h,AH 暫存器返回錯誤程式碼 (A.06-1)。CF 標誌清零表示成功終止,此時 EAX = 534D4150h “SMAP” – “SMAP” 簽名 EBX – 記憶體分配對映中下一個描述符的指標 ECX – 返回描述符在 ES:DI 緩衝區中的實際長度 ES:DI – 包含返回描述符的緩衝區的指標

注意 1: 分配程式碼應按如下方式解釋:

01h – 分配給作業系統的記憶體;
02h – 由 BIOS 保留的記憶體(系統 ROM);
03h – ACPI 表區域(讀取後可能釋放);
04h – 用於系統目的的非易失性記憶體。

具有其他分配程式碼的記憶體區域應視為由 BIOS 系統保留。地址空間中不包括在記憶體分配對映中的區間不受硬體支援。

注意 2: 一些 BIOS 版本不忽略 EAX 暫存器中位 31-16 的內容,因此呼叫 INT 15\AX=E820h 函式需要將這些位清零(即 EAX = 0000E820h)。訪問位 31-16 的方法(適用於真實模式程式)在文章 7.02-06 中描述。

注意 3: 一些 BIOS 版本忽略 ECX 暫存器,並在每次呼叫 INT 15\AX=E820h 函式後返回 20 位元組的資料。

注意 4: 如果特定計算機的 BIOS 不支援呼叫 INT 15\AX=E820h 函式,則應嘗試呼叫 INT 15\AX=E801h (8.01-79)。如果此嘗試也失敗,則應呼叫 INT 15\AH=88h 函式 (8.01-77)。

8.01-81 INT 16\AH=03h – 鍵盤的速率和延遲

[編輯 | 編輯原始碼]

準備: AX – 子函式: = 0300h – 設定預設重複速率和延遲值 = 0305h – 設定 BL 中給出的速率,設定 BH 中給出的延遲 = 0306h – 獲取當前重複速率和延遲的 BL –(僅限於 AX=0305h):重複速率程式碼(注意 1) BH –(僅限於 AX=0305h):延遲程式碼(注意 2)

返回: BL – 當前重複速率的程式碼(注意 1) BH – 當前延遲的程式碼(注意 2) AH 內容可能被更改。

注意 1: 允許的重複速率程式碼從 00h 到 1Fh,對應於每秒 30 次到 2 次的重複速率。

注意 2: 允許的延遲程式碼從 00h 到 03h,對應於 0.25 秒到 1 秒的延遲。

8.01-82 INT 16\AH=05h – 將鍵碼插入鍵盤緩衝區

[編輯 | 編輯原始碼]

準備: AH = 05h CH – 擊鍵的掃描碼(表 A.02-1) CL – 對應字元的 ASCII 碼(表 A.02-1)

返回: AL – 錯誤程式碼 (A.06-1) AH 內容可能被更改。

注意 1: 舊版 BIOS 不支援此功能。

注意 2: 一些鍵的程式碼(例如 ENTER 鍵)插入鍵盤緩衝區後,會觸發相應函式的執行。

注意 3: INT 16\AH=05h 函式不能用於插入“功能”鍵(SHIFT、CTRL、ALT)的程式碼。

8.01-83 INT 16\AH=10h – 從鍵盤緩衝區中獲取鍵碼

[編輯 | 編輯原始碼]

INT 16\AH=10h 函式適用於最廣泛的 101/108 鍵“增強型”鍵盤,但也響應其他鍵盤上相容鍵的擊鍵。INT 16\AH=10h 處理程式從鍵盤緩衝區中提取最頂端的鍵碼,並將此程式碼放在 AX 暫存器中。如果此時鍵盤緩衝區為空,則 INT 16\AH=10h 處理程式開始等待使用者的擊鍵。

準備: AH = 10h

返回: AH – 擊鍵的掃描碼(表 A.02-1) AL – 對應字元的 ASCII 碼(表 A.02-1)

注意 1: INT16\AH=20h 執行相同的操作,但能夠響應一些特定於 122 鍵鍵盤的鍵。

注意 2: 在舊的計算機中,類似的任務由 INT16\AH=00h 函式執行。在現代計算機中,此函式仍然處於活動狀態,但它會忽略在舊的 84 鍵鍵盤中不存在的鍵。

8.01-84 INT 16\AH=11h – 從鍵盤緩衝區中複製鍵碼

[編輯 | 編輯原始碼]

INT 16\AH=11h 函式適用於最廣泛的 101/108 鍵“增強型”鍵盤,但也響應其他鍵盤上相容鍵的擊鍵。最頂端的鍵碼不會從鍵盤緩衝區中提取,INT 16\AH=11h 處理程式只是將此程式碼複製到 AX 暫存器中,如果此時鍵盤緩衝區為空,它不會等待使用者的擊鍵。

準備: AH = 11h

返回: 如果 ZF 標誌被置位為 ZR 狀態,則鍵盤的緩衝區為空。如果 ZF 標誌被清零為 NZ 狀態,則:AH – 擊鍵的掃描碼(表 A.02-1) AL – 對應字元的 ASCII 碼(表 A.02-1)

注意 1: INT16\AH=21h 執行相同的操作,但能夠響應一些特定於 122 鍵鍵盤的鍵。

注意 2: 在舊的計算機中,類似的任務由 INT16\AH=01h 函式執行。在現代計算機中,此函式仍然處於活動狀態,但它會忽略在舊的 84 鍵鍵盤中不存在的鍵。

8.01-85 INT 16\AH=12h – 獲取鍵盤狀態標誌

[編輯 | 編輯原始碼]

INT 16\AH=12h 函式將儲存在 BIOS 資料區域 (A.02-3) 中的地址 0040:0017h 的鍵盤狀態字複製到 AX 暫存器中。

準備: AH = 12h

返回時:AX - 標誌:位 0 置位:右 Shift 鍵被按下 位 1 置位:左 Shift 鍵被按下 位 2 置位:任何一個 CTRL 鍵(右或左)被按下 位 3 置位:任何一個 ALT 鍵(右或左)被按下 位 4 置位:Scroll Lock 開關開啟 位 5 置位:Num Lock 開關開啟 位 6 置位:Caps Lock 開關開啟 位 7 置位:Insert 開關開啟 位 8 置位:左 CTRL 鍵被按下 位 9 置位:左 ALT 鍵被按下 位 10 置位:右 CTRL 鍵被按下 位 11 置位:右 ALT 鍵被按下 位 12 置位:Scroll Lock 鍵被按下 位 13 置位:Num Lock 鍵被按下 位 14 置位:Caps Lock 鍵被按下 位 15 置位:SysRq (PrtScr) 鍵被按下(注 2)

注 1:在使用 84\86 鍵鍵盤的過時計算機中,INT 16\AH=02h 函式執行類似的任務。它只返回 AL 暫存器中位 7–0 的標誌狀態。在現代計算機中,此函式仍然有效,但它不返回那些在過時計算機中未註冊的標誌狀態。

注 2:SysRq (PrtScr) 鍵的按下狀態不會被註冊,除非任何一個 ALT 鍵(左或右)也被按下。

8.01-86 INT 17\AH=00h - 向 LPT 埠傳送字元

[edit | edit source]

準備:AH = 00h AL - 要傳送的字元的程式碼 DX - LPT 埠號:0000h–0002h 對應於 LPT1 – LPT3

返回時:AH - LPT 埠和印表機的狀態 (A.14-3).

8.01-87 INT 17\AH=01h - 初始化印表機的埠

[edit | edit source]

準備:AH = 01h DX - LPT 埠號:0000h–0002h 對應於 LPT1 – LPT3

返回時:AH - LPT 埠和印表機的狀態 (A.14-3).

注 1:報告的狀態可能不正確。INT 17\AH=0200h 函式在稍後一段時間內會報告更可靠的資料。

8.01-88 INT 17\AX=0200h - 獲取 LPT 埠的狀態

[edit | edit source]

INT 17\AX=0200h 函式由傳統的 LPT BIOS 和 EPP BIOS(增強型並行埠 BIOS)執行,但方式不同。過時的 PC 中沒有 EPP BIOS,因此傳統的 LPT BIOS 除了 AH 中的埠狀態 (A.14-3) 之外什麼也不報告。在現代 PC 中,如果 BX 暫存器中的準備值不是 5050h,則 INT 17\AX=0200h 呼叫可以定向到傳統的 LPT BIOS 併產生相同的效果。但對於 BX=5050h 和 CH=45h 的 INT 17\AX=0200h 呼叫,EPP BIOS 會攔截這些呼叫,它返回其入口點的地址。對該入口點的 CALL FAR 命令 (7.03-08) 會呼叫 IEEE 1284 規範 (A.14-4) 規定的增強型 I/O 功能。

準備:AX = 0200h BX = 5050h,如果呼叫定向到 EPP BIOS CH = 45h,如果呼叫定向到 EPP BIOS DX - LPT 埠號:0000h–0002h 對應於 LPT1 – LPT3

返回時:AH - LPT 埠和印表機的狀態 (A.14-3). 狀態 AH = 03h 且 CF 標誌設定為 CY 狀態由 EPP BIOS 返回,如果它不支援請求的 LPT 埠。狀態 AH = 00h 且 CF 標誌清除為 NC 狀態由 EPP BIOS 返回,如果它支援請求的 LPT 埠,然後:CX:AL = 4550:50h - EPP BIOS 版本 1.x 的簽名 CX:AL = 5050:45h - EPP BIOS 版本 3.x 的簽名 EPP BIOS 版本 1.x 和 3x 保持 ES 暫存器內容不變,並且 DX:BX - EPP BIOS 遠入口點的段:偏移量 EPP BIOS 修訂版 7 返回 ES 內容更改,並且 DX - EPP BIOS I/O 操作的基址 ES:BX - EPP BIOS 遠入口點的段:偏移量。

注 1:如果對 INT 17\AX=0200h 的呼叫沒有定向到 EPP BIOS,則 BX 和 CH 暫存器可以包含任何值,除了 5050h 和 45h 之外。

注 2:ES 暫存器中段地址的更改是 EPP BIOS 最新第 7 版的特定症狀,它補充了用於 LPT 多路複用器的控制功能。

8.01-89 INT 18 - 無盤引導鉤子

[edit | edit source]

準備:無

當找不到可引導磁碟時,PC 的 BIOS 系統會呼叫 INT 18 處理程式。在過時的 PC 中,INT 18 處理程式會啟動 BASIC 語言直譯器,該直譯器儲存在 PC 的只讀記憶體 (ROM) 中。現代計算機中的預設 INT 18 處理程式會顯示一條關於缺少 BASIC 語言直譯器的訊息,然後停止 CPU。

但是,擴充套件卡的 ROM 記憶體中提供的其他處理程式可以攔截對 INT 18 的呼叫。特別是,擴充套件卡提供的處理程式可能會進行攔截,以便透過本地網路實現無盤引導。

8.01-90 INT 19 - 引導載入程式

[edit | edit source]

INT 19 處理程式執行 PC 引導過程中的重要部分:它將引導扇區從磁碟的引導分割槽複製到 PC 記憶體地址 0000:7C00h,然後將控制權轉移到複製的引導扇區的程式碼。首先定址該磁碟,該磁碟在 BIOS 設定程式準備的引導備選方案序列中被指定為第一個。從軟盤中,它們的引導扇區立即被複制,硬碟的引導分割槽從 MBR 扇區 (A.13-5) 的分割槽表中確定。如果定址的磁碟不可訪問,則會嘗試定址準備的引導備選方案序列中的下一個磁碟。如果所有嘗試都失敗,最後一個預設選項是呼叫 INT 18 處理程式 (8.01-89)。

但是,INT 19 處理程式不會清除記憶體,也不會恢復中斷表。因此,如果未對該呼叫進行適當的準備,則計算機很可能在呼叫 INT 19 處理程式後掛起。在必要時,重新引導不應透過呼叫 INT 19 處理程式來啟動,而應透過其他方式啟動:透過鍵盤控制器的 FEh 命令(A.11-3 的注 3)或透過對載入程式入口點 F000:FFF0h(A.12-1 的注 4)的 CALL FAR 命令 (7.03-08),該入口點在所有 AT 相容計算機中都相同。

8.01-91 INT 1A\AH=00h - 獲取系統滴答計數

[edit | edit source]

準備:AH = 00h 返回時:AL - 如果自上次讀取滴答計數以來已經過了午夜,則為非零值。CX - 滴答計數的最重要 2 個位元組,每 24 小時 1800B0h DX - 滴答計數的最低重要 2 個位元組,每秒 18.2 個滴答

注 1:滴答計數在午夜重置。

注 2:午夜後,DOS 必須首先請求系統滴答計數,否則它會錯過午夜標誌並無法推進日期。

注 3:可以使用 INT 1A\AH=01h 設定系統時間(以滴答數計)。要設定的滴答數必須以相同的方式準備在 CX 和 DX 暫存器中。

8.01-92 INT 1A\AH=02h - 讀取即時時鐘

[edit | edit source]

準備:AH = 02h

返回時:出錯時,CF 標誌被置位,返回的資料無效。CF 標誌的清除狀態表示成功終止,然後 CH - 小時 CL - 分鐘 DH - 秒 DL = 00h 標準時間(北半球的“冬季時間”) = 01h 夏令時(北半球的“夏季時間”)

注 1:小時、分鐘和秒以壓縮十進位制格式返回,即每個位元組兩個十進位制數字。

注 2:可以使用 INT 1A\AH=03h 設定即時時間。要設定的時間資料必須以相同的形式準備在 CH、CL、DH 和 DL 暫存器中。

8.01-93 INT 1A\AH=04h - 讀取即時日期

[edit | edit source]

準備:AH = 04h

返回時:出錯時,CF 標誌被置位,返回的資料無效。CF 標誌的清除狀態表示成功終止,然後 CH - 世紀 CL - 年份 DH - 月份 DL - 日

注 1:日、月、年和世紀以壓縮十進位制格式返回,即每個位元組兩個十進位制數字。

注 2:可以使用 INT 1A\AH=05h 設定新日期。要設定的資料必須以相同的形式準備在 CH、CL、DH 和 DL 暫存器中。

8.01-94 INT 1A\AH=06h - 預設每天事件呼叫的時間

[編輯 | 編輯原始碼]

INT 1A\AH=06h 函式指定 PC 的 BIOS 系統定期呼叫 INT 4A 處理程式的時刻。期望的操作(例如時鐘鬧鐘)隱含地由 INT 4A 處理程式完成,該處理程式需要由使用者編寫並載入。

準備:AH – 06h CH – 小時 CL – 分鐘 DH – 秒

返回:出錯時 CF 標誌被置位:很可能是時間預設已處於活動狀態。CF 標誌的清除狀態表示成功終止。

注意 1:小時、分鐘和秒必須以壓縮十進位制格式準備,即每位元組兩個十進位制數字。

注意 2:預設 FFh 會丟棄部分計數。例如,如果 CH = FFh,則 INT 4A 處理程式每小時呼叫一次;如果 CH = CL = FFh,則 INT 4A 處理程式每分鐘呼叫一次。

注意 3:時間預設一直有效,直到透過呼叫 INT 1A\AH=07h 函式停用它為止,該函式只需要準備 AH = 07h 即可。

8.01-95 INT 1B – 鍵盤的“CTRL-Break”鉤子

[編輯 | 編輯原始碼]

準備:無

每次鍵盤控制器報告 CTRL-Break 按鍵時,INT 09 處理程式都會呼叫 INT 1B。預設的 INT 1B 處理程式在 BIOS 資料區設定一個標誌的 TRUE 狀態(表 A.02-3 中偏移量 71h 處位元組的第 7 位),然後控制權返回給被中斷的程式。此標誌的狀態由當前程式呼叫的某些 MS-DOS 處理程式檢查。如果發現標誌被設定為 TRUE 狀態,則呼叫 INT 23 處理程式(8.02-83)。後者掛起當前程式的執行,並負責所有後續事件(1.03)。

在中斷表中用指向 IRET 命令的指標(7.03-30)替換 INT 1B 處理程式的地址,這是一種常見的技巧,在許多程式中使用,以防止因 CTRL-Break 按鍵而導致的程式中止。

8.01-96 INT 1C – 系統計時器滴答鉤子

[編輯 | 編輯原始碼]

準備:無

INT 1C 由 INT 08 處理程式(8.01-09)在每個系統計時器的滴答聲處呼叫,即每秒 18.2 次。預設的 INT 1C 處理程式只是將控制權返回給呼叫者。但是,每個駐留程式都可以用自己的 INT 1C 處理程式替換預設處理程式,該處理程式將在每個計時器滴答聲處將控制權傳遞給程式的駐留模組。因此,計算機系統能夠實現對即時開發過程的監控和控制。

8.02 由 MS-DOS7 載入的中斷處理程式 (INT 20 – INT 2E)

[編輯 | 編輯原始碼]

8.02-01 INT 20 – 程式執行終止

[編輯 | 編輯原始碼]

INT 20 處理程式從程式的 PSP(A.07-1)恢復以前的 interrupt 表值,釋放程式佔用的記憶體,恢復段暫存器和堆疊的狀態,然後將控制權轉移到 INT 22 指向的呼叫者程式碼(8.02-82)。但是,INT 20 要求 CS: 暫存器中存在 PSP 段地址,並且沒有機會留下錯誤級別程式碼(3.15-03),該程式碼描述了程式終止的環境。因此,應優先使用 INT 21\AH=4Ch 函式(8.02-55)來終止程式執行。

準備:CS: 暫存器中的段地址必須指向 PSP 段。

返回:不會發生返回。

注意 1:在 Debug.exe 的作業系統環境中,INT 21\AH=4Ch 和 INT 20 處理程式會產生不同的效果:INT 20 將控制權轉移到 Debug.exe,而 INT 21\AH=4Ch 會終止偵錯程式的會話並將控制權返回給 DOS。

注意 2:INT 21\AH=00h 也會終止呼叫者程式,並且始終留下錯誤級別程式碼 00h,就像 INT 20 一樣。MS-DOS7 支援 INT 21\AH=00h 以保持與舊軟體的相容性。

8.02-02 INT 21\AH=01h – 透過 STDIN 通道獲取一個字元

[編輯 | 編輯原始碼]

INT 21\AH=01h 函式從 STDIN(標準輸入)通道讀取字元程式碼,將該程式碼寫入 AL 暫存器,並將該程式碼的副本傳送到 STDOUT(標準輸出)通道。STDIN 和 STDOUT 通道都可以重定向,但在重定向之前,預設的 STDIN 源是鍵盤,預設的 STDOUT 目標是螢幕。因此,呼叫 INT 21\AH=01h 函式會導致 PC 開始等待按鍵,按鍵後,相應的字元會出現在螢幕上。

準備:AH = 01h

返回:AL – 收到的字元的 ASCII 程式碼

注意 1:返回的 ASCII 程式碼由表 A.02-1 中十六進位制數字的兩個最右邊數字表示。

注意 2:INT 21\AH=01h 函式不應該從命令檔案中呼叫,這些命令檔案透過重定向傳送到命令直譯器,因為在這種情況下,INT 21\AH=01h 函式會攔截 STDIN 流量,包括要接收的命令,這些命令要被命令直譯器接收。

注意 3:INT 21\AH=01h 函式檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後被設定(8.01-95)。如果發現此標誌處於 TRUE 狀態,則呼叫 INT 23 處理程式。

注意 4:同樣,INT 21\AH=03h 函式從 STDAUX 通道讀取字元程式碼,該通道的預設源是 COM1 埠。

8.02-03 INT 21\AH=02h – 透過 STDOUT 通道傳送一個字元

[編輯 | 編輯原始碼]

INT 21\AH=02h 函式將指定的 ASCII 程式碼傳送到 STDOUT 通道。如果 STDOUT 通道未重定向,則其預設目標是顯示器,因此,與傳送的 ASCII 程式碼相對應的字元將出現在螢幕上。

準備:AH = 02h DL – 要傳送到 STDOUT 的字元的 ASCII 程式碼 返回:AH – 傳送的 ASCII 程式碼,除了製表符程式碼(09h),它將擴充套件為空格(20h)。

注意 1:如果 STDOUT 通道被重定向到檔案,則傳送到 STDOUT 通道不會意味著檢查驅動器中的介質是否存在,是否已滿,是否防寫等等。但是,當目標驅動器忙於先前的操作時,INT 21\AH=02h 處理程式將等待該先前操作的終止。

注意 2:INT 21\AH=02h 函式檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後被設定(8.01-95)。如果發現此標誌處於 TRUE 狀態,則呼叫 INT 23 處理程式。

注意 3:INT 21\AH=06h 也會將 ASCII 程式碼傳送到 STDOUT 通道,但不會檢查 CTRL-C\CTRL-Break 標誌。除此之外,如果 DL=FFh(8.02-04),INT 21\AH=06h 函式會執行完全不同的任務。

注意 4:與 INT 21\AH=02h 類似,INT 21\AH=04h 函式將 ASCII 程式碼傳送到 STDAUX 通道(預設目標 - COM1 埠),INT 21\AH=05h 函式將 ASCII 程式碼傳送到 STDPRN 通道(預設目標 - LPT1 埠)。

8.02-04 INT 21\AH=06h – 從 STDIN 通道複製程式碼

[編輯 | 編輯原始碼]

在給出 DL = FFh 規範後,INT 21\AH=06h 函式從 STDIN 通道讀取 ASCII 程式碼,幾乎與 INT 21\AH=01h 函式相同,但不同的是 INT 21\AH=06h 函式

  • 不檢查 CTRL-C\CTRL-BREAK 標誌,
  • 不會從源中撤回複製的程式碼,
  • 當源為空時不會導致等待,
  • 不會將程式碼的副本傳送到 STDOUT 通道,
  • 能夠處理擴充套件鍵碼。

術語“擴充套件”適用於那些鍵碼,這些鍵碼透過其掃描碼部分(表 A.02-1 中數字的左兩位)不同,並且其 ASCII 部分值要麼是 00h 要麼是 E0h。如果 BIOS 報告這兩個 ASCII 值中的任何一個,那麼 INT 21\AH=06h 函式將清除 ZF 標誌並返回 AL = 00h,從而指示具有擴充套件鍵碼的按鍵。在這種情況下,INT 21\AH=06h 函式必須再次呼叫,然後它將在 AL 暫存器中返回掃描碼,這使得能夠區分具有“擴充套件”鍵碼的按鍵。

其他 ASCII 程式碼(除了 00h 和 E0h)立即在 AL 暫存器中返回,然後無法返回掃描碼。在此之後,允許對 INT 21\AH=06h 函式進行重複呼叫,但它將作為獨立於先前呼叫的單獨執行。

準備:AH = 06h DL = FFh(對於其他值 – 注意 3 到 8.02-03)

返回時:ZR(設定)ZF 標誌的狀態表示源為空 NZ(清除)ZF 標誌的狀態表示存在資料,然後 AL – 透過 STDIN 通道複製的 ASCII 程式碼(或掃描碼)。

注意 1:INT 21\AH=07h 函式執行幾乎相同的操作,但會從 STDIN 源撤回讀取的程式碼,忽略 DL 內容,不更改 ZF 標誌的狀態,並且如果 STDIN 源是鍵盤緩衝區,並且此時它為空,則可能會導致等待按鍵。

注意 2:INT 21\AH=08h 函式與 INT 21\AH=07h 相同(見上文注意 1),但除此之外,它還檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後設置(8.01-95)。如果發現此標誌處於 TRUE 狀態,則會呼叫 INT 23 處理程式。

注意 3:INT 21\AH=06h–08h 函式不應從命令檔案呼叫,這些命令檔案透過重定向傳送到命令直譯器,因為在這種情況下 INT 21\AH=06h–08h 函式會攔截 STDIN 流量,包括那些要被命令直譯器接收的命令。

注意 4:如果象形文字語言支援標誌(表 A.07-1 中偏移量 3Ch 處的位元組)被設定為 TRUE 狀態,那麼 INT 21\AH=06h–08h 函式能夠返回部分形成的雙位元組程式碼。

8.02-05 INT 21\AH=09h – 傳送字串到 STDOUT

[編輯 | 編輯原始碼]

準備:AH = 09h DS:DX – 指向以 '$' 結尾的字串的起始位元組的指標 返回時:AL = 24h(“$”字元的程式碼,字串中的最後一個字元)

注意 1:輸出將持續到遇到第一個字元“$”(24h)為止;“$”本身不會發送到 STDOUT,並且不能存在於字串中。

注意 2:INT 21\AH=09h 函式檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後設置(8.01-95)。如果發現此標誌處於 TRUE 狀態,則會呼叫 INT 23 處理程式。

注意 3:另一個能夠傳送字串的函式是 INT21\AH=40h(8.02-36)。

8.02-06 INT 21\AH=0Ah – 從 STDIN 通道緩衝輸入

[編輯 | 編輯原始碼]

當 STDIN 通道沒有被重定向時,INT 21\AH=0Ah 函式會等待按鍵,並在每次按鍵後將其程式碼寫入準備好的緩衝區。緩衝區不一定要為空:新資料可以追加到先前緩衝區的內容中。寫入的程式碼副本透過 STDOUT 通道傳送以顯示。在接收到 ENTER 按鍵產生的 0Dh 程式碼後,寫入將終止。當 STDIN 通道透過重定向從檔案接收資料時,緩衝區填充將持續進行,並在遇到第一個 0Dh 位元組後終止。在這兩種情況下,當準備好的緩衝區變滿時,寫入將終止。

準備:AH = 0Ah DS:DX – 指向準備好的緩衝區的起始位置,其中需要填充 2 個位元組:偏移量 00h:最大緩衝區大小(以位元組為單位);偏移量 01h:寫入新資料的起始偏移量。

返回時:DS:DX – 指向已填充緩衝區的起始位置,其中 2 個位元組表示:偏移量 00h:最大緩衝區大小(以位元組為單位);偏移量 01h:實際寫入的位元組數。

注意 1:如果緩衝區大小(DS:DX 指向)為 00h,INT 21\AH=0Ah 函式不會等待按鍵,並立即返回控制。

注意 2:準備好的緩衝區中的位元組計數從偏移量 02h 開始,不包括終止寫入會話的位元組 0Dh。

注意 3:INT 21\AH=0Ah 函式檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後設置(8.01-95)。如果發現此標誌處於 TRUE 狀態,則會呼叫 INT 23 處理程式。

注意 4:INT 21\AH=0Ah 函式不應從命令檔案呼叫,這些命令檔案透過重定向傳送到命令直譯器,因為在這種情況下 INT 21\AH=0Ah 函式會攔截 STDIN 流量,包括那些要被命令直譯器接收的命令。

8.02-07 INT 21\AH=0Bh – 獲取 STDIN 通道的狀態

[編輯 | 編輯原始碼]

INT 21\AH=0Bh 函式用於確定 STDIN 通道源中是否存在任何資料。當 STDIN 通道未被重定向時,INT 21\AH=0Bh 函式報告鍵盤緩衝區是否為空。如果要透過重定向接收資料,那麼 INT 21\AH=0Bh 函式將顯示源中是否至少有一個位元組掛起。

準備:AH = 0Bh

返回時:如果 STDIN 通道源為空,則 AL = 00h,否則 = FFh,如果 STDIN 通道源中至少有一個位元組。

注意 1:INT 21\AH=0Bh 函式檢查該標誌的狀態,該標誌在 CTRL-C 和 CTRL-Break 按鍵後設置(8.01-95)。如果發現此標誌處於 TRUE 狀態,則會呼叫 INT 23 處理程式。

8.02-08 INT 21\AH=0Ch – 清除鍵盤緩衝區並讀取 STDIN

[編輯 | 編輯原始碼]

INT 21\AH=0Ch 處理程式會清除鍵盤緩衝區,然後呼叫由 AL 暫存器中的程式碼指定的選定 STDIN 輸入函式。允許的程式碼 01h、06h、07h、08h、0Ah 分別對應於函式 INT 21\AH=01h、INT 21\AH=06h、INT 21\AH=07h、INT 21\AH=08h、INT 21\AH=0Ah。其他相關功能由所選的輸入函式定義。

準備:AH = 0Ch AL – 輸入函式的程式碼:01h 或 06h 或 07h 或 08h 或 0Ah 其他暫存器 – 按照指定輸入函式的要求

返回時:與指定的輸入函式返回時相同。

注意 1:INT 21\AH=0Ch 處理程式以及允許的輸入函式程式碼不應從透過重定向傳送到命令直譯器的命令檔案呼叫,因為在這種情況下,輸入函式會攔截 STDIN 流量,包括那些要被命令直譯器接收的命令。

注意 2:如果 AL 中的程式碼不是允許的程式碼之一(01h、06h、07h、08h、0Ah),那麼 INT 21\AH=0Ch 處理程式會清除鍵盤緩衝區,但不會嘗試進行 STDIN 輸入。

8.02-09 INT 21\AH=0Dh – 將緩衝區的資料寫入磁碟

[編輯 | 編輯原始碼]

每次當前程式想要訪問另一個磁碟時,都應該將磁碟緩衝區的內容寫回當前磁碟。除此之外,呼叫 INT 21\AH=0Dh 函式將恢復 DTA 區域的預設地址(注意 6 到 A.07-1)。

準備:AH = 0Dh

返回時:CF 標誌的清除狀態表示成功終止。

注意 1:INT 21\AH=0Dh 函式將磁碟緩衝區寫入磁碟,但不更新目錄的更改內容。當某個檔案的控制代碼透過 INT 21\AH=3Eh 函式關閉時(8.02-34),目錄將被更新。

8.02-10 INT 21\AH=0Eh – 指定當前邏輯磁碟

[編輯 | 編輯原始碼]

INT 21\AH=0Eh 函式將“當前”狀態分配給該邏輯磁碟,該邏輯磁碟應作為預設選擇,以便能夠執行磁碟訪問操作而無需顯式磁碟指定。

準備:AH = 0Eh DL – 所選邏輯磁碟的編號(注意 1)

返回時:AL – LASTDRIVE 規範允許的最大字母名稱數量(4.17、4.18)

注意 1:邏輯磁碟的編號遵循其字母名稱的順序:00h = A:,01h = B:,02h = C:,依此類推。

注意 2:在驅動程式啟動時被呼叫時,INT 21\AH=0Eh 函式可能會在 AL 暫存器中返回一個無效的數字,因為它從列表列表(A.01-2)中的偏移量 21h 處讀取,並且在啟動時可能還沒有寫入該位置。

注意 3:INT 21\AH=19h 函式(8.02-15)報告當前預設邏輯磁碟的編號。

8.02-11 INT 21\AH=11h – 使用 FCB 查詢第一個匹配的檔案

[編輯 | 編輯原始碼]

INT 21\AH=11h 處理程式使用 FCB (檔案控制塊) - 一種過時的檔案資料規格,不適合訪問以 FAT-32 檔案系統格式化的磁碟上的檔案。然而,FCB 適用於在當前目錄中匹配檔案搜尋,包括 FAT-32 檔案系統磁碟上的目錄。允許的 FCB 結構如表 A.09-5 所示。FCB 中的檔名規格可以是帶 "?" 萬用字元的掩碼 (2.01-03)。FCB 可以透過 INT 21\AH=29h 函式 (8.02-19) 方便地排列。

INT 21\AH=11h 處理程式返回的一些搜尋資料補充了 FCB 中的資料,如表 A.09-5 所示。但搜尋結果的主要部分在 DTA - 資料傳輸區中返回,該區域長 128 位元組。預設的 DTA 位置在 PSP (A.07-1) 內,從偏移量 80h 開始,但 DTA 可以透過 INT 21\AH=1Ah 函式 (8.02-16) 遷移到其他位置。DTA 中返回的資料結構取決於原始 FCB 的型別 - 是正常的 FCB 還是擴充套件的 FCB。兩種變體返回的資料結構如表 A.09-1 所示。

準備 : AH = 11h DS:DX - 指向未開啟的 FCB,正常或擴充套件 (A.09-5)

返回 : AL - 錯誤程式碼 (A.06-1): = FFh - 沒有找到匹配的檔案 = 00h - DTA 區域 (A.09-1) 填充了關於第一個找到的檔案的資料。

注意 1: INT 21\AH=11h 函式可以獲取關於卷標的資訊。為此,應準備一個帶有屬性位元組 08h 的擴充套件 FCB,並且當前目錄必須是磁碟的根目錄。

注意 2: INT 21\AH=11h 函式可以獲取關於目錄的資訊。為此,應準備一個帶有屬性位元組 10h 的擴充套件 FCB,並且當前目錄必須是請求的目錄的父目錄。

注意 3: 如果搜尋要使用 INT 21\AH=12h 函式 (8.02-12) 繼續,則 FCB 和 DTA 區域中的所有資料,包括返回的資料,必須保持不變。

注意 4: 不使用 FCB 規格的檔案搜尋由 INT 21\AH=4Eh 函式執行。

8.02-12 INT 21\AH=12h - 使用 FCB 查詢下一個匹配檔案

[編輯 | 編輯原始碼]

INT 21\AH=12h 函式在先前搜尋迭代成功終止後繼續搜尋匹配的檔案,先前搜尋迭代由 INT 21\AH=11h (8.02-11) 或 INT 21\AH=12h 函式執行。一致繼續的必要條件是保持先前搜尋迭代後 FCB 和 DTA 中返回的那些資料完整。搜尋結果與呼叫 INT 21\AH=11h (8.02-11) 後的結果相同。

準備 : AH = 12h DS:DX - 指向未開啟的 FCB,正常或擴充套件 (A.09-5) DTA 區域 (A.09-1) 包含上次搜尋迭代後剩餘的資料

返回 : AL - 錯誤程式碼 (A.06-1): = FFh - 沒有更多匹配的檔案 = 00h - DTA 區域 (A.09-1) 填充了關於下一個找到的檔案的資料。

注意 1: INT 21\AH=11h (文章 8.02-11) 的所有註釋同樣適用於 INT 21\AH=12h 函式。

8.02-13 INT 21\AH=13h - 使用 FCB 刪除匹配的檔案(s)

[編輯 | 編輯原始碼]

INT 21\AH=13h 處理程式使用過時的 FCB (檔案控制塊) 規範形式,但它仍然適用於刪除當前目錄中的檔案(s),包括以 FAT-32 檔案系統格式化的磁碟上的目錄。允許的 FCB 結構如表 A.09-5 所示。為了刪除多個檔案,FCB 可以指定一個帶 "?" 萬用字元的掩碼 (2.01-03)。FCB 可以透過 INT 21\AH=29h 函式 (8.02-19) 方便地排列。

要刪除的檔案必須事先關閉 (8.02-34),必須沒有 HSR 屬性 (A.09-2),並且包含這些檔案的磁碟不能是防寫的。

準備 : AH = 13h DS:DX - 指向未開啟的 FCB,正常或擴充套件 (A.09-5)

返回 : AL - 錯誤程式碼 (A.06-1): = FFh - 沒有找到匹配的檔案 = 00h - 匹配的檔案已成功刪除。

注意 1: 由於擴充套件 FCB 中的屬性位元組 (A.09-5),INT 21\AH=13h 函式能夠刪除卷標和具有 R (只讀) 屬性的檔案。刪除子目錄也是可能的,但隨後這些子目錄中的檔案將變成丟失的簇。

注意 2: 刪除的檔案不會被物理刪除;而是它的目錄項變得無效:該項的第一個字元被無效標記覆蓋 - 程式碼 E5h。

注意 3: INT 21\AH=13h 函式刪除任何具有長檔名的檔案都不會影響除主目錄項之外的關聯目錄項,而這些目錄項包含長檔名的延續。

注意 4: 不使用 FCB 規格的檔案(s) 刪除由 INT 21\AH=41h 函式 (8.02-37) 執行。

8.02-14 INT 21\AH=17h - 使用 FCB 重新命名匹配檔案

[編輯 | 編輯原始碼]

準備 : AH = 17h DS:DX - 指向未開啟的 FCB,正常或擴充套件 (A.09-5)。當前名稱在 FCB 中的正常位置寫入,建議的新名稱必須寫入 10h 位元組進一步,在下一行轉儲下方的當前名稱下。具體偏移值在表 A.09-5 中給出。兩個名稱都必須以規範形式寫入,例如,由 INT 21\AH=29h 函式 (8.02-19) 提供。對於正常 FCB,所需緩衝區的長度為 28 位元組,對於擴充套件 FCB,所需緩衝區的長度為 35 位元組。

返回 : AL - 錯誤程式碼 (A.06-1): = 00h - 指定的檔案已成功重新命名。 = FFh - 失敗:要麼沒有找到匹配的檔案,要麼檔案受 HRS 屬性保護,要麼具有建議的新名稱的檔案已經存在。

注意 1: FCB 中允許使用檔案掩碼,但僅使用 "?" 萬用字元 (2.01-03),並且在兩個檔案掩碼中使用相同的萬用字元位置:在替換當前檔名時和在替換建議的新檔名時。與萬用字元位置相對應的字元將從當前實際檔名中複製,並插入到新分配的檔名中的相同位置。

注意 2: 由於 FCB 沒有指定路徑,INT 21\AH=17h 函式只能重新命名當前目錄中的檔案。重新命名當前目錄以外的檔案可以透過 INT 21\AH=56h 函式 (8.02-62) 執行,該函式不使用 FCB 規範。

注意 3: 帶有屬性位元組 10h 的擴充套件 FCB 能夠從父目錄重新命名子目錄,而帶有屬性位元組 08h 的擴充套件 FCB 能夠從當前磁碟的根目錄重新命名卷標。

8.02-15 INT 21\AH=19h - 報告 "當前" 邏輯磁碟

[編輯 | 編輯原始碼]

INT 21\AH=19h 函式報告在沒有顯式磁碟規格的情況下,磁碟訪問操作預設將採用哪個邏輯磁碟。

準備 : AH = 19h

返回 : AL - "當前" 邏輯磁碟的編號 (8.02-10 的注意 1)。

注意 1: "當前" 邏輯磁碟的任命可以透過 INT 21\AH=0Eh 函式 (8.02-10) 更改。

8.02-16 INT 21\AH=1Ah,2Fh - 設定/獲取 DTA 區域地址

[編輯 | 編輯原始碼]

資料傳輸區 (DTA) 是一個 128 位元組長的緩衝區,由檔案搜尋函式 (8.02-11, 8.02-12, 8.02-57, 8.02-58) 使用。DTA 區域的預設位置在當前程式的 PSP 內,偏移量為 0080h (A.07-1 的注意 6)。

準備 : AH - 子功能: = 1Ah - 指定 DTA 的新位置 = 2Fh - 報告當前的 DTA 位置 DS:DX - 指向新的 DTA 位置 (僅適用於 AH = 1Ah 子功能)

返回 : ES:BX - 指向當前的 DTA 位置 (僅適用於 AH = 2Fh 子功能)

注意 1: DTA 資料結構的示例如表 A.09-1 所示。

注意 2: 每次呼叫 INT 21\AH=0Dh 函式 (8.02-09) 後,DTA 將返回其預設位置 (PSP:0080h)。

8.02-17 INT 21\AH=1Ch - 獲取關於磁碟的資訊

[編輯 | 編輯原始碼]

準備 : AH = 1Ch DL - 邏輯磁碟編號 (注意 1) 返回 : AH - 介質識別符號 (ID 位元組): = F8h - 固定磁碟 (HDD), = F9h - 1.2 Mb 或 720 kb 軟盤, = FAh - 虛擬 RAM 盤, = FDh - 360 kb 軟盤, = F0h - 其他介質,包括 1.44 Mb 軟盤。 CX - 每扇區的位元組數; DS:BX - 指向記憶體中的同一介質識別符號位元組; DX 和 AL 的內容不會保留。

注 1:此函式使用“移位”的邏輯磁碟編號:00h 是預設(“當前”)邏輯磁碟,然後是 01h = A:,02h = B:,03h = C:,依此類推。

注 2:應用於無效或不存在的磁碟時,INT 21\AH=1Ch 不會使用 CF 標誌指示錯誤,而是返回 AH、BX 和 DS 暫存器中的值不變。

注 3:INT 21\AH=1Bh 以相同的方式報告有關預設(“當前”)磁碟的資訊,忽略 DL 內容。INT 21\AH=1Ch 和 INT 21\AH=1Bh 都是過時的函式,無法識別大多數現代媒體型別。

8.02-18 INT 21\AH=25h – 將指標寫入中斷表

[編輯 | 編輯原始碼]

準備:AH = 25h AL – 中斷號,其處理程式地址將被寫入 DS:DX – 指向新的中斷處理程式的指標

注 1:此函式覆蓋了以前處理程式的地址。如果它不應該丟失,您必須事先注意儲存它。

注 2:MS-DOS7 提供的 INT 21\AH=25h 處理程式可以在 CPU 處於真實模式或 V86 模式時使用,但在保護模式下不能使用。

8.02-19 INT 21\AX=2901h – 將檔名解析為 FCB

[編輯 | 編輯原始碼]

INT 21\AX=2901h 函式排列一個未開啟的普通型別 FCB(檔案控制塊)(A.09-5),其中填充了給定檔名的規範形式。檔案的檔名和副檔名分別寫入其 FCB 欄位,字母被轉換為大寫字母,星號萬用字元(2.01-03)被擴充套件為適當數量的“?”萬用字元。如果檔名少於 8 個位元組,或副檔名少於 3 個位元組,則其餘空閒字元單元將用空格(20h)填充。解析在遇到第一個斜槓或空格或 0Dh 終止符位元組時停止(00h 終止符位元組不允許)。

檔名不能以路徑開頭,但可以以磁碟的字母名稱開頭(例如,A:Config.sys)。磁碟的字母名稱將被轉換為邏輯磁碟號,寫入 FCB 中檔名欄位之前的單元格。如果給定行中的第二個字元不是冒號,則磁碟的字母名稱被視為缺失,並且 FCB 中的磁碟號單元格將填充 00h – 預設(“當前”)磁碟的編號。

準備:AH = 2901h DS:SI – 指向要解析的檔名字串的指標(允許萬用字元)ES:DI – 指向準備好的緩衝區的指標,長度為 21 個位元組,用於 FCB

返回時:AL = 00h – 解析成功,沒有遇到萬用字元 = 01h – 解析成功,萬用字元存在 = FFh – 解析失敗(無效規範)DS:SI – 指向解析停止的字元的指標 ES:DI – 指向已填充未開啟的 FCB 的緩衝區的指標

注 1:如果 FCB 稍後需要被轉換為“開啟”形式以提供對檔案的訪問,則緩衝區必須長 36 個位元組。

注 2:解析也可以由 INT 21\AX=2903h 函式執行,該函式不會覆蓋 FCB 中磁碟號單元格的先前內容。

8.02-20 INT 21\AH=2Ah – 獲取系統日期

[編輯 | 編輯原始碼]

準備:AH = 2Ah

返回時:AL – 星期幾(00h = 星期日)CX – 年份(範圍 1980 – 2099)DH – 月份 DL – 日

注 1:所有值都以壓縮十進位制格式返回,即每個位元組兩位十進位制數。

注 2:系統日期可以透過 INT 21\AH=2Bh 函式更改。所需的值應以 AL、CX、DH、DL 暫存器的形式準備,如上所示。如果 INT 21\AH=2Bh 函式失敗,它將返回 AL=FFh 並保持系統日期不變。

8.02-21 INT 21\AH=2Ch – 獲取系統時間

[編輯 | 編輯原始碼]

準備:AH = 2Ch

返回時:CH – 小時 CL – 分鐘 DH – 秒 DL – 秒的 1/100 部分

注 1:所有值都以壓縮十進位制格式返回,即每個位元組兩位十進位制數。

注 2:某些計算機以 0.05 秒的步長計算 DL 值,而另一些計算機始終返回 DL = 00h。

注 3:系統時間可以透過 INT 21\AH=2Dh 函式更改。所需的值應以 CH、CL、DH、DL 暫存器的形式準備,如上所示。如果 INT 21\AH=2Dh 函式失敗,它將返回 AL=FFh 並保持系統時間不變。

8.02-22 INT 21\AH=30h – 獲取 DOS 版本

[編輯 | 編輯原始碼]

準備:AX = 3000h – 在 BH 中返回製造商(OEM)識別符號 = 3001h – 在 BH 中返回版本標誌位元組。

返回時:AL.AH – DOS 版本號 BH – OEM 識別符號或版本標誌位元組。

注 1:OEM 識別符號對於 IBM 為 00h,對於 PhysTechSoft 為 66h,對於 DR-DOS 為 EEh,對於 Novell 為 EFh,對於 FreeDOS 為 FDh,對於 Microsoft 為 FFh。

注 2:版本標誌位元組中位 3 的 TRUE 狀態標誌著專為儲存在 ROM 中而設計的特殊 DOS 版本。

注 3:返回的版本號是從呼叫程式的 PSP(A.07-1)中偏移量為 40h 的字讀取的。如果安裝了 SETVER.EXE 驅動程式,並且如果呼叫程式的名稱已寫入 SETVER 的表中,則請求的版本將替換呼叫程式的 PSP 中偏移量為 40h 的真實 DOS 版本號。

注 4:INT 21\AX=3306h 函式(8.02-27)肯定會報告真實的 DOS 版本號。

8.02-23 INT 21\AH=31h – 終止執行,留下駐留模組

[編輯 | 編輯原始碼]

準備:AH = 31h AL – 十六進位制錯誤級別值(注意 8.02-55 的第 3 點)DX – 駐留模組的大小,以 16 位元組段為單位,不小於 6 個段,從 PSP(A.07-1)的開頭算起。

注 1:INT 21\AH=31h 函式釋放主程式的記憶體(除了其駐留模組),恢復中斷表中的指標,恢復段暫存器的狀態和堆疊,然後將控制權轉移到 INT 22(8.02-82)指向的呼叫程式程式碼。但是 INT 21\AH=31h 函式不會關閉已開啟的檔案,也不會釋放環境記憶體區域以及透過 INT 21\AH=48h(8.02-50)分配的記憶體。如有必要,這些操作必須由程式在終止之前執行。

注 2:過時的 INT 27 處理程式(8.02-86)執行相同的操作,但將駐留模組的大小限制為 64 kb 並且不會留下錯誤級別值。

8.02-24 INT 21\AH=32h – 獲取磁碟的引數塊 (DPB)

[編輯 | 編輯原始碼]

準備:AH = 32h DL – 邏輯磁碟號(注意 8.02-17 的第 1 點)

返回時:AL = FFh, – 請求的磁碟無效或網路磁碟 = 00h, – 請求成功執行,然後 DS:BX – 指向 DPB 塊的指標(A.03-1)

注 1:也可以透過 INT 21\AH=1Fh 獲取指向預設(“當前”)磁碟的 DPB 的指標;後者會忽略 DL 中的值。

注 2:INT 21\AH=32h 和 INT 21\AH=1Fh 都嘗試透過讀取請求的磁碟來更新 DPB。如果讀取失敗,INT 24 處理程式將被呼叫,並帶有其“中止、重試、失敗?”問題。如果此時不希望嘗試訪問磁碟,可以透過 DOS 的列表列表找到指向任何 DPB 的指標(注意 A.01-2 的第 1 點)。

注 3:INT 21\AH=32h 和 INT 21\AH=1Fh 無法應用於使用 FAT-32 格式化的磁碟:然後應使用 INT 21\AX=7302h 函式(8.02-79)代替。

8.02-25 INT 21\AX=3300h – 獲取 BREAK 標誌的狀態

[編輯 | 編輯原始碼]

準備:AX = 3300h

返回時:DL = 00h – BREAK 標誌關閉 = 01h – BREAK 標誌開啟

注 1:BREAK 標誌位於 DOS 的可交換區域,偏移量為 17h(A.01-3)。

注 2:BREAK 標誌的狀態可以透過 INT 21\AX=3301 函式更改,該函式以相同的方式接受要設定的狀態,來自 DL 暫存器。

8.02-26 INT 21\AX=3305h – 獲取啟動驅動器

[編輯 | 編輯原始碼]

準備:AX = 3305h

返回時:DL – 啟動驅動器號(注意 8.02-17 的第 1 點)

注 1:INT 21\AX=3305h 函式從 DOS 的列表列表(A.01-2)中偏移量為 43h 的位置讀取用於啟動 PC 的磁碟的編號。

8.02-27 INT 21\AX=3306h – 獲取真實的 DOS 版本

[編輯 | 編輯原始碼]

準備:AX = 3306h

返回時:AL = FFh,如果 DOS 的真實版本低於 5.00。當 AL 暫存器返回其他任何值時,則:BL.BH - DOS 的真實版本 DH - 標誌位:位 3 - DOS 儲存在 ROM 中 位 4 - DOS 載入到 HMA 區域 DL - DOS 修訂號。

注意 1:INT 21\AX=3306h 函式返回的資料不受 SETVER.EXE 驅動程式的影響(與 INT 21\AH=30h 返回的資料不同)。

注意 2:INT 21\AX=3306h 函式在低於 5.00 的 DOS 版本中不受支援。除了 AL = FFh 之外,過時的 DOS 版本的症狀可能是 BL < 05h 和 BH > 64h。

8.02-28 INT 21\AH=34h - 獲取 InDOS 標誌的地址

[編輯 | 編輯原始碼]

InDOS 標誌是活動 DOS 函式巢狀級別的位元組計數器:每當呼叫任何 INT 21 函式時,它都會遞增,並在其執行終止時遞減。在從任何駐留模組呼叫 DOS 函式之前,應檢查 InDOS 標誌和嚴重錯誤標誌(注意 1)的狀態:如果這兩個標誌中的任何一個具有非零值,則此類呼叫不安全。由於相同的原因,INT 21\AH=34h 函式應在 TSR 程式初始化時呼叫一次,並且應儲存返回的指標。稍後,當呼叫 DOS 函式可能不安全時,可以立即讀取系統標誌的狀態,這得益於儲存的指標。

準備:AH = 34h

返回時:ES:BX - 指向一個位元組 InDOS 標誌的指標

注意 1:嚴重錯誤標誌是緊接 InDOS 標誌之前的位元組(A.01-3)。可以透過 INT 21\AX=5D06h 函式獲取指向嚴重錯誤標誌的指標。

8.02-29 INT 21\AH=35h - 獲取指向中斷處理程式的指標

[編輯 | 編輯原始碼]

準備:AH = 35h AL - 中斷號

返回時:ES:BX - 指向中斷處理程式的指標。

8.02-30 INT 21\AH=36h - 獲取磁碟的可用空間

[編輯 | 編輯原始碼]

準備:AH = 36h DL - 邏輯磁碟號(8.02-17 的注意 1)

返回時:AX - 每個簇的扇區數 BX - 可用簇數 CX - 每個扇區的位元組數 DX - 請求磁碟上的總簇數

注意 1:可用空間(以位元組為單位)可以作為 AX * BX * CX 的乘積找到。

注意 2:整個磁碟的空間(以位元組為單位)可以作為 AX * CX * DX 的乘積找到。

注意 3:INT 21\AH=36h 函式將“丟失”的簇計入已使用的簇中。

注意 4:在請求無效或不存在的磁碟後,將返回 AX = FFFFh 值。在請求 CD\DVD-ROM 後,返回的資料肯定無效。

注意 5:允許請求 FAT-32 磁碟,但實際報告的空間限制為 2048 MB。對於更大的磁碟,應使用 INT 21\AX=7303h 函式(8.02-80)代替。

8.02-31 INT 21\AH=39h–3Ah - 建立/刪除空子目錄

[編輯 | 編輯原始碼]

準備:AH = 39h - 建立子目錄 = 3Ah - 刪除空子目錄 DS:DX - 指向包含目標目錄名稱的字串的指標。字串必須以 00h 位元組結尾。名稱前面可以有路徑。字串的最大長度為 64 位元組。

返回時:出錯時,CF 標誌被置位,AL 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止。AX 的內容不會被保留。

注意 1:如果目錄是根目錄,或者它不是空閒的,或者它在 CDS 表中被標記為“當前”(A.03-3),則不能刪除目錄。

注意 2:與普通目錄不同,根目錄的容量有限:如果根目錄已滿,則無法在該根目錄中建立新的子目錄。

8.02-32 INT 21\AH=3Bh - 設定當前目錄

[編輯 | 編輯原始碼]

INT 21\AH=3Bh 函式會將特定磁碟的 CDS 表項(A.03-3)中的預設目錄路徑名重寫。

準備:AH = 3Bh DS:DX - 指向包含新預設目錄名稱的字串的指標。字串必須以 00h 位元組結尾。名稱前面可以有路徑,可以選擇包含磁碟的字母名稱。字串的最大長度為 64 位元組。

返回時:出錯時,CF 標誌被置位,AL 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止。AX 的內容不會被保留。

注意 1:如果對 INT 21\AH=3Bh 的呼叫指定了一個磁碟,而該磁碟此時不是“當前”磁碟,則“當前”目錄不會立即更改,但提議的預設目錄將在“當前”狀態被分配到指定磁碟時成為“當前”目錄。

注意 2:INT 21\AH=47h 函式(8.02-49)報告預設目錄的當前分配。

8.02-33 INT 21\AH=3Dh - 獲取訪問控制代碼

[編輯 | 編輯原始碼]

控制代碼是 SFT 條目(A.01-4)的十六進位制識別符號。每個 SFT 條目都與某個物件相關聯:要麼與現有檔案相關聯,要麼與 XMS 記憶體的專用區域相關聯,要麼與訪問通道相關聯。控制代碼可以被視為對該物件的數字引用。INT 21\AH=3Dh 函式會調查 SFT 表中是否包含與指定物件相關的條目。如果相關的條目已經存在,則該條目中註冊的引用數量會增加 1,該 SFT 條目的編號會寫入 JFT 表(A.07-1,偏移量 18h)中的位元組單元,並且該位元組單元在 JFT 表中的序號將作為請求的控制代碼返回給呼叫程式。如果與指定物件相關的 SFT 條目不存在,則 INT 21\AH=3Dh 處理程式會為指定物件建立一個新的 SFT 條目,然後執行與之前描述相同的操作序列,最終將新的控制代碼返回給呼叫程式。那些獲得了關聯控制代碼的檔案被稱為“開啟”的檔案。

準備:AH = 3Dh AL - 訪問和共享許可權(A.09-4) DS:DX - 指向物件名稱的指標(以 00h 位元組結尾)

返回時:出錯時,CF 標誌被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AX - 控制代碼 - 對指定物件的數字引用

注意 1:為了獲取驅動程式控制通道的控制代碼,您必須指定該名稱,該名稱儲存在驅動程式頭的偏移量 0Ah 處(A.05-1)。在附錄 A.01-2 的注意 2、文章 8.03-12 和第 8.03 部分的介紹性文章中描述了查詢驅動程式頭的幾種方法。

注意 2:物件名稱中不允許使用萬用字元。

注意 3:開啟檔案時,它的訪問點將設定為它的第一個位元組。

注意 4:開啟檔案的可能性不取決於它的屬性,但 INT 21\AH=3Dh 函式無法將控制代碼與目錄相關聯。

注意 5:INT 21\AH=3Dh 處理程式可以透過伺服器函式 INT 21\AX=5D00h(8.02-68)呼叫,這使得可以在 CL 暫存器中為要開啟的檔案指定屬性掩碼(A.09-2)。

注意 6:從父程式繼承的控制代碼繼承相同的共享和訪問限制。AL 暫存器中的訪問許可權位元組(A.09-4)也定義了特定控制代碼是否會被繼承。

注意 7:如果檔案儲存在使用 FAT-32 檔案系統格式化的邏輯磁碟中,則應透過 INT 21\AX=6C00h 函式(8.02-78)為該檔案提供關聯的控制代碼。

8.02-34 INT 21\AH=3Eh - 刪除訪問控制代碼

[編輯 | 編輯原始碼]

INT 21\AH=3Eh 函式會將關聯的 SFT 條目(A.01-4)中對相同物件的註冊引用數量減少 1,並從呼叫程式的 JFT 表(A.07-1)中的位元組單元中刪除該條目的編號。如果物件是檔案,並且它已經被修改,則相應的目錄記錄會被修正,並且磁碟緩衝區的內容會被寫回磁碟。如果呼叫程式沒有對同一個檔案的重複控制代碼,則該檔案將變得不可訪問,或者對於呼叫程式來說“關閉”。但作業系統只在對該檔案的引用數量為 0 時才認為檔案關閉:只有在這種情況下,才能刪除該檔案,並且只有在這種情況下,該檔案才會不再阻止其驅動器中的可移動介質。具有 0 個引用的 SFT 條目也被認為是已關閉的,並且無效。

準備:AH = 3Eh BX - 要刪除的控制代碼(8.02-33)

返回時:出錯時,CF 標誌被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止。AX 的內容不會被保留。

註釋 1:控制代碼可以透過 INT 21\AH=68h 和 INT 21\AH=6Ah 函式刪除。這些函式的其他規範(除 AH 外)相同。

註釋 2:當一個程式準備終止時,所有由該程式開啟的檔案可以透過 INT 21\AX=5D01h 函式(8.02-69)一次性關閉。

註釋 3:由 EMM386.EXE 驅動程式(5.04-02)開啟的擴充套件記憶體區域的控制代碼,應透過 INT 67\AH=45h 函式(8.03-61)刪除。

8.02-35 INT 21\AH=3Fh – 從源讀取資料

[編輯 | 編輯原始碼]

準備:AH = 3Fh BX – 源物件的控制代碼(8.02-33):檔案、通道或裝置 CX – 要讀取的位元組數 DS:DX – 指向用於讀取資料的緩衝區的指標

返回值:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼(A.06-1)。CF 標誌清除狀態表示成功終止,然後 AX – 實際讀取的位元組數,DS:DX – 指向已填充資料的緩衝區的指標。

註釋 1:每個程式都會自動繼承控制代碼 0000h,這使得能夠從 STDIN 通道源讀取資料,當然,當 STDIN 通道準備好提供這些資料時。但是,如果 STDIN 通道沒有被重定向,並且其緩衝區為空,那麼對 0000h 控制代碼的請求會啟動一個緩衝區填充過程,並等待來自鍵盤的輸入。輸入的字元將顯示在螢幕上,其數量不受 CX 暫存器中數字的限制。輸入在 ENTER 鍵按下後終止,然後,預設在 CX 暫存器中的字元數量從 STDIN 緩衝區讀取到另一個緩衝區,該緩衝區由 DS:DX 指標定義。STDIN 緩衝區中的剩餘字元可供 INT 21\AH=3Fh 函式的後續呼叫讀取。

註釋 2:檔案資料從當前訪問位置開始讀取,因此在每次成功讀取操作後,訪問位置都會更新。

註釋 3:如果 CX 暫存器中請求的位元組數導致訪問位置超出檔案末尾,那麼 INT 21\AH=3Fh 函式將成功終止,但 AX 暫存器中返回的讀取位元組數將小於 CX 暫存器中請求的位元組數。

8.02-36 INT 21\AH=40h – 資料傳輸到檔案或裝置

[編輯 | 編輯原始碼]

準備:AH = 40h BX – 目標物件的控制代碼(8.02-33):檔案、通道或裝置 CX – 要傳輸的位元組數 DS:DX – 指向包含要傳輸資料的緩衝區的指標

返回值:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼(A.06-1)。CF 標誌清除狀態表示成功終止,然後 AX – 實際傳輸的位元組數。

註釋 1:每個程式都會自動繼承 4 個活動控制代碼到目標通道:0001h – 到 STDOUT 通道,0002h – 到 STDERR 通道,0003h – 到 STDAUX 通道(COM1 埠),以及 0004h – 到 STDPRN 通道(LPT1 埠)。STDOUT 通道可以被重定向,但其預設目標是顯示。STDERR 通道不能被重定向;它始終將字元顯示在螢幕上。

註釋 2:寫入檔案從 SFT 中定義的當前訪問位置開始(在表 A.01-4 中的偏移量為 15h)。在每次成功寫入過程後,當前訪問位置都會自動更新。如果寫入過程導致當前訪問位置超出檔案末尾,那麼檔案的長度會自動增加。但是,直到檔案控制代碼被刪除(8.02-48)之前,所產生的更改都不會寫入磁碟。

註釋 3:使用 CX = 0000h 的呼叫不會導致資料傳輸,但會導致目標檔案被截斷(或擴充套件)到該長度,該長度由當前訪問位置定義。

註釋 4:在使用 FAT-32 檔案系統的邏輯磁碟上,如果檔案透過 INT 21\AX=6C00h 函式開啟,並且“擴充套件大小”標誌處於 TRUE 狀態,那麼檔案允許增長超過 2 Gb。

註釋 5:如果在資料傳輸後,AX 暫存器中返回的數字小於 CX 暫存器中請求的數字,那麼造成這種差異最可能的原因是目標磁碟上沒有足夠的可用空間。

8.02-37 INT 21\AH=41h – 刪除已關閉的檔案

[編輯 | 編輯原始碼]

準備:AH = 41h DS:DX – 指向包含檔名字串的指標。名稱前可以加路徑。字串必須以 00h 位元組結尾。

返回時:出錯時,CF 標誌被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止。AX 的內容不會被保留。

註釋 1:刪除的檔案不會被物理擦除;而是其目錄條目被標記為無效:該條目的第一個字元將被無效標記(程式碼 E5h)覆蓋。

註釋 2:透過 INT 21\AH=41h 函式刪除任何帶有長檔名的檔案都不會影響主條目之外的相關條目,而這些目錄條目包含長檔名的延續。

註釋 3:可以刪除開啟的檔案,但它們的控制代碼將保持活動狀態。這可能會導致 FAT 損壞和資料丟失。每個要刪除的檔案都必須提前關閉(8.02-34)。

註釋 4:檔名中的萬用字元不允許使用,除非 INT 21\AH=41h 是透過伺服器函式 INT 21\AX=5D00h 呼叫。伺服器函式還允許在 CL 暫存器中為要刪除的檔案指定屬性掩碼(A.09-2)。

註釋 5:也可以透過 INT 21\AH=13h 函式(8.02-13)刪除當前目錄中的檔案。

8.02-38 INT 21\AH=42h – 設定檔案的訪問點

[編輯 | 編輯原始碼]

檔案的訪問位置由檔案 SFT 條目中的指標定義(在表 A.01-4 中的偏移量為 15h)。訪問點位置從檔案開始處計算。INT 21\AH=42h 函式會影響檔案 SFT 條目中的該指標,從而移動檔案的訪問點。

準備:AH = 42h AL – 請求的訪問點移動的來原始碼:= 00h – 檔案開始處 = 01h – 當前訪問點位置(註釋 1) = 02h – 檔案末尾(註釋 1) BX – 檔案的控制代碼(8.02-33) CX:DX – 從 AL 暫存器中指定的來源處的請求訪問點的雙字移動。

返回值:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼(A.06-1)。CF 標誌清除狀態表示成功終止,然後 DX:AX – 從檔案開始處計算的新的訪問點位置。

註釋 1:選擇來原始碼 01h 和 02h 意味著 CX:DX 中的請求移動是帶符號的雙字。帶符號移動的操作可能會將訪問點設定在檔案開始處之前。在這種情況下,INT 21\AH=42h 函式會返回 CF 標誌清除,但錯誤會在訪問嘗試時顯現出來。

註釋 2:如果新的訪問點位置超出檔案末尾,那麼最接近的下一次寫入操作(8.02-36)會自動將檔案的長度擴充套件到實際的訪問點位置。

註釋 3:在使用 AX=4202h 和 CX=DX=0000h 的 INT 21\AH=42h 函式呼叫後,DX:AX 暫存器中會返回檔案的大小(以位元組為單位)。

註釋 4:在使用 FAT-32 檔案系統的邏輯磁碟上,如果檔案透過 INT 21\AX=6C00h 函式開啟,並且“擴充套件大小”標誌處於 TRUE 狀態,那麼允許超出 2 Gb 的檔案訪問點位置。

8.02-39 INT 21\AX=4300h – 獲取檔案的屬性

[編輯 | 編輯原始碼]

準備:AX = 4300h DS:DX – 指向包含檔名字串的指標。名稱前可以加路徑。字串必須以 00h 位元組結尾。

返回值:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼(A.06-1)。CF 標誌清除狀態表示成功終止,然後 CX – 檔案的屬性字(A.09-2)

註釋 1:INT 21\AX=4301h 函式可以設定 CX 暫存器中準備的屬性。返回值時,AX 內容可能會丟失。其他功能相同。

8.02-40 INT 21\AX=4400h – 獲取有關控制代碼的資訊

[編輯 | 編輯原始碼]

控制代碼 (8.02-33) 是一個十六進位制識別符號,用於標識 SFT 條目 (A.01-4)。每個 SFT 條目都與某個物件相關聯:可以是現有的檔案,也可以是 XMS 記憶體的專用區域,或者是一個訪問通道。控制代碼可以被視為對該物件的數字引用。INT 21\AH=4400h 函式可以用來獲取給定控制代碼本身及其關聯物件的某些屬性。

準備:AX = 4400h BX - 控制代碼 (8.02-33)

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX 的內容不會被保留;DX - 資料字 (注 1)

注 1:返回的資料字中第 7 位的清除狀態表示檔案控制代碼資料字,應根據表 A.04-2 進行解釋。返回的資料字中第 7 位的設定(TRUE)狀態表示非檔案物件的屬性字。此屬性字應根據表 A.05-2 進行解釋。

注 2:屬性字 (A.05-2) 中通道控制代碼的屬性可以透過 INT 21\AX=4401h 函式進行校正。屬性字的第 7-0 位的狀態應在 DX 暫存器中準備,第 15-8 位必須清除,AX = 4401h,其他所有規格相同。

8.02-41 INT 21\AX=4402h–4403h - 驅動程式控制資料讀取/寫入

[編輯 | 編輯原始碼]

I/O 控制 (IOCTL) 的主要思想是 DOS 為驅動程式的控制資料分配一些記憶體空間,並允許程式訪問此記憶體空間以讀取和影響驅動程式的控制資料。INT 21\AX=4402h–4403h 處理程式負責訪問驅動程式的控制資料。

驅動程式屬性字 (A.05-2) 中第 6 位和第 7 位的狀態表示特定驅動程式是否支援可程式設計 I/O 控制。如果支援可程式設計 I/O 控制,則可以使用控制代碼來定址該驅動程式的控制資料,該控制代碼可以透過 INT 21\AH=3Dh 或 INT 21\AX=6C00h 函式開啟 (8.02-33 的注 1)。

準備:AX = 4402h - 讀取驅動程式控制資料 = 4403h - 傳送驅動程式控制資料 BX - 引用目標驅動程式的控制代碼 (8.02-33) CX - 要傳輸的位元組數(緩衝區的長度) DS:DX - 指向用於資料或要傳送資料的緩衝區

返回值:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼(A.06-1)。CF 標誌清除狀態表示成功終止,然後 AX – 實際傳輸的位元組數。

注 1:控制資料的格式對於每個特定驅動程式都是唯一的。例如,表 A.15-4 顯示了 CD/DVD-ROM 驅動程式的一組命令。

注 2:磁碟驅動器 (塊裝置) 的驅動程式控制資料不能使用控制代碼來定址,但可以透過 INT 21\AX=4404h 讀取,並透過 INT 21\AX=4405h 傳送。這些函式的資料規範與上面顯示的類似,除了 AX 和 BX 暫存器:BL 指定磁碟號 (8.02-17 的注 1),BH 被忽略。

8.02-42 INT 21\AX=4406h–4407h - 檢查物件是否準備好訪問

[編輯 | 編輯原始碼]

準備:AX = 4406h - 輸入(讀取)就緒檢查 = 4407h - 輸出(寫入)就緒檢查 BX - 引用目標物件的控制代碼 (8.02-33)。

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AL = FFh - 表示目標物件已準備好訪問 = 00h - 表示目標物件尚未準備好訪問。

注 1:如果檔案訪問點透過訪問點移位操作 INT 21\AH=42h (8.02-38) 設定在檔案末尾,則 INT 21\AX=4406h 檢查可能會錯誤地報告檔案已準備好讀取 (AL = FFh)。當檔案訪問點透過讀取或寫入操作 (8.02-35, 8.02-36) 設定時,此錯誤不會發生。

注 2:INT 21\AX=4407h 函式不檢查驅動器中是否有介質,也不檢查該介質是否有可用空間用於寫入。

8.02-43 INT 21\AX=4408h - 檢查是否為可移動介質

[編輯 | 編輯原始碼]

準備:AX = 4408h BL - 邏輯磁碟號 (8.02-17 的注 1)

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX = 0000h - 請求的邏輯磁碟是可移動的,= 0001h - 請求的邏輯磁碟是固定的 (HDD)。

8.02-44 INT 21\AX=4409h - 邏輯磁碟驅動程式的屬性

[編輯 | 編輯原始碼]

驅動程式的屬性可以用來確定請求的磁碟是真實的還是虛擬的,是本地磁碟還是網路驅動器,是否可用於 BIOS 函式。返回的屬性字的解釋如表 A.05-2 所示。

準備:AX = 4409h BL - 邏輯磁碟號 (8.02-17 的注 1)

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX 的內容不會被保留;DX - 驅動程式的屬性字 (A.05-2)。

注 1:驅動程式屬性字反映驅動程式的功能,這些功能不一定與請求的磁碟的屬性相對應。例如,屬性字中第 11 位的 TRUE 狀態被解釋為驅動程式能夠支援可移動介質,但這並不能說明請求的磁碟是可移動磁碟。

8.02-45 INT 21\AX=440Ah - 檢查控制代碼是否表示遠端訪問

[編輯 | 編輯原始碼]

準備:AX = 440Ah BX - 控制代碼 (8.02-33)

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 DX >= 8000h - 表示透過網路訪問。

8.02-46 INT 21\AX=440Dh - 通用呼叫驅動程式的子函式

[編輯 | 編輯原始碼]

INT 21\AX=440Dh 函式實際上是呼叫許多 IOCTL 子函式的模板。子函式的型別由 CL 暫存器中的程式碼定義。CH 暫存器的內容定義類別程式碼:CH = 08h 對應於磁碟子函式,這些子函式繼承自先前版本的 DOS,並且可以應用於具有 FAT-12 和 FAT-16 檔案系統的磁碟。類別程式碼 CH=48h 對應於在 MS-DOS7 中引入的磁碟子函式,這些子函式可以應用於具有 FAT-32 檔案系統的磁碟。

本文介紹了類別程式碼 CH = 48h 的子函式,這些子函式可以應用於具有 FAT-12、FAT-16、FAT-32 檔案系統的磁碟,並且不需要 BIOS 對 INT 13 擴充套件的支援 (8.01-55)。可以使用 INT 21\AX=4411h 函式 (8.02-47) 檢查您的計算機是否支援特定 IOCTL 子函式。

所有 IOCTL 子函式的資料表示的通用形式是由 DS:DX 暫存器指向的資料塊。對於某些子函式,此資料塊中資料的解釋如附錄 A.04 所示。下面說明了其他幾個子函式的特定條件。

準備:AX = 440Dh BL - 邏輯磁碟號 (8.02-17 的注 1) CX - 子函式:= 4840h - 從表中設定磁碟引數 (A.04-3) = 4841h - 將磁軌寫入邏輯磁碟 (A.04-4) = 4842h - 格式化並驗證邏輯磁碟上的磁軌 (A.04-5) = 4846h - 設定卷的序列號 (A.04-1) = 4847h - 設定訪問標誌 (注 1) = 4848h - 設定介質鎖定狀態 (注 2) = 4849h - 從驅動器中彈出介質(不需要資料塊) = 4860h - 讀取磁碟引數 (A.04-3) = 4861h - 從邏輯磁碟讀取磁軌 (A.04-4) = 4862h - 驗證邏輯磁碟的磁軌 (A.04-5) = 4866h - 獲取卷的標籤和 FAT 型別 (A.04-1) = 4867h - 獲取訪問標誌 (注 1) = 4868h - 確定軟盤型別 (注 3) DS:DX - 指向資料塊的指標,如果子函式需要的話

返回:錯誤時 CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 DS:DX - 指向資料塊的指標,如果子函式需要返回的話。

注 1:子函式 CX=4847h 接受,子函式 4867h 在 DS:DX 資料塊中返回的只是偏移量為 01h 的訪問位元組。任何非零值都表示允許訪問。

注 2:子函式 CL=4848h 從 DS:DX 資料塊中偏移量為 00h 的位元組中接受操作程式碼:00h - 鎖定磁碟,02h - 解鎖磁碟,03h - 報告鎖定狀態(與 INT 13\AH=45h, 8.01-58 相同)。鎖定狀態 - 該磁碟上掛起的鎖定的數量 - 在相同資料塊的位元組 01h 中返回。

註釋 3:在 DS:DX 資料塊中偏移地址 00h 的位元組處,子函式 CX=4868h 返回程式碼 01h,如果介質是請求驅動器的預設型別,否則返回程式碼 00h,如果介質是任何其他型別。特定介質型別的程式碼在同一資料塊的偏移地址 01h 的位元組處返回:02h - 720kb 軟盤,07h - 1.44 Mb 軟盤,09h - 2.88 Mb 軟盤。

8.02-47 INT 21\AX=4411h - 檢查通用呼叫功能

[編輯 | 編輯原始碼]

INT 21\AX=4411h 函式用於檢查特定 PC 上的 BIOS、硬體和可安裝驅動程式是否支援指定的 IOCTL 子函式。

準備:AX = 4411h BL - 邏輯磁碟號(參見 8.02-17 的註釋 1)CX - 子函式程式碼,與 INT 21\AX=440Dh(8.02-46)相同。

返回:發生錯誤時,CF 標誌被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX = 0000h - 確認請求的函式受支援。

註釋 1:INT 21\AX=4411h 函式本身和其他一些 IOCTL 子函式的支援可以透過驅動程式的屬性字 (A.05-2) 來確認。

8.02-48 INT 21\AH=45h\46h - 複製控制代碼

[編輯 | 編輯原始碼]

INT 21\AH=45h 函式將 JFT 表(參見 A.07-1 的註釋 3)中的一個位元組單元中的 SFT 條目號複製到同一 JFT 表中最近的空閒位元組單元中。這兩個位元組單元的序號變成了控制代碼,它們與同一個 SFT 條目和同一個“開啟”物件相關聯。建立重複控制代碼可能是為了儲存 SFT 條目號,或者為了在 JFT 表中重新定位條目號,或者僅僅是為了刪除重複控制代碼,因為刪除控制代碼會啟動檔案儲存到磁碟,而另一個控制代碼的存在會阻止檔案的關閉。

INT 21\AH=46h 函式也會將 JFT 表中的一個位元組單元中的 SFT 條目號複製到一個預定的位元組單元中,覆蓋該單元中的前一個 SFT 條目號。例如,如果與 STDOUT 通道關聯的 0001h 控制代碼被設定為與檔案關聯的另一個控制代碼的重複控制代碼,那麼通常傳送到顯示器的輸出將被重定向到該檔案。DOS 正是透過這種方式執行輸入和輸出資料流量的重定向(2.04-02 - 2.04-05)。

準備:AH = 45h - 複製,保留當前關聯 = 46h - 複製,覆蓋選定的關聯 BX - 活動控制代碼(8.02-33),它將被複制 CX - 另一個控制代碼,它將獲得 BX 中控制代碼的關聯(僅對於 INT 21\AH=46h 函式)。

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX - 自動分配的重複控制代碼(僅在呼叫 INT 21\AH=45h 函式後)。

註釋 1:如果 CX 暫存器中指定的控制代碼與一個開啟的檔案相關聯,那麼在呼叫 INT 21\AH=46h 函式後,該檔案將自動關閉。

註釋 2:重複控制代碼的檔案訪問點的移動會導致另一個控制代碼的檔案訪問點的相同移動,因為兩者都引用同一個 SFT 條目 (A.01-4)。

8.02-49 INT 21\AH=47h - 獲取當前目錄

[編輯 | 編輯原始碼]

準備:AH = 47h DL - 邏輯磁碟號(參見 8.02-17 的註釋 1)DS:SI - 指向路徑名的 64 位元組緩衝區的指標。

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX 的內容不會被保留;DS:SI - 指向路徑名的指標,以 00h 位元組結尾。

註釋 1:返回的路徑名不包括磁碟的字母名稱和初始反斜槓。

註釋 2:預設目錄分配可以透過 INT 21\AH=3Bh 函式(8.02-32)更改。

8.02-50 INT 21\AH=48h - 分配記憶體塊

[編輯 | 編輯原始碼]

準備:AH = 48h BX - 請求的塊的大小(以 16 位元組段為單位)

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時 AX - 分配的塊的段地址 BX - 最大可用塊的大小(以段為單位)。

註釋 1:BX=FFFFh 的請求無法滿足,但執行 INT 21\AH=48h 函式後,BX 暫存器會返回可用常規記憶體的總大小。

註釋 2:來自 *.COM 程式的 INT 21\AH=48h 函式的請求可能會失敗並返回錯誤程式碼 AL=08h (“記憶體不足”),因為預設情況下,DOS 會將所有可用常規記憶體分配給任何當前執行的 *.COM 程式(有關詳細資訊,請參見 A.12-7 的註釋 5)。*.COM 程式必須透過呼叫 INT 21\AH=4Ah 函式 (8.02-52) 來宣告所需的記憶體量,否則所有剩餘的常規記憶體將不會被視為可用記憶體。

8.02-51 INT 21\AH=49h - 釋放記憶體塊

[編輯 | 編輯原始碼]

準備:AH = 49h ES - 要釋放的塊的段地址

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

8.02-52 INT 21\AH=4Ah - 調整記憶體塊大小

[編輯 | 編輯原始碼]

準備:AH = 4Ah BX - 請求的塊的大小(以 16 位元組段為單位)ES - 要調整大小的塊的段地址

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,此時:BX - 指定記憶體塊可用的最大段數

註釋 1:如果記憶體不足以按請求擴充套件塊,則塊將盡可能大。

8.02-53 INT 21\AH=4Bh - 載入程式以供執行

[編輯 | 編輯原始碼]

準備:AH = 4Bh AL - 子函式:= 00h - 載入和啟動執行 = 01h - 載入但不啟動執行 = 03h - 覆蓋載入(可交換的程式碼部分)DS:DX - 指向包含程式呼叫完整規範的字串的指標。程式名稱必須包含字尾。該字串必須以 00h 位元組結尾。ES:BX - 指向引數塊 A.07-2 的指標。

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。BX 和 DX 暫存器的內容不會被保留。

註釋 1:子函式 AL=00h 為載入的程式建立一個新的 PSP(A.07-1),並用呼叫者的環境的副本填充其環境段。新 PSP 中的命令列以位元組 00h 結尾(而在普通 PSP 中,它以位元組 0Dh 結尾)。

註釋 2:呼叫者的任務包括檢查是否有足夠的記憶體用於載入的程式。

註釋 3:載入過程由 AL = 00h 和 AL = 01h 子函式以相同的方式執行,但後者不會啟動載入的程式的執行。為了啟用延遲執行啟動,在 ES:BX 引數塊 (A.07-2) 中,AL = 01h 子函式會返回載入程式的入口點地址和指向其堆疊頂部的指標。

註釋 4:如果可執行檔案以簽名 MZ 或 ZM 開頭,則它將被載入並執行為 *.EXE 程式。要作為 *.COM 程式執行的可執行檔案不應該以簽名 LE、LX、MP、MZ、NE、P2、P3、PE、PL、W3、W4、ZM 開頭。

註釋 5:為了執行批處理檔案,INT 21\AH=4Bh 函式必須載入帶 /C 引數的命令直譯器 COMMAND.COM (6.04)。批處理檔案的名稱應在該引數之後指定,位於由 DS:DX 指向的同一字串中。

註釋 6:當子函式 AL = 03h 載入覆蓋時,它不會建立 PSP 和環境,不會啟動載入的程式碼的執行,也不會檢查目標記憶體區域是否已分配給呼叫者程式。子函式 AL = 03h 需要其他形式的 ES:BX 引數塊:第一個字必須是目標段地址,偏移地址 02h 處的第二個字必須是覆蓋重定位因子。

8.02-54 INT 21\AX=4B05h - 設定執行狀態

[編輯 | 編輯原始碼]

INT 21\AX=4B05h 函式由攔截 INT 21\AX=4B00h 呼叫的程式使用,以便為程式執行做準備,包括替換 DOS 版本號。

準備:AX = 4B05h DS:DX – 指向執行狀態描述符的指標 (A.07-3) 返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌清除表明成功終止,此時 AX = 0000h。

注意 1:從 INT 21\AX=4B05h 呼叫返回到子程序啟動之間,不允許執行任何 DOS、BIOS 或其他軟體中斷。

注意 2:如果 DOS 在 HMA 區域執行,則從 INT 21\AX=4B05h 呼叫返回後,A20 線會被關閉。

8.02-55 INT 21\AH=4Ch – 終止執行,留下錯誤級別程式碼

[編輯 | 編輯原始碼]

準備:AH = 4Ch AL – 十六進位制錯誤級別程式碼 (注意 3)

返回:不會發生返回。

注意 1:在應用 INT 21\AH=4Ch 函式之前,應釋放由執行的程式設定的所有網路鎖。

注意 2:INT 21\AH=4Ch 函式會關閉執行的程式開啟的所有檔案,並釋放其所有記憶體,除非父 PSP 指標 (在 PSP 中偏移量為 16h,A.07-1) 指向當前 PSP 本身。這是永久載入程式的症狀,例如命令直譯器 COMMAND.COM (6.04)。

注意 3:指定的錯誤級別程式碼被寫入 DOS 可交換資料區 (A.01-3) 中偏移量為 14h 的字。儲存的錯誤級別程式碼可以在以後由 INT 21\AH=4Dh 函式 (8.02-56) 讀取,或者可以透過 "If errorlevel..." 命令 (3.15-03) 檢查。

注意 4:在 DEBUG.EXE 的操作環境內,INT 21\AH=4Ch 函式會關閉偵錯程式的會話並將控制權轉移到 DOS。如果需要繼續偵錯程式的會話,則應透過其他方式終止被測程式的執行:要麼使用斷點,要麼呼叫 INT 20 (8.02-01)。

8.02-56 INT 21\AH=4Dh – 讀取儲存的錯誤級別程式碼

[編輯 | 編輯原始碼]

準備:AH = 4Dh

返回:AH – 終止型別:= 00h – 正常終止 (8.02-01, 8.02-55) = 01h – 由 CTRL-C 按鍵引起的中止 (8.01-95, 8.02-83) = 02h – 由嚴重錯誤引起的中止 (8.02-84) = 03h – 終止並留下駐留模組 (8.02-23, 8.02-86) AL – 十六進位制錯誤級別程式碼 (注意 1 和 2)

注意 1:錯誤級別提供有關先前程式終止情況的資訊,但不包括永久載入程式和在後臺模式下執行的程式。

注意 2:錯誤級別儲存在 DOS 可交換資料區 (A.01-3) 中偏移量為 14h 的字。每次呼叫 INT 21\AH=4Dh 函式後,錯誤級別會自動清除;這就是為什麼它只能讀取一次。可以使用批處理檔案 (3.15-03) 多次讀取錯誤級別值。

注意 3:COMMAND.COM 直譯器的內部命令不會留下錯誤級別程式碼,也不會影響先前程式終止後留下的程式碼。

8.02-57 INT 21\AH=4Eh – 查詢第一個匹配檔案

[編輯 | 編輯原始碼]

INT 21\AH=4Eh 函式將返回的資料留在 DTA 區域。預設 DTA 地址位於程式的 PSP (A.07-1) 中偏移量為 0080h 的位置,但可以透過 INT 21\AH=1Ah 函式 (8.02-16) 更改。INT 21\AH=2Fh 函式 (8.02-16) 會報告指向實際 DTA 位置的指標。返回的資料在 DTA 區域中的格式顯示在表 A.09-1 的 F4E 列中。

準備:AX = 4E00h CH = 00h CL – 檔案的屬性掩碼 (A.09-2) DS:DX – 指向包含要搜尋的檔名稱的字串的指標。名稱前面可以帶路徑。檔名可以使用萬用字元進行匹配。字串必須以 00h 位元組結尾。

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌清除表明成功終止,此時將在 DTA 區域 (A.09-1) 返回第一個找到的檔案的相關資料。

注意 1:檔案屬性掩碼 (A.09-2) 中的位 0 和 5 被忽略。檔案屬性掩碼中位 1、2 和 4 的 TRUE 狀態不會排除找到沒有對應屬性的檔案。位 3 (卷標) 的 TRUE 狀態會排除找到檔案。

注意 2:INT 21\AH=11h 函式 (8.02-11) 也能搜尋當前目錄中請求的檔案。

8.02-58 INT 21\AH=4Fh – 查詢下一個匹配檔案

[編輯 | 編輯原始碼]

準備:AH = 4Fh DTA 區域 (A.09-1) 中包含之前搜尋過程留下的資料

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌清除表明成功終止,此時將在 DTA 區域 (A.09-1) 返回下一個找到的檔案的相關資料。

注意 1:為了繼續搜尋,INT 21\AH=4Fh 函式會使用之前 INT 21\AH=4Eh 或 INT 21\AH=4Fh 呼叫返回並在 DTA 區域 (8.02-16) 中儲存的資料。在搜尋完成之前,必須避免重新命名、刪除和移動檔案操作,這些操作會更改目錄條目,從而可能使 DTA 區域中留下的資料失效。

8.02-59 INT 21\AH=52h – DOS 的 "List-of-Lists" 地址

[編輯 | 編輯原始碼]

準備:AH = 52h

返回:ES:BX – 指向 DOS 的 "List-of-Lists" 的指標 (A.01-2)

注意 1:ES 暫存器中返回的段地址指向由 DOS 載入程式 IO.SYS 安排的資料塊。

注意 2:如果當前程式不是在真實 DOS 環境中執行,而是在模擬的 DOS 環境中執行,則 INT 21\AH=52h 函式可能會返回一個明顯無效的 ES:BX 地址,例如 0000:0000h 或 FFFF:FFFFh。

8.02-60 INT 21\AH=54h – 獲取驗證標誌的狀態

[編輯 | 編輯原始碼]

準備:AH = 54h

返回:AL = 00h – 驗證標誌處於關閉狀態,= 01h – 驗證標誌處於開啟狀態

注意 1:如果驗證標誌處於開啟狀態,則每次磁碟寫入操作後都會進行驗證過程 (詳細資訊請參見文章 3.33)。驗證標誌的預設狀態為關閉。

注意 2:INT 21\AH=2Eh 函式可以更改驗證標誌的狀態。它以相同的形式從 AL 暫存器接收請求的驗證標誌狀態。

8.02-61 INT 21\AH=55h – 建立派生 (子) PSP

[編輯 | 編輯原始碼]

INT 21\AH=55h 函式會安排一個新的 PSP (A.07-1),它派生自呼叫程式的實際 PSP。新 PSP 中的父段欄位填充了呼叫程式 PSP 的段地址。INT 22、INT 23 和 INT 24 處理程式的指標被寫入新 PSP 中的中斷處理程式欄位。繼承的控制代碼的 JFT 表字段填充了複製的相應 SFT 條目的編號 (A.01-4),並且這些 SFT 條目中的引用計數增加了 1。安排的新的 PSP 可用於執行 *.COM 程式。

準備:AH = 55h DX – 新 PSP 的段地址 SI – 用於 PSP 中偏移量為 02h 的記憶體大小欄位的值。

返回:AL 的內容可能會改變。

注意 1:新 PSP 的記憶體段必須由 INT 21\AH=48h 函式 (8.02-50) 分配。要執行的 *.COM 檔案應從偏移量為 0100h 的位置開始寫入此段。之後,應進行控制轉移過程,該過程包括透過 INT 21\AH=50h 重新定義當前程序識別符號 (8.02-73 的注意 1) 以及對分配的段中偏移量為 0100h 的位置執行 CALL FAR 命令。

8.02-62 INT 21\AH=56h – 更正目錄條目

[編輯 | 編輯原始碼]

更正目錄條目可以重新命名檔案和子目錄。將檔案從一個目錄移動到同一個邏輯磁碟上的另一個目錄,也可以透過移動目錄條目來實現。由於這並不涉及檔案複製,因此移動目錄條目會快得多。

準備:AH = 56h DS:DX – 指向包含現有物件 (檔案或目錄) 名稱的字串的指標 (注意 4)。名稱前面可以帶路徑。字串必須以 00h 位元組結尾。ES:DI – 指向包含新名稱 (注意 4) 或其他路徑的字串的指標。字串必須以 00h 位元組結尾。

返回:發生錯誤時,CF 標誌被置位,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注意 1:如果 DS:DX 指向的名稱屬於現有檔案,而 ES:DI 指向的名稱屬於同一個邏輯磁碟上的現有目錄,則對應於指定檔案的條目將被移動到目標目錄中。

注 2:如果 ES:DI 指向的名稱不屬於任何現有物件,而 DS:DX 指向的名稱屬於一個現有物件 - 關閉的檔案或目錄,則將重新命名該現有物件。不允許重新命名開啟的檔案。

注 3:INT 21\AH=56h 函式不會將 "A" 屬性分配給已重新命名或移動的檔案。

注 4:名稱中的萬用字元是不允許的,除非 INT 21\AH=56h 函式透過伺服器呼叫 INT 21\AX=5D00h (8.02-68) 呼叫。除了萬用字元 (2.01-03) 之外,伺服器呼叫還從 CL 暫存器接受一個屬性掩碼 (A.09-2),並透過錯誤程式碼 AL = 12h (= 沒有更多匹配的檔案) 來標記檔案組的成功重新命名 (或移動)。

8.02-63 INT 21\AX=5700h - 檔案最後修改的日期和時間

[編輯 | 編輯原始碼]

準備:AX = 5700h BX - 檔案的控制代碼 (8.02-33)

返回:發生錯誤時,CF 標誌被設定,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 CX - 檔案最後修改的時間:位 15-11 - 小時,從 00 到 23;位 10-5 - 分鐘;位 4-0 - 秒。DX - 檔案最後修改的日期:位 15-9 - 年,從 1980 年開始計數;位 8-5 - 月;位 4-0 - 日。

注 1:檔案最後修改的日期和時間可以透過 INT 21\AX=5701h 函式設定:它接受來自 CX 暫存器的以相同形式的時間和來自 DX 暫存器的日期。

注 2:檔案建立的日期和時間可以透過 INT 21\AX=5706h 函式讀取,並透過 INT 21\AX=5707h 函式設定。這兩個函式都使用 SI 暫存器來儲存以 0.01 秒為單位的時間程式碼。但是,檔案建立的日期和時間不一定在 DOS 下注冊。

注 3:最後訪問檔案的日期可以透過 INT 21\AX=5704h 函式讀取,並透過 INT 21\AX=5705h 函式設定(後者需要指定 CX=0000h)。但是,最後訪問日期的註冊可能會被 ACCDATE 命令 (4.01) 禁止。

8.02-64 INT 21\AX=5800h - 記憶體分配策略

[編輯 | 編輯原始碼]

準備:AX = 5800h

返回:發生錯誤時,CF 標誌被設定,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AX - 當前策略程式碼:位 7 和 6:= 00 - 使用常規記憶體;= 01 - 使用上部記憶體;= 10 - 使用常規記憶體,只有在上部記憶體不可用時使用;位 1 和 0:= 00 - 分配第一個合適的空間;= 01 - 分配最合適的空間;= 10 - 分配最後一個合適的空間。位 15-8 和 5-2 必須清零。

注 1:INT 21\AX=5801h 函式在 BX 暫存器中接受相同的策略程式碼,並允許設定它。

注 2:在每個已更改策略設定的程式終止之前,必須恢復以前的記憶體分配策略。

注 3:適當的記憶體分配策略是必要的,但對於上部記憶體的使用來說還不夠:除了這一點,CONFIG.SYS 檔案中還必須存在命令 DOS=UMB (4.08)。

8.02-65 INT 21\AH=59h - 關於最後錯誤的擴充套件資訊

[編輯 | 編輯原始碼]

準備:AH = 59h BX = 0000h

返回:CL、DX、SI、BP 和 DS 暫存器的內容不會被保留;BH - 錯誤類別 (A.06-2);BL - 建議的操作 (A.06-3);CH - 可能的錯誤位置 (A.06-4);AX - 錯誤程式碼 (A.06-1);如果 AX=0022h,則 ES:DI - 指向介質識別符號 (A.06-1 的注 2)。

注 1:錯誤資訊是從 DOS 的可交換區域 (A.01-3) 中讀取的。

注 2:錯誤資訊由 INT 21\AX=5D0Ah 函式寫入 DOS 的可交換區域;它在 DS:DX 暫存器中接受指向引數列表的指標 (A.07-4),並從該列表中與暫存器 AX、BX、CX、DI、DX、ES 相對應的字獲取資料。

8.02-66 INT 21\AH=5Ah - 建立臨時檔案

[編輯 | 編輯原始碼]

準備:AH = 5Ah CX - 檔案的屬性 (A.09-2) DS:DX - 指向包含路徑的字串的指標,以反斜槓結尾。在反斜槓之後,必須跟隨 13 個位元組 00h:這是一個用於自動生成的自動生成的檔名的空間。

返回:發生錯誤時,CF 標誌被設定,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AX - 建立的臨時檔案的控制代碼 (8.02-33);DS:DX - 指向包含路徑和附加檔名的字串的指標。

注 1:建立的檔案會自動獲得一個唯一的名稱,排除名稱衝突。

注 2:根目錄的容量是有限的。如果磁碟的根目錄已滿,則無法在該目錄中建立檔案。

注 3:在請求建立該臨時檔案的程式終止之前,必須關閉並刪除每個臨時檔案。

8.02-67 INT 21\AH=5Bh - 建立新檔案

[編輯 | 編輯原始碼]

準備:AH = 5Bh CX - 檔案的屬性 (A.09-2) DS:DX - 指向包含新檔名(字串)的指標。名稱可以由路徑開頭。字串必須以位元組 00h 結尾。

返回:發生錯誤時,CF 標誌被設定,AL 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 AX - 建立的新檔案的控制代碼 (8.02-33)。

注 1:如果指定目錄中已經存在同名檔案,則 INT 21\AH=5Bh 函式無法建立新檔案。

注 2:根目錄的容量是有限的。如果磁碟的根目錄已滿,則無法在該目錄中建立檔案。

注 3:INT 21\AH=3Ch 執行相同的操作並接受相同的規範(除了 AH),但如果相同目錄中存在同名檔案,則不會返回錯誤。此同名檔案將被簡單地截斷為零長度,並且指向其第一個簇的指標將丟失。因此,恢復截斷檔案的步驟比透過函式 INT 21\AH=13h (8.02-13) 或 INT 21\AH=41h (8.02-37) 偶爾執行普通刪除後的恢復步驟複雜得多。

8.02-68 INT 21\AX=5D00h - 伺服器函式呼叫

[編輯 | 編輯原始碼]

INT 21\AX=5D00h 函式提供了一個模板,使能夠呼叫 INT 21 處理程式的任何其他函式,並以單獨程序的形式執行該函式,以便進行選擇性和重複執行。特別是,INT 21\AH=3Dh 函式的伺服器呼叫使能夠為目標檔案指定屬性掩碼。除此之外,INT 21\AH=56h 和 INT 21\AH=41h 函式的伺服器呼叫使能夠重新命名和刪除透過帶有萬用字元 (2.01-03) 的檔案掩碼指定的檔案。

準備:AX = 5D00h DS:DX - 指向資料塊的指標 (A.07-4),指定所有應為執行請求的函式準備好的暫存器的狀態。

返回: - 應由請求的函式返回。

注 1:不會檢查資料塊中初始資料的有效性。如果資料塊為 AH 暫存器指定了請求函式的無效編號,則計算機可能會掛起。

注 2:INT 21 呼叫所需的檔名必須使用 INT 21\AH=60h 函式 (8.02-72) 以規範形式準備好完整的路徑。

8.02-69 INT 21\AX=5D01h - 關閉程序的所有檔案

[編輯 | 編輯原始碼]

INT 21\AH=5D01h 函式關閉呼叫程序開啟的檔案,更新所有相關的目錄條目,並將磁碟緩衝區的內容寫入磁碟。如果有透過網路訪問的開啟檔案,則會自動呼叫網路服務函式 INT 2F\AX=1107h。

準備:AX = 5D01h DS:DX - 指向資料塊的指標 (A.07-4),在偏移量 12h 處指定虛擬機器識別符號,在偏移量 14h 處指定程序識別符號。資料塊中暫存器資料欄位的內容被忽略。

返回:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

8.02-70 INT 21\AX=5D06h - 可交換資料區域 (SDA) 的地址

[編輯 | 編輯原始碼]

DOS 函式儲存呼叫者的狀態資訊:這可能在以後需要,用於同一程序呼叫的這些或其他 DOS 函式。但是,當前程序可能會被其他程序中斷 - 一個呼叫的 TSR 程式或中斷處理程式。由該其他程序呼叫的 DOS 函式會儲存其他狀態資訊,並破壞與被中斷程序相關的資料。損壞的資料會阻止被中斷程序的正確恢復。為了避免此類衝突,相關資料應被儲存,並在以後恢復。因此,MS-DOS 將相關資料儲存在 SDA - 可交換資料區域 (A.01-3) 中。INT 21\AX=5D06h 函式返回 SDA 區域的地址和該資料塊的大小,該資料塊應在特定情況下儲存。

準備:AX = 5D06h

返回:發生錯誤時,CF 標誌位被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌位清零表示成功終止,此時 DS:SI 指向 SDA 區域的起始位置(A.01-3),CX 表示整個 SDA 區域的大小(以位元組為單位),包括狀態資料和 DOS 的堆疊。為了能夠正確恢復被中斷的 DOS 函式,必須儲存整個 SDA 區域。DX 表示 SDA 區域中狀態資料部分的大小(以位元組為單位),當被中斷的程序不是 DOS 函式時,應該儲存此部分資料。

註釋 1:如果中斷程序不呼叫 DOS 函式,則無需儲存 SDA 的資料。

註釋 2:INT 21\AX=5D06h 也是一個 DOS 函式,有可能在中斷髮生後損壞 SDA 區域中的資料。因此,應該在驅動程式或駐留程式啟動之前呼叫 INT 21\AX=5D06h 函式。返回的資訊應儲存並保留,以便將來使用。

8.02-71 INT 21\AX=5F08h - 隱藏邏輯磁碟

[edit | edit source]

準備:AX = 5F08h DL - 邏輯磁碟號(參見 8.02-10 的註釋 1)

返回:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

註釋 1:INT 21\AX=5F08h 函式會檢查 DOS 內部表中的磁碟引數。如果發現磁碟引數無效,INT 21\AX=5F08h 函式將失敗。

註釋 2:INT 21\AX=5F07h 函式接受相同的規範(除了 AX),但執行相反的操作:將隱藏的磁碟變成有效的磁碟。

8.02-72 INT 21\AH=60h - 將檔名或路徑轉換為規範形式

[edit | edit source]

INT 21\AH=60h 函式的作用與文章 3.29 中描述的 TRUENAME 命令的作用相同。將檔名和路徑轉換為規範形式對於多個 DOS 函式來說是必要的,並且可以避免錯誤,否則可能會導致不良後果。

準備:AH = 60h DS:SI - 指向包含名稱的字串的指標,該名稱前面可能帶有一個路徑。字串的最大長度為 64 位元組。字串必須以 00h 位元組結尾。ES:DI - 指向用於轉換後的名稱和路徑的 128 位元組緩衝區的指標。

返回:發生錯誤時,CF 標誌位被置位,緩衝區內容指標被保留,AX 暫存器提示可能的錯誤原因:AX = 0002h - 路徑的某些組成部分無效或缺失 = 0003h - 磁碟的字母名稱組合錯誤或無效。CF 標誌位清零表示成功終止,此時 ES:DI 指向包含轉換後的規範的緩衝區,AX 內容可能會丟失。

註釋 1:不會檢查指定名稱和路徑的實際存在性。

註釋 2:INT 21\AH=60h 函式不能應用於網路路徑。

8.02-73 INT 21\AH=62h - 獲取當前 PSP 地址

[edit | edit source]

DOS 將當前 PSP 地址視為當前程序的識別符號。將當前程序識別符號替換為另一個識別符號是多工執行控制中的關鍵操作。識別符號替換意味著使用 INT 21\AH=62h 函式從 SDA 區域(A.01-3)讀取當前識別符號,儲存當前識別符號,然後將新的識別符號寫入 SDA 區域。完成其工作後,程式必須在將控制權交回之前恢復以前的程序識別符號。還有一些其他原因需要呼叫 INT 21\AH=62h 函式來確定當前 PSP 地址(9.07-02 中有一個示例)。

準備:AH = 62h

返回:BX - 當前程序的 PSP 段地址(A.07-1)。

註釋 1:可以使用 INT 21\AH=50h 將新的程序識別符號寫入 SDA 區域;後者從 BX 暫存器接收準備好的新識別符號。除了 BX 和 AH=50h 之外,不需要其他資料。

8.02-74 INT 21\AX=6501h - 國家資訊

[edit | edit source]

準備:AX = 6501h BX - 十六進位制內碼表號,或 BX=FFFFh 用於請求當前內碼表。CX - 準備好的資料緩衝區的大小,不少於 29h 位元組 DX - 國家識別符號,或 DX=FFFFh 用於請求當前國家 ES:DI - 指向準備好的資料緩衝區的指標

返回:發生錯誤時,CF 標誌位被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌位清零表示成功終止,此時 ES:DI 指向填充了資料的緩衝區(A.02-4),CX 表示緩衝區填充部分的大小(以位元組為單位)。

註釋 1:INT 21\AX=6502h、6504h、6505h、6506h 函式使用相同的規範(除了 AX),但在 ES:DI 緩衝區中僅返回偏移量為 01h 的一個 4 位元組地址。

  • INT 21\AX=6502h 返回指向大寫字母表指標,該表以其大小(1 個字)開頭,後面跟著 80h 到 FFh 的字元的大寫等價字元(如果有的話)。
  • INT 21\AX=6504h 返回指向檔名大寫字母表指標,該表的結構相同,但僅應用於檔名。
  • INT 21\AX=6505h 返回指向檔名限制表的指標(A.02-5)。
  • INT 21\AX=6506h 返回指向排序順序表的指標,該表以其大小(1 個字)開頭,後面跟著 256 位元組,定義了 00h 到 FFh 字元的排序順序。

註釋 2:有關當前未安裝的其他國家和程式碼表的的資訊不可用,除非安裝了 NLSFUNC.EXE 駐留程式 (5.02-03)。

註釋 3:MS-DOS7 中的國家資訊可以使用 INT 21\AX=7002h 函式設定。該函式在 DS:SI 中接收指向資料表的指標(A.02-4),在 CX 中接收該表的大小(通常為 0026h 位元組)。如果返回時 CF 清零,則 CX 表示實際設定的資料的大小。CF 標誌位置位表示錯誤:AX = 7000h 表示不支援該函式;其他錯誤程式碼對應於表 A.06-1。

8.02-75 INT 21\AX=6521h - 國家相關的字串大寫轉換

[edit | edit source]

準備:AX = 6521h CX - 要大寫轉換的字串的長度 DS:DX - 指向要大寫轉換的字串的指標

返回:發生錯誤時,CF 標誌位被置位,AX 返回錯誤程式碼(A.06-1)。CF 標誌位清零表示成功,提交的字串已轉換為大寫。

註釋 1:INT 21\AX=6522h 函式執行相同的操作,但會忽略 CX,並要求字串結尾用 00h 位元組標記。

註釋 2:INT 21\AX=6520h 函式用於將單個字元轉換為大寫,該字元在 DL 中接收和返回。CX 和 DS 內容被忽略。

8.02-76 INT 21\AH=67h - 設定控制代碼表的大小

[edit | edit source]

預設情況下,不能同時保留超過 20 個控制代碼,因為原始 JFT(A.07-1 中偏移量為 18h)的大小限制為 20 位元組。INT 21\AH=67h 函式會在 PSP 外部建立一個新的 JFT 表,從而消除了由原始 JFT 長度有限造成的預設限制。

準備:AH = 67h BX - 當前程序的新 JFT 表中的控制代碼數量

返回:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

註釋 1:如果當前 JFT 位於 PSP 內部,並且 BX 中的新大小不超過 20 位元組,則不會執行任何操作。

註釋 2:如果當前 JFT 位於 PSP 外部,並且不包含超過 20 個活動控制代碼,並且 BX 中的新 JFT 大小不超過 20 位元組,則 JFT 將被複制回 PSP。

註釋 3:如果請求減小 JFT 大小,並且活動控制代碼無法容納在此減小的大小內,則 INT 21\AH=67h 函式將失敗,並返回錯誤程式碼 0004h(= 開啟檔案過多)。

註釋 4:同時開啟的檔案數量不僅受 JFT 表限制,還受 SFT 表(A.01-4)限制。後者的長度由配置檔案 CONFIG.SYS 中的命令 FILES (4.12) 定義。

註釋 5:無論當前 JFT 的大小和位置如何,子程序都無法從其父程序繼承超過 20 個活動控制代碼。

8.02-77 INT 21\AX=6900h - 獲取卷標和 FAT 型別

[edit | edit source]

INT 21\AX=440Dh\CX=4866h 和 INT 21\AX=6900h 函式都返回包含磁碟卷規格的相同資料塊 A.04-1,只是後者在訪問失敗的情況下不會呼叫關鍵錯誤處理程式 INT 24 (8.02-84)。所有錯誤都透過返回的 AX 中的錯誤程式碼報告。

準備:AX = 6900h BH = 00h BL - 邏輯磁碟號(參見 8.02-17 的註釋 1) DS:DX - 指向 19h 位元組長的資料塊緩衝區的指標

返回時:如果出現錯誤,則設定 CF 標誌,AX 返回錯誤程式碼 (A.06-1)。CF 標誌清除表示成功終止,然後 DS:DX – 指向包含已寫入資料塊的緩衝區的指標 (A.04-1) AH 內容可能會被更改。

注意 1:返回資料塊中偏移量 02h 處開始的資料是從擴充套件 BPB 塊 (A.03-4) 中偏移量 27h–3Dh 處的位元組複製過來的。

注意 2:如果在請求的磁碟中找不到擴充套件 BPB,則會報告錯誤程式碼 0005h。

注意 3:INT 21\AX=6900h 函式不能應用於網路驅動器。此類呼叫將返回錯誤程式碼 0001h。

注意 4:INT 21\AX=6901h 函式執行相反的操作:它接受 DS:DX 指向的資料塊 (A.04-1),並將磁碟的卷資料從該塊複製到該磁碟的擴充套件 BPB 中,該磁碟由 BX 暫存器中的數字類似地指定。

8.02-78 INT 21\AX=6C00h – 擴充套件獲取控制代碼函式

[edit | edit source]

可以使用 INT 21\AH=3Dh (8.02-33) 和 INT 21\AX=6C00h 函式獲得訪問物件的控制代碼,但後者提供了擴充套件功能來定義控制代碼的屬性和規定的操作。

準備:AX = 6C00h BH – 屬性標誌:位 4 – 允許檔案大小超過 2GB(僅限 FAT-32)位 5 – 返回錯誤而不是呼叫 INT 24h 位 6 – 立即寫入磁碟,繞過快取緩衝區 BL – 訪問和共享條件 (A.09-4) CX – 檔案的屬性 (A.09-2),如果要建立檔案,則 DH = 00h DL – 規定的操作程式碼:= 01h – 開啟現有檔案,如果不存在則失敗;= 10h – 開啟新檔案,如果存在同名檔案則失敗;= 11h – 開啟檔案;如果不存在則新建;= 12h – 開啟新檔案;如果存在同名檔案,則刪除。DS:SI – 指向包含檔名字串的指標,該字串前面可以選擇性地加上路徑。檔名中不允許使用萬用字元。該字串必須以位元組 00h 結尾。

返回時:如果出現錯誤,則設定 CF 標誌,AX 返回錯誤程式碼 (A.06-1)。CF 標誌清除表示成功終止,然後 AX – 返回開啟檔案的控制代碼 CX – 狀態程式碼:= 0001h – 檔案已開啟;= 0002h – 檔案已建立;= 0003h – 檔案已替換。

注意 1:規定的操作 DL = 11h 在遠端磁碟上不受支援。

注意 2:對遠端磁碟的操作不會在 CX 中返回狀態程式碼。

注意 3:如果新建檔案,則 BH 和 BL 的內容將複製到新的 SFT 條目 (A.01-4) 中。

注意 4:開啟檔案時,其訪問指標將設定為檔案的開頭。

注意 5:開啟檔案的可能性與它的屬性無關。

8.02-79 INT 21\AX=7302h – 擴充套件 DPB 的複製

[edit | edit source]

INT 21\AX=7302h 函式將磁碟引數塊 (DPB) 複製到準備好的緩衝區中。請求的 DPB (A.03-1) 可以屬於使用 FAT-12、FAT-16 或 FAT-32 檔案系統格式化的磁碟。

準備:AX = 7302h DL – 邏輯磁碟號(8.02-17 的注意 1)CX – 準備好的緩衝區的長度,不小於 3Dh 位元組 ES:DI – 指向準備好的 DPB 緩衝區的指標

返回時:如果出現錯誤,則設定 CF 標誌,AX 返回錯誤程式碼 (A.06-1)。CF 標誌清除表示成功,DPB 表已複製(注意 2)。

注意 1:與類似函式 INT 21\AH=1Fh 和 INT 21\AH=32h (8.02-24) 不同,INT 21\AX=7302h 函式在以前的 DOS 版本中不可用,如果 PC 的 BIOS 不支援 INT 13 擴充套件 (8.01-55),則會失敗。

注意 2:返回資料塊中偏移量 00h 處的值是它的長度;DPB (A.03-1) 的副本從偏移量 DI+02 開始。

注意 3:返回的 DPB 副本中偏移量 13h 處用於驅動程式頭地址的位置將填充為 FFFFh。

注意 4:INT 21\AX=7302h 函式嘗試讀取請求磁碟上的 BPB 以更新 DPB。如果訪問失敗,則會呼叫 INT 24 處理程式。

8.02-80 INT 21\AX=7303h – 獲取可用空間表

[edit | edit source]

INT 21\AX=7303h 函式報告使用 FAT-12、FAT-16 或 FAT-32 檔案系統格式化的磁碟上的可用空間。返回的資料塊 (A.13-7) 將複製到準備好的緩衝區中。與 INT 21\AH=36h 函式 (8.02-30) 返回的值不同,資料塊 A.13-7 中的值不受限於 2048 Mb。

準備:AX = 7303h CX – 準備好的緩衝區的長度,不小於 34h 位元組 DS:DX – 指向字串的指標,定義請求的磁碟(注意 2)ES:DI – 指向資料塊緩衝區的指標;此緩衝區中偏移量 02h 處的值事先必須填充為 0000h。

返回時:如果出現錯誤,則設定 CF 標誌,AX 返回錯誤程式碼 (A.06-1)。CF 標誌清除表示成功終止,然後 ES:DI – 指向填充有資料塊 (A.13-7) 的緩衝區的指標,AL – 返回資料塊的大小。

注意 1:與類似函式 INT 21\AH=36h 不同,INT 21\AX=7302h 函式在以前的 DOS 版本中不可用,如果 PC 的 BIOS 不支援 INT 13 擴充套件 (8.01-55),則會失敗。

注意 2:準備好的字串必須定義請求的磁碟,就像它在 CDS 表 (A.03-3) 中定義的那樣:例如,本地磁碟為 C:\,透過網路訪問的磁碟為 \\SERVER\Share。準備好的字串必須以位元組 00h 結尾。

8.02-81 INT 21\AX=7305h – 擴充套件讀/寫操作

[edit | edit source]

INT 21\AX=7305h 函式提供了 5 個子函式,用於在使用 FAT-12、FAT-16 或 FAT-32 檔案系統格式化的邏輯磁碟內執行讀寫操作。與 INT 25 和 INT 26 處理程式 (8.02-85) 類似,INT 21\AX=7305h 的子函式會忽略檔案結構,並透過扇區號進行定址,每個邏輯磁碟從其開頭分別計數。

準備:AX = 7305h DL – 邏輯磁碟號(8.02-17 的注意 1)DS:BX – 指向磁碟地址包的指標(注意 2)SI – 子函式:= 0000h – 讀取 = 0001h – 寫入任何非特定資料 = 2001h – 寫入 FAT 資料 = 4001h – 寫入目錄資料 = 6001h – 寫入檔案資料

返回:發生錯誤時,CF 標誌被設定,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止。

注意 1:與類似函式 INT 25 和 INT 26 (8.02-85) 不同,INT 21\AX=7302h 函式在以前的 DOS 版本中不可用,如果 PC 的 BIOS 不支援 INT 13 擴充套件 (8.01-55),則會失敗。

注意 2:磁碟地址包長度為 10 個位元組,包含在偏移量處:00h – 雙字:操作開始扇區號;04h – 字:要讀取或寫入的扇區數;06h – 雙字:包含資料或用於資料的緩衝區的地址。

8.02-82 INT 22 – 控制返回點的地址

[edit | edit source]

中斷表中 INT 22 單元格中的地址不是指向處理程式,而是指向父程序內部的返回點。當前程式終止時,控制將僅轉移到該返回點的 INT 22 地址。大多數情況下,INT 22 指向啟動當前程式的 INT 21\AH=4Bh 函式 (8.02-53) 呼叫之後的命令。

不應直接呼叫中斷 INT 22,因為父程序無法正常執行,而無需恢復許多必要的條件,包括堆疊狀態和中斷表中 INT 22 – INT 24 單元格中的地址。所有必要的準備工作由程式終止處理程式 INT 20 (8.02-01) 和 INT 21\AH=4Ch (8.02-55) 執行。這些處理程式從中斷表中讀取 INT 22 地址,臨時儲存它,將父程序的控制返回點地址從當前程式的 PSP (A.07-1) 中的偏移量 0Ah 複製到相同的 INT 22 單元格中,然後執行 JMP FAR 命令 (7.03-39) 轉到臨時儲存的地址。

8.02-83 INT 23 – CTRL-C/CTRL-Break 處理程式

[edit | edit source]

每次鍵盤控制器報告 CTRL-C/CTRL-Break 按鍵時,INT 09 處理程式都會呼叫 INT 1B,後者會將 BIOS 資料區中的標誌 (表 A.02-3 中的偏移量 71h) 設定為 TRUE 狀態。當前程式呼叫的某些 MS-DOS 函式會檢查此標誌的狀態。如果發現標誌設定為 TRUE 狀態,則會呼叫 INT 23 處理程式,該處理程式會暫停當前程式的執行。

INT 23 處理程式的程式碼是在假設其呼叫者是 DOS 函式的情況下編寫的。因此,應用程式程式不允許呼叫 INT 23,除非透過 INT 1B (8.01-95) 間接呼叫。

後續事件部分取決於環境,但在大多數情況下,使用者必須選擇:繼續或終止暫停程式的執行。響應中可能的使用者操作在第 1.03 條中描述。如果選擇終止選項,則 INT 23 處理程式將關閉暫停程式開啟的所有檔案,釋放其記憶體,定義為零錯誤級別,將 CF 標誌設定為 CY 狀態,然後將控制權轉移到父程序 - 那個呼叫了當前程式的程序。如果使用者選擇繼續,則所有暫存器和標誌的狀態將被恢復,並將控制權轉移到呼叫 INT 23 處理程式的 DOS 函式。完成其任務後,此 DOS 函式將控制權返回給其呼叫方 - 當前程式。

8.02-84 INT 24 - 嚴重錯誤處理程式

[edit | edit source]

當對 DOS 函式的請求返回不適當的響應時,這些 DOS 函式將呼叫 INT 24 - 嚴重錯誤處理程式。INT 24 處理程式分析每個錯誤的資訊,但最常見的是不依賴於自身,而是向用戶提出其著名的“中止、重試、失敗?”問題。在得到使用者的決定後,INT 24 處理程式將其傳遞給執行呼叫 INT 24 的 DOS 函式。

INT 24 處理程式的程式碼是在其呼叫者為 DOS 函式的假設下編寫的。因此,不允許應用程式程式直接呼叫 INT 24。

在返回時,所有暫存器(除 AL 外)的狀態從堆疊中恢復,AL 返回操作碼:AL = 00h - 返回呼叫程式並返回錯誤程式碼(失敗);= 01h - 再次嘗試相同的請求(重試);= 02h - 終止呼叫程式的執行(中止);= 03h - 承認系統故障並停止 CPU。

注意 1:透過設定 SDA(A.01-3)偏移量 2Ah 處標誌的狀態,可以確保自動回答失敗和不停地繼續執行。特別是,當使用未公開的引數 /f(6.04)啟動命令直譯器 COMMAND.COM 時,此標誌被設定。

8.02-85 直接磁碟讀取(INT 25)和寫入(INT 26)

[edit | edit source]

NT 25 和 INT 26 處理程式允許訪問使用 FAT-12 和 FAT-16 檔案系統格式化的邏輯磁碟。磁碟訪問透過扇區號進行,每個邏輯磁碟從扇區號 00000000h 開始單獨計數。資料緩衝區地址和特定扇區號在磁碟地址包中傳輸,在 8.02-81 的註釋 2 中進行了描述。

準備:AL - 邏輯磁碟號(8.02-10 的註釋 1)CX = FFFFh(註釋 3)DS:BX - 指向磁碟地址包的指標(8.02-81 的註釋 2)。

在返回時:BX、CX、DX、DI、SI 暫存器的狀態不會保留。發生錯誤時,CF 標誌被設定,AL 返回錯誤程式碼(A.06-1),AH 根據表 A.06-5 返回錯誤狀態。CF 標誌的清除狀態表示成功終止。

注意 1:INT 25 和 INT 26 處理程式在堆疊頂部留下一個標誌狀態字。呼叫程式要麼從堆疊中彈出此字,要麼在 SP 暫存器中恢復以前的值。

注意 2:INT 25 和 INT 26 處理程式能夠提供對具有 32 位資料傳輸的邏輯磁碟的訪問,由驅動程式屬性字(A.05-2)中的位 1 的 TRUE 狀態標記。

注意 3:應用於沒有簇結構的小型邏輯磁碟(32 Mb 或更小,表 A.13-6 中的 ID 04h),INT 25 和 INT 26 處理程式使用不同的規範形式:CX - 要讀取或寫入的扇區數 DX - 起始扇區的數量 DS:BX - 指向包含資料的緩衝區或用於資料的緩衝區。

注意 4:INT 25 和 INT 26 處理程式不能應用於使用 FAT-32 檔案系統格式化的邏輯磁碟,應使用 INT 21\AX=7305h 處理程式(8.02-81)。

8.02-86 INT 27 - 終止執行,留下常駐模組

[edit | edit source]

準備:CS - 當前程式的 PSP 的段地址 DX - 常駐模組的大小,從 60h 到 FFF0h 位元組,從當前程式的 PSP 的開始處計數

注意 1:INT 27 處理程式將控制權轉移到父程序 - 那個啟動了當前程式的程序。INT 27 處理程式為控制權轉移做必要的準備:釋放主程式的記憶體(除了其常駐模組),恢復中斷表中的指標。但 INT 27 處理程式不會關閉開啟的檔案:必須由當前程式事先自行完成。

注意 2:INT 21\AH=31h 函式(8.02-23)具有相同的任務,但不會將常駐模組的大小限制在 64 kb,並且能夠留下非零錯誤級別值。

8.02-87 INT 28 - DOS 空閒鉤子,用於後臺執行

[edit | edit source]

當任何 DOS 的字元輸入函式(INT 21\AH=01h–0Ch)正在等待來自鍵盤的輸入時,INT 28 中斷以定時器的滴答速度(每秒 18 次)被呼叫。在這樣的等待間隔期間,DOS 實際上處於空閒狀態。預設的 INT 28 處理程式是一個單獨的 IRET 指令 (7.03-30),它只是將控制權返回給呼叫方。攔截 INT 28 允許在前景程式正在等待使用者輸入時啟用後臺程式或 TSR。攔截 INT 28 處理程式獲得指向 DOS 堆疊頂部的 SS:SP 暫存器,並且必須在返回時恢復所有暫存器的狀態。

注意 1:攔截 INT 28 的程式必須檢查 InDOS 標誌的狀態(在 A.01-3 中的偏移量 01h 處)。該標誌的地址必須事先透過呼叫 INT 21\AH=34h(8.02-28)函式找到,並且必須從程式初始化開始儲存。在 INT 28 呼叫時,InDOS 標誌的值通常為 01h;如果它具有更大的值,則禁止攔截程式對 DOS 函式的所有呼叫。

注意 2:當 InDOS 標誌具有其正常值 01h 時,設計用於後臺執行的程式可以呼叫 DOS 函式,但 INT 21\AH=01h–0Ch 函式除外,並且針對 CON 裝置控制代碼的呼叫除外(通常這些是控制代碼 0000h–0002h)。

8.02-88 INT 29 - 不可重定向的控制檯輸出

[edit | edit source]

當 STDOUT 輸出被(或可能被)重定向到其他位置 - 到檔案或裝置(而不是顯示 (CON) 裝置)時,INT 29 處理程式用於在螢幕上顯示訊息。

準備:AL - 要顯示的字元的 ASCII 程式碼 在返回時:BX 暫存器的內容可能會被更改。

注意 1:預設的 INT 29 處理程式透過 BIOS 的函式 INT 10\AH=0Eh(8.01-21)將字元程式碼傳送到顯示器。

注意 2:CON 裝置驅動程式屬性字 (A.05-2) 中的位 4 指示 CON 裝置驅動程式是否支援 INT 29。

注意 3:可以透過 INT 21\AH=40h 函式(8.02-36)地址的 STDERR 通道 (控制代碼 0002h) 執行字元字串的不可重定向顯示。與 INT 29 不同,STDERR 通道始終受 CON 裝置驅動程式支援。

8.02-89 INT 2E - 將命令傳輸到直譯器

[edit | edit source]

INT 2E 處理程式將命令列傳輸到命令直譯器 COMMAND.COM 以供執行,但不會重新載入直譯器的模組。命令列被傳輸到已載入的直譯器常駐模組,該模組已啟動了呼叫程式。

準備:DS:SI - 指向要執行的命令列的指標。命令列的格式必須與 PSP (A.07-1,偏移量 80h) 中的格式相同:第一個位元組是行長,然後是命令列本身,以位元組 0Dh 結束。長度計數不包括結束位元組。

在返回時:AX - 錯誤程式碼 (A.06-1);所有暫存器的內容(除了 CS:IP)都可能被更改。

注意 1:命令直譯器的常駐模組可能需要載入 COMMAND.COM 直譯器的瞬態部分才能執行指定的命令。呼叫程式必須確保 DOS 能夠為 COMMAND.COM 直譯器的瞬態部分分配足夠的記憶體。

注 2:COMMAND.COM 直譯器在被 INT 2E 呼叫時,使用其原始環境,這可能與呼叫者的環境不同。因此,環境變數的所有更改(如果有)將無法被呼叫者訪問。

注 3:INT 2E 不應被從批處理檔案啟動的程式呼叫。

8.03 由驅動程式和 TSR 程式載入的中斷處理程式

[編輯 | 編輯原始碼]

當 DOS 開始執行應用程式程式時,指向 BIOS 和 DOS 中斷處理程式的指標當然已經寫入中斷表中的單元格。應用程式程式不需要檢查這些單元格中是否存在這些指標。對於那些由可選軟體(驅動程式和 TSR 程式)載入的處理程式,情況並非如此。中斷表中的相應單元格可能為空,應用程式程式必須檢查這些單元格是否已填充有效的指標。

很久以前,當驅動程式數量不多時,每個驅動程式都使用中斷表中的一個單元格。然後可以透過在地址點的某個附近存在特定簽名來確認處理程式地址的有效性。這種確認方式可以應用於 EMM386.EXE 驅動程式的駐留模組(8.03-62 的注 1),其祖先自 1983 年以來就已為人所知。

隨著越來越多的驅動程式出現,中斷表中的空間不足開始導致衝突。此外,當地址的駐留模組未載入時,消除掛起的威脅也是可取的。為了解決這兩個問題,多路中斷 INT 2F 的想法被提了出來。每個參與的驅動程式都必須攔截 INT 2F 呼叫,從而形成一個攔截器鏈(A.07-5 中的詳細資訊)。INT 2F 的呼叫必須沿著這個鏈從一個處理程式傳遞到另一個處理程式,每個處理程式都會分析 AH 暫存器中的識別符號。如果處理程式沒有在 AH 中識別出自己的識別符號,則它會保持 AX 不變,並讓此呼叫沿著鏈繼續“傳播”。如果指定識別符號沒有被所有處理程式識別,則 INT 2F 的呼叫將到達鏈的最後一個環節——IRET 命令,最初由 DOS 設定。IRET 命令將控制權返回給呼叫程式,因此 AX 值將不變地返回。AX 內容的改變可以被認為是某個處理程式已經識別出自己識別符號的證據;因此,所請求的駐留模組已載入。

當然,多路中斷不僅適合識別。它能夠在不冒在需要模組未載入時掛起的風險的情況下,訪問可選駐留模組的主要功能。但是,跟蹤很長的引用鏈需要時間,並且會使執行速度變慢。為了避免延遲,許多驅動程式透過 INT 2F 返回其入口點的地址。直接呼叫這些入口點會比透過多路中斷呼叫駐留模組的特定功能快得多。例如,HIMEM.SYS 驅動程式 (5.04-01) 使用多路中斷 INT 2F 來返回其入口點的地址 (8.03-23)。

INT 2F 使用的做法在一段時間內取得了有限的成功,但它無法消除由對不同驅動程式和駐留模組分配識別符號不一致造成的衝突。為了避免此類衝突,提出了另一種想法——動態分配識別符號:每個駐留模組應為自己分配第一個找到的可用識別符號。這個想法由多路中斷 INT 2D 實現(A.07-6 中的詳細資訊)。現在,駐留 DOS 軟體由於多路中斷 INT 2D 而擺脫了識別符號衝突。

同時,許多具有已知識別符號的驅動程式繼續使用多路中斷 INT 2F。此外,在以前的 DOS 版本中由驅動程式載入的幾個駐留模組,現在與它們的 INT 2F 識別符號一起整合到 DOS 核心中,以保持相容性。測試是否存在具有 INT 2F 識別符號 AH = 05h、08h 和 12h 的駐留模組毫無意義,這些識別符號實際上現在是 DOS 函式。但是,這些整合函式在下面 8.03 部分中與可選載入軟體的函式一起描述,因為否則將失去按序搜尋它們的便利性。

8.03-01 INT 2F\AX=0501h – 將錯誤程式碼轉換為訊息

[編輯 | 編輯原始碼]

準備:AX = 0501h BX – 要轉換的錯誤程式碼 (A.06-1)

返回時:AX、DI、ES 暫存器的內容和標誌的狀態不保留。CF 標誌的狀態設定為表示 DOS 沒有提交程式碼的訊息。CF 標誌的狀態清除表示成功終止,然後 ES:DI – 指向只讀訊息的指標,以位元組 00h 結尾;AL = 00h – 訊息需要用磁碟的字母名稱補充;= 01h – 返回的訊息是完整的。

8.03-02 INT 2F\AX=0801h – 接受邏輯磁碟的 DDT

[編輯 | 編輯原始碼]

INT 2F\AX=0801h 函式將 DOS 的磁碟資料表 (DDT) 鏈附加一個準備好的 DDT 表,並在引用相同物理驅動器的其他表中修改磁碟描述標誌。從那時起,新增的邏輯磁碟可以透過整合到 DOS 核心中的塊裝置驅動程式訪問。

準備:AX = 0801h DS:DI – 指向準備好的 DDT 表的指標 (A.03-2)

返回時:AX、BX、SI、ES 暫存器的內容不保留。

注 1:INT 2F\AX=0801h 函式不應用於 IFS、遠端和其他磁碟,這些磁碟無法由本機 DOS 塊裝置驅動程式提供服務。

注 2:可以透過 INT 2F\AX=0803h 函式獲取 DDT 表的示例。

8.03-03 INT 2F\AX=0802h – 向塊裝置驅動程式傳送請求

[編輯 | 編輯原始碼]

INT 2F\AX=0802h 函式執行與邏輯磁碟相關的請求,這些邏輯磁碟由有效的磁碟資料表 (A.07-5) 表示,並由整合到 DOS 核心中的塊裝置驅動程式控制。地址的磁碟號和請求的操作程式碼 (A.07-5) 都應在請求資料塊 (A.06-4) 中指定。

準備:AX = 0802h ES:BX – 指向請求資料塊的指標 (A.06)

返回時:ES:BX – 指向請求資料塊的指標,已根據請求的操作更新 (A.05-3 – A.05-7)

注 1:INT 2F\AX=0802h 函式在堆疊頂部留下一個標誌狀態字。呼叫程式必須將此字從堆疊中彈出,或者恢復 SP 暫存器中的先前值。

注 2:可能的錯誤由返回的錯誤程式碼宣佈,這些錯誤程式碼位於請求資料塊中的偏移量 03h 和 04h 的位元組中 (A.05-9)。在任何情況下都不會呼叫關鍵錯誤處理程式 (INT 26)。

8.03-04 INT 2F\AX=0803h – 獲取第一個 DDT 的地址

[編輯 | 編輯原始碼]

準備:AX = 0803h

返回時:DS:DI – 指向第一個 DDT 表開頭的指標 (A.03-2)

注 1:可以透過以下方式輕鬆跟蹤 DDT 表的鏈:每個 DDT 表中的第一個雙字都是指向下一個 DDT 表的指標 (A.03-2)。

8.03-05 INT 2F\AX=1202h – 獲取指向中斷處理程式地址的指標

[編輯 | 編輯原始碼]

準備:AX = 1202h 中斷號應位於堆疊頂部

返回時:ES:BX – 指向中斷處理程式地址的指標;AX 暫存器的內容可能被更改;堆疊的狀態保持不變。

注 1:當 CPU 處於真實模式時,INT 2F\AX=1202h 函式只將中斷號乘以 4。

8.03-06 INT 2F\AX=1212h – 確定字串的長度

[編輯 | 編輯原始碼]

準備:AX = 1212h ES:DI – 指向 ASCIIZ 字串的指標,以 00h 位元組結尾。

返回時:CX – 字串的長度,包括終止的 00h 位元組。

注 1:INT 2F\AX=1225h 函式執行相同操作,但接受來自 DS:SI 暫存器對的指標。

8.03-07 INT 2F\AX=1213h – 將字元大寫

[編輯 | 編輯原始碼]

準備:AX = 1213h 字元的 ASCII 碼應位於堆疊頂部。

返回值:AL – 與該字元相同的 ASCII 大寫程式碼。堆疊狀態保持不變。

8.03-08 INT 2F\AX=1214h – 比較遠指標

[編輯 | 編輯原始碼]

準備:AX = 1212h DS:SI – 第一個指標 ES:DI – 第二個指標

返回值:如果指標相等,則 ZF 標誌位設定,CF 標誌位清除;如果指標不同,則 ZF 標誌位清除,CF 標誌位設定。

8.03-09 INT 2F\AX=1216h – 獲取指向 SFT 條目的指標

[編輯 | 編輯原始碼]

INT 2F\AX=1216h 函式接收一個 SFT 條目的編號(A.01-4),並返回指向該 SFT 條目的指標,從而提供直接訪問 SFT 的機會。

準備:AX = 1216h BX – 請求的 SFT 條目的編號(注意 2)

返回值:AX 值不被儲存。CF 標誌位的設定狀態表示任務失敗。CF 標誌位的清除狀態表示任務成功完成,然後:ES:DI – 指向請求的 SFT 條目的指標,BX – 該條目在特定 SFT 中的相對編號。

注意 1:最可能導致錯誤的原因是請求的 SFT 條目編號大於 SFT 條目的最大數量,該數量由 CONFIG.SYS 檔案中 FILES 命令(4.12)指定。

注意 2:指向與特定控制代碼相關的 SFT 條目編號的指標由 INT 2F\AX=1220h 函式(8.03-11)返回。

8.03-10 INT 2F\AX=121Eh – 比較檔名

[編輯 | 編輯原始碼]

準備:AX = 121Eh DS:SI – 指向第一個檔名的指標,以 00h 位元組結尾;ES:DI – 指向第二個檔名的指標,以 00h 位元組結尾。

返回值:如果檔名相同,則 ZF 標誌位設定,如果檔名不同,則 ZF 標誌位清除。

8.03-11 INT 2F\AX=1220h – 獲取指向 JFT 條目的指標

[編輯 | 編輯原始碼]

JFT 表(A.07-1 的注意 3)中填充了 SFT 條目的編號(A.01-4),定義了那些被開啟以供訪問的物件——通道或檔案。對這些物件的訪問是透過控制代碼進行的——對呼叫程式已知的數字引用。從控制代碼到相應 SFT 條目的路徑從呼叫 INT 2F\AX=1220h 函式開始,該函式返回指向該相應 SFT 條目編號的指標。該編號是呼叫 INT 2F\AX=1216h 函式(8.03-09)的規範中的主要資料項,該函式返回相應 SFT 條目的地址。

準備:AX = 1220h BX – 一個活動的(已開啟的)控制代碼

返回值:如果出錯,則 CF 標誌位設定,AX = 06h(– 無效控制代碼錯誤)。CF 標誌位的清除狀態表示任務成功完成,然後:ES:DI – JFT 中儲存所需 SFT 條目編號的位元組的地址。

注意 1:ES:DI 暫存器中地址指向的 JFT 位元組的值為 FFh,表示指定控制代碼處於非活動(已關閉)狀態。

8.03-12 INT 2F\AX=122Ch – 進入裝置驅動程式鏈

[編輯 | 編輯原始碼]

INT 2F\AX=122Ch 函式能夠跟蹤整個裝置驅動程式頭鏈,因為每個頭中的第一個雙字是指向下一個頭的指標。最後一個頭以第一個字 FFFFh 標記。

準備:AX = 122Ch

返回值:BX:AX – 指向第二個驅動程式的頭(第一個是 DOS 中的“列表列表”中的 NUL 裝置驅動程式,A.01-2)。

8.03-13 INT 2F\AX=1500h – 獲取 CD/DVD 驅動器的數量

[編輯 | 編輯原始碼]

準備:AX = 1500h BX = 0000h

返回值:AL = FFh – 成功完成的簽名(注意 1);BX – CD/DVD 驅動器的數量;CX – 分配給第一個 CD/DVD 驅動器的驅動器編號(0002h = C:,0003h = D:,等等)。

注意 1:返回的初始值 AL = 00h 表示 CD/DVD 檔案系統轉換器(5.08-03 或 5.08-04)的駐留模組未載入,該模組必須執行 INT 2F\AX=1500h 函式。

注意 2:INT 2F\AX=1500h 函式與 GRAPHICS.COM 驅動程式的函式衝突,此外,當安裝了 INTERLINK.EXE 網路驅動程式時,可能會返回第一個 CD/DVD 驅動程式的錯誤字母名稱。

8.03-14 INT 2F\AX=1501h – 獲取 CD/DVD 驅動程式頭的地址

[編輯 | 編輯原始碼]

準備:AX = 1501h ES:BX – 指向緩衝區的指標(每個磁碟預期 5 個位元組)

返回值:ES:BX – 指向已填充每個驅動器 5 位元組塊的緩衝區的指標。在每個塊中,第一個位元組——與特定驅動程式相關的磁碟子單元編號,接下來的雙字——指向該驅動程式頭的指標。緩衝區中資料的總長度取決於 INT 2F\AX=1500h 函式(8.03-13)返回的 CD/DVD 驅動器數量。

注意 1:除非 INT 2F\AX=150Bh 函式(8.03-17)預先確認所需的模組已載入,否則不應呼叫 INT 2F\AX=1501h 函式,該函式由 CD/DVD 檔案系統轉換器(5.08-03 或 5.08-04)的駐留模組執行。

注意 2:在 WINDOWS 作業系統下的“DOS 框”內呼叫時,INT 2F\AX=1501h 函式將返回 AX=0000h 和無效的頭地址。

8.03-15 INT 2F\AX=1505h – 讀取 CD/DVD 的目錄表

[編輯 | 編輯原始碼]

準備:AX = 1505h CX – CD/DVD 驅動器編號(0002h = C:,0003h = D:,等等)DX – 扇區索引(注意 2)ES:BX – 指向已準備好的 2048 位元組緩衝區的指標。

返回值:如果出錯,則 CF 標誌位設定,AL – 錯誤程式碼:AL = 15h – 無效驅動器編號;= 21h – 驅動器未準備好或驅動器中沒有介質。CF 標誌位的清除狀態表示任務成功完成,然後:AL – 卷標描述符型別:= 01h – 標準卷標描述符;= FFh – 最後一個卷標描述符;= 00h – 任何其他卷標描述符型別。ES:BX – 指向包含目錄表的 2048 位元組緩衝區的指標。

注意 1:除非 INT 2F\AX=150Bh 函式(8.03-17)預先確認所需的模組已載入,否則不應呼叫 INT 2F\AX=1505h 函式,該函式由 CD/DVD 檔案系統轉換器(5.08-03 或 5.08-04)的駐留模組執行。

注意 2:一張 CD/DVD 光碟可能有多個卷標描述符:扇區索引 0000h 對應第一個描述符,扇區索引 0001h 對應第二個描述符,等等。

8.03-16 INT 2F\AX=1508h–1509h – 絕對 CD/DVD 讀取/寫入

[編輯 | 編輯原始碼]

準備:AX = 1508h – 讀取 CD/DVD 扇區 = 1509h – 寫入 CD/DVD 扇區(注意 3)CX – CD/DVD 驅動器編號(0002h = C:,0003h = D:,等等)DX – 要讀取或寫入的扇區數量 ES:BX – 指向緩衝區的指標(包含寫入函式的資料)SI:DI – 起始扇區編號

返回值:如果出錯,則 CF 標誌位設定,AL – 錯誤程式碼:AL = 0Fh – 無效驅動器;= 15h – 驅動器繁忙或驅動器中沒有介質。CF 標誌位的清除狀態表示任務成功完成,然後在讀取操作後,ES:BX 緩衝區將填充讀取的資料。

注意 1:除非 INT 2F\AX=150Bh 函式(8.03-17)預先確認所需的模組已載入,否則不應呼叫 INT 2F\AX=1508h–1509h 函式,該函式由 CD/DVD 檔案系統轉換器(5.08-03 或 5.08-04)的駐留模組執行。

注意 2:在 WINDOWS 作業系統下的“DOS 框”內呼叫時,INT 2F\AX=1508h–1509h 函式始終返回錯誤程式碼 AL=15h。

注意 3:早期版本的 CD/DVD 檔案系統轉換器程式(5.08-03 和 5.08-04)不支援寫入操作。此外,寫入函式需要 CD/DVD 驅動器的硬體支援。

8.03-17 INT 2F\AX=150Bh – 關於 CD/DVD 驅動器的請求

[編輯 | 編輯原始碼]

準備:AX = 150Bh CX – CD/DVD 驅動器編號(0002h = C:,0003h = D:,等等)

返回時:BX = ADADh,– 一個簽名,確認 CD/DVD 檔案系統轉換器 (5.08-03 或 5.08-04) 模組已載入並處於活動狀態。AX = 0000h – 此零值表示 CD/DVD 檔案系統轉換器 (5.08-03 或 5.08-04) 無法控制請求的驅動器。

8.03-18 INT 2F\AX=150Dh – 獲取 CD/DVD 驅動器的驅動器號

[edit | edit source]

準備:AX = 150Dh ES:BX – 指向驅動器號緩衝區的指標 (每個驅動器 1 位元組)

返回時:ES:BX – 指向已填充驅動器號的緩衝區的指標 (02h = C:,03h = D:,依此類推)。驅動器號列表以位元組 00h 結束。

注意 1:除非 INT 2F\AX=150Bh 函式 (8.03-17) 事先確認所需模組已載入,否則不應呼叫 INT 2F\AX=150Dh 函式,該函式由 CD/DVD 檔案系統轉換器 (5.08-03 或 5.08-04) 的駐留模組執行。

8.03-19 INT 2F\AX=150Fh – 複製 CD/DVD 目錄項

[edit | edit source]

準備:AX = 150Fh CH = 00h – 直接複製“按原樣”,不進行轉換 = 01h – 複製並轉換為規範形式 (A.09-6) CL – CD/DVD 驅動器號 (02h = C:,03h = D:,依此類推) ES:BX – 指向路徑名的指標,以 00h 位元組結尾 SI:DI – 指向緩衝區的指標,直接複製的最小值為 255 位元組

返回時:如果發生錯誤,則設定 CF 標誌,AX 返回錯誤程式碼 (A.06-1)。CF 標誌的清除狀態表示成功終止,然後 SI:DI – 指向已填充目錄資料的緩衝區的指標 AX = 0000h – 如果磁碟為 High Sierra 格式,= 0001h – 如果磁碟為 ISO 9660 格式。

注意 1:除非 INT 2F\AX=150Bh 函式 (8.03-17) 事先確認所需模組已載入,否則不應呼叫 INT 2F\AX=150Fh 函式,該函式由 CD/DVD 檔案系統轉換器 (5.08-03 或 5.08-04) 的駐留模組執行。

8.03-20 INT 2F\AX=160Ah – Windows 作業系統環境測試

[edit | edit source]

準備:AX = 160Ah

返回時:AX = 0000h,如果 Windows 作業系統響應此測試 BH:BL – Windows 作業系統的版本 CX – 安裝型別 (0002h = 標準,0003h = 增強)

注意 1:AX 暫存器中返回值不為零並不表示呼叫程式不是在 Windows 作業系統或其“DOS 框”中執行的。原因是在 Windows 的設定中有一個名為“阻止 DOS 程式檢測 Windows”的標誌。當設定此標誌時,Windows 作業系統不會響應 INT 2F\AX=160Ah 測試。

8.03-21 INT 2F\AX=1687h – 對 DPMI 伺服器的試用請求

[edit | edit source]

DPMI 伺服器為應用程式提供擴充套件的 API 函式,這些函式旨在在 CPU 的 V86 模式下執行。透過對 DPMI 伺服器的請求,可以啟用 INT 31 處理程式,這使得可以安裝新的保護模式中斷處理程式,並向保護模式作業系統傳送資源請求。用於 DOS 的 DPMI 伺服器 (QDPMI.SYS、CWSDPMI.EXE 等) 現在並不流行,因為 Windows 作業系統提供自己的 DPMI 伺服器,並且始終可用。從 Windows 的“DOS 框”傳送的 DPMI 伺服器的試用請求始終會收到積極的響應,即使 Windows 作業系統沒有合法地顯示自身 (8.03-20 的註釋 1)。此外,對試用請求的積極響應是 CPU 的 V86 模式的充分證據。由於這些原因,INT 2F\AX=1687h 函式可能需要,儘管 MS-DOS7 不包含 DPMI 伺服器,並且本書中沒有描述 DPMI 函式的使用方法。

準備:AX = 1687h

返回時:AX = 0000h – 此零值表示 DPMI 伺服器已載入;BX – 設定位 0 的狀態表示支援 32 位程式;CL – CPU 型別 (02h – 80286,03h – 80386,04h – 80486,…);DH:DL – DPMI 伺服器版本;SI – DPMI 伺服器資料塊的大小 (以 16 位元組段為單位);ES:DI – INT 31 處理程式啟用入口點的地址。

注意 1:DOS 的 DPMI 伺服器環境與 Windows“DOS 框”之間的區別在於,後者無法訪問 BIOS 定時器 (8.01-73) 和 VCPI 函式 (8.03-71 – 8.03-73)。

注意 2:在“Caldera Open DOS”作業系統中,DPMI 伺服器已整合到 EMM386.EXE 驅動程式中。

8.03-22 INT 2F\AX=4300h – XMS 驅動程式的活動測試

[edit | edit source]

準備:AX = 4300h

返回時:AL = 80h – 此值確認 XMS 驅動程式 HIMEM.SYS (5.04-01) 已載入並處於活動狀態。任何其他返回的 AL 值表示 XMS 函式不可用。

8.03-23 INT 2F\AX=4310h – 獲取 XMS 驅動程式的入口點

[edit | edit source]

INT 2F\AX=4310h 函式返回 HIMEM.SYS (5.04-01) 驅動程式的入口點地址。表 A.12-3 中列出的各種 XMS 函式可以透過指向此入口點的 CALL FAR 命令 (7.03-08) 來呼叫。

準備:AX = 4310h

返回時:ES:BX – XMS 驅動程式入口點 (5.04-01) 的地址。

注意 1:除非 INT 2F\AX=4300h 函式 (8.03-22) 事先確認所需模組已載入,否則不應呼叫 INT 2F\AX=4310h 函式,該函式由 HIMEM.SYS 驅動程式 (5.04-01) 的駐留模組執行。

注意 2:對 XMS 函式的呼叫,包括 INT 2F\AX=4310h 和透過 CALL FAR 命令的呼叫,至少需要 256 位元組的可用堆疊空間。

8.03-24 INT 2F\AX=4B52h – KEYRUS.COM 驅動程式的函式 (5.02-05)

[edit | edit source]

準備:AX = 4B52h (= 'KR') BL – 子函式:= 00h – 安裝檢查;= 4Ch – 切換到美國鍵盤佈局;= 90h – 切換到國家/地區 (俄語) 鍵盤佈局

返回時:如果 KEYRUS.COM 驅動程式 (5.02-05) 已載入,則 AL = 82h – 簽名,確認驅動程式處於活動狀態;BH:BL – KEYRUS.COM 驅動程式的版本號;ES 值未保留。

8.03-25 INT 2F\AX=AD00h – DISPLAY.SYS 驅動程式的安裝檢查

[edit | edit source]

準備:AX = AD00h

返回時:AL = FFh – 簽名,確認 DISPLAY.SYS 驅動程式 (5.02-02) 已安裝,並且其函式可用。BX 暫存器的內容可能會更改。

8.03-26 INT 2F\AX=AD01h–AD02h – 設定/獲取活動內碼表

[edit | edit source]

INT 2F\AX=AD01h–AD02h 函式由 DISPLAY.SYS 驅動程式 (5.02-02) 的駐留模組執行。在傳送對其中任何一個函式的呼叫之前,您必須使用 INT 2F\AX=AD00h 函式 (8.03-25) 檢查所需駐留模組是否已安裝。

準備:AX = AD01h – 將活動內碼表替換為另一個內碼表 = AD02h – 獲取活動內碼表的編號 (A.02-2) BX – 新內碼表的十六進位制編號 (僅限 AX = AD01h)

返回時:如果發生錯誤,則設定 CF 標誌,AX 和 BX 的內容將不會保留。CF 標誌的清除狀態表示成功,然後在 AX=AD02h 呼叫之後,只有 BX – 當前內碼表的十六進位制編號。

8.03-27 INT 2F\AX=AD03h – 獲取內碼表資訊

[edit | edit source]

INT 2F\AX=AD03h 函式由 DISPLAY.SYS 驅動程式 (5.02-02) 的駐留模組執行。在傳送此函式的呼叫之前,必須使用 INT 2F\AX=AD00h 函式 (8.03-25) 檢查是否安裝了所需的駐留模組。

準備:AX = AD03h ES:DI – 指向內碼表資訊的緩衝區的指標 CX – 緩衝區的大小(以位元組為單位)(A.02-6)

返回:發生錯誤時設定 CF 標誌。可能原因:準備好的緩衝區太小。CF 標誌的清除狀態表示成功終止,然後 ES:DI – 指向填充有資料塊的緩衝區的指標 (A.02-6)。

8.03-28 INT 2F\AX=AD80h – 檢查 KEYB.COM 驅動程式的安裝

[編輯 | 編輯原始碼]

準備:AX = AD80h

返回:AL = FFh – 簽名,確認 KEYB.COM 驅動程式 (5.02-04) 已安裝,其功能可用;BH:BL – KEYB.COM 驅動程式的版本號;ES:DI – 指向 KEYB.COM 驅動程式的資料塊的指標;AH 暫存器的內容可能會改變。

8.03-29 INT 2F\AX=AD81h – 設定鍵盤的內碼表

[編輯 | 編輯原始碼]

INT 2F\AX=AD81h 函式由 KEYB.COM 驅動程式 (5.02-04) 的駐留模組執行。在傳送此函式的呼叫之前,必須使用 INT 2F\AX=AD80h 函式 (8.03-28) 檢查是否安裝了所需的駐留模組。

準備:AX = AD81h BX – 提議的內碼表的十六進位制編號 (A.02-2)

返回:發生錯誤時設定 CF 標誌,然後 AX = 0001h 值表示提議的內碼表不可用。CF 標誌的清除狀態表示成功終止。

8.03-30 INT 2F\AX=AD82h–AD83h – 設定/獲取鍵盤的佈局

[編輯 | 編輯原始碼]

INT 2F\AX=AD82h–AD83h 函式由 KEYB.COM 驅動程式 (5.02-04) 的駐留模組執行。在傳送這兩個函式的任何一個的呼叫之前,必須使用 INT 2F\AX=AD80h 函式 (8.03-28) 檢查是否安裝了所需的駐留模組。

準備:AX = AD82h – 設定鍵盤的佈局 = AD83h – 獲取當前鍵盤的佈局 BL – 子函式(僅限於 AX = AD82h 函式):= 00h – 切換到美國佈局(就像可以透過 CTRL-ALT-F1 鍵組合切換一樣) = FFh – 切換到國家佈局(就像可以透過 CTRL-ALT-F2 鍵組合切換一樣)

返回:發生錯誤時設定 CF 標誌。可能原因:BL 值無效。CF 標誌的清除狀態表示成功,然後僅在 AX=AD83h 呼叫之後 BL = 00h – 美國佈局;= FFh – 國家佈局。

8.03-31 INT 33\AX=0000h – 滑鼠驅動程式狀態和重置

[編輯 | 編輯原始碼]

重置操作將滑鼠驅動程式恢復到其預設狀態:移動和滾輪計數器重置為零,滑鼠游標變為不可見,並放置在螢幕頁面 0 的中心(應呼叫函式 INT 33\AX=0001h 以使游標可見)。除了重置之外,INT 33\AX=0000h 函式還可以用來確定是否安裝了滑鼠驅動程式以及是否有可用的滑鼠指向裝置。

準備:AX = 0000h

返回:AX = 0000h 值表示滑鼠驅動程式未載入(註釋 2)。= FFFFh 值表示滑鼠驅動程式已載入,然後 CX = 0000h – 滑鼠按鈕的數量不是兩個;= 0002h(以及 FFFFh)– 使用了雙鍵滑鼠;= 0003h – 使用了 Mouse Systems/Logitech 三鍵滑鼠。

註釋 1:如果影片模式已更改,則在將重置應用於滑鼠驅動程式之前,應清除影片模式更改標誌(註釋 2 到 INT 33\AX=0028h,8.03-52)。

註釋 2:MS-DOS7 使用對 IRET 命令的引用填充中斷表中的空單元格(直到 INT 3F)(7.03-30)。當滑鼠驅動程式未載入時,此 IRET 命令只是返回初始 AX 值,保持不變。如果不需要重置操作,則應使用 INT 33\AX=0021h 函式 (8.03-49) 報告滑鼠驅動程式的狀態。

8.03-32 INT 33\AX=0001h–0002h – 顯示/隱藏滑鼠游標

[編輯 | 編輯原始碼]

準備:AX = 0001h – 顯示滑鼠游標 = 0002h – 隱藏滑鼠游標

註釋 1:如果程式呼叫了 INT 33\AX=0001h 函式來顯示滑鼠游標,則此程式在終止之前必須隱藏滑鼠游標,從而恢復原始狀態。除此之外,每次在螢幕上的影像重新繪製之前,都應隱藏滑鼠游標,但在後一種情況下,最好使用 INT 33\AX=0010h 函式 (8.03-42) 在本地隱藏游標。

註釋 2:隱藏滑鼠游標的多次呼叫將需要多次呼叫來取消隱藏。使用 INT 33\AX=002Ah 函式 (8.03-53) 報告顯示滑鼠游標的掛起禁止的數量。

8.03-33 INT 33\AX=0003h – 按鈕狀態、游標和滾輪位置

[編輯 | 編輯原始碼]

準備:AX = 0003h

返回:BH – 自上次呼叫以來的 8 位帶符號滾輪移動量(註釋 1 到 8.03-33) BL – 滑鼠按鈕狀態位元組(註釋 2 到 8.03-33) CX – 游標的水平 X 座標(註釋 1 到 8.03-53) DX – 游標的垂直 Y 座標(註釋 1 到 8.03-53)

註釋 1:如果滑鼠裝置中存在滾輪並且滑鼠驅動程式支援滾輪,則會報告滾輪移動量。應透過呼叫 INT 33\AX=0011h 函式 (8.03-43) 檢查這兩個條件。正移動量對應於向下滾輪移動。滾輪移動計數器透過呼叫 INT 33\AX=0003h 函式以及透過 INT 33\AX=0005h 或 INT 33\AX=0006h 函式 (8.03-35) 傳送到此計數器的請求來重置。

註釋 2:按鈕狀態位元組報告那些尚未釋放的按鈕的狀態。按鈕狀態位元組中位 0 和 1 的設定狀態對應於滑鼠左鍵和右鍵的按下狀態。如果滑鼠裝置中存在中間按鈕並且滑鼠驅動程式支援它,則位 2 的設定狀態對應於中間按鈕的按下狀態。

註釋 3:在文字影片模式下,座標以字元單元格大小的倍數報告。

8.03-34 INT 33\AX=0004h – 設定滑鼠游標的位置

[編輯 | 編輯原始碼]

準備:AX = 0004h CX – 游標的 X 座標(在影片模式 3 中為 0000h–0280h) DX – 游標的 Y 座標(在影片模式 3 中為 0000h–00C0h)

註釋 1:使用 INT 33\AX=0026h 函式 (8.03-51) 以及 INT 33\AX=0031h 函式 (8.03-54) 報告任何當前影片模式的最大座標值。

註釋 2:在文字影片模式下,座標值會自動四捨五入到最接近的較低字元單元格大小的倍數。

8.03-35 INT 33\AX=0005h–0006h – 按鈕和滾輪的狀態事件

[編輯 | 編輯原始碼]

準備:AX = 0005h – 請求有關按鈕按下或滾輪事件的資訊 = 0006h – 請求有關按鈕釋放或滾輪事件的資訊 BX = 0000h – 請求有關左鍵事件的資訊 = 0001h – 請求有關右鍵事件的資訊 = 0002h – 請求有關中間按鈕事件的資訊 = FFFFh – 請求有關滾輪移動事件的資訊。

返回:AH – 自上次呼叫以來的 8 位帶符號滾輪移動量(註釋 1 到 8.03-33) AL – 按鈕狀態位元組(註釋 2 到 8.03-33) BX – 在請求按鈕事件之後:自上次呼叫相同函式以來的按鈕事件數量(按下或釋放);– 在請求滾輪移動事件之後:自上次呼叫以來的 16 位帶符號滾輪移動量(註釋 1 到 8.03-33) CX – 最後請求事件(按下或釋放或滾輪旋轉)發生時的滑鼠游標的水平 X 座標;DX – 最後請求事件(按下或釋放或滾輪旋轉)發生時的滑鼠游標的垂直 Y 座標。

註釋 1:如果自上次呼叫這些函式以來,尚未對請求的按鈕發生任何請求的事件,則返回 BX、CX 和 DX 暫存器中的零值。

8.03-36 INT 33\AX=0007h–0008h – 定義滑鼠游標的範圍

[編輯 | 編輯原始碼]

準備:AX = 0007h – 定義游標的水平範圍 = 0008h – 定義游標的垂直範圍 CX – 座標值的較低限制(註釋 2 到 8.03-34) DX – 座標值的上限(註釋 2 到 8.03-34)

註釋 1:如果滑鼠游標超出所需範圍,則 INT 33\AX=0007h–0008h 函式會將游標的位置移到允許範圍內的最接近的邊界。

8.03-37 INT 33\AX=0009h – 圖形影片模式下的滑鼠游標

[edit | edit source]

準備: AX = 0009h BX – 游標熱點水平偏移量(從 -16 到 +16) CX – 游標熱點垂直偏移量(從 -16 到 +16) ES:DX – 指向點陣圖掩碼塊的指標(注 1)。

注 1:點陣圖掩碼塊包含螢幕掩碼和游標掩碼,每個掩碼長度為 16 位元組。螢幕掩碼從偏移量 00h 開始,游標掩碼從偏移量 20h 開始。掩碼中的每個字定義螢幕線上十六個畫素。每個字的最低有效位對應最右邊的畫素。螢幕掩碼與影片記憶體內容透過邏輯 AND 運算疊加,然後游標掩碼與結果透過邏輯 XOR 運算疊加。

注 2:當前游標的熱點位置由 INT 33\AX=002Ah 函式返回(8.03-53)。

8.03-38 INT 33\AX=000Ah – 文字影片模式下的滑鼠游標

[edit | edit source]

準備: AX = 000Ah BX = 0000h – 軟體定義的游標(注 1) = 0001h – 硬體定義的游標(注 2) CX – 螢幕掩碼(如果 BX=0000h),或起始掃描行(如果 BX=0001h) DX – 游標掩碼(如果 BX=0000h),或最後一個掃描行(如果 BX=0001h)

注 1:如果選擇了軟體定義,則影片記憶體中游標位置的字元/顏色內容將與螢幕掩碼進行位與位邏輯 AND 運算,然後結果與游標掩碼進行位與位邏輯 XOR 運算。來自 CH 和 DH 暫存器的掩碼位元組疊加在影片記憶體中的顏色位元組(A.10-5)上。例如,如果 CX=0000h,則游標獲取由其在 DL 中的 ASCII 碼定義的字元形式;其顏色由 DH 中的位元組 0-3 根據表 A.10-5 定義。DH 中的位元組 4-6 定義背景顏色,第 7 個位元組控制閃爍。CH 暫存器中位 4-6 的非零值使顏色依賴於原始影片記憶體內容,從而使游標在任何背景影像上更明顯。

注 2:如果選擇了硬體定義,則游標是一個閃爍的條形或一個閃爍的矩形。例如,值 CX=0002h DX=0003h 將滑鼠游標定義為字元行上方的條形;值 CX=0003h DX=0004h 將滑鼠游標定義為下劃線。

8.03-39 INT 33\AX=000Bh – 讀取滑鼠運動計數器

[edit | edit source]

準備: AX = 000Bh

返回值: CX – 自上次呼叫 INT 33\AX=000Bh 後的水平偏移量 DX – 自上次呼叫 INT 33\AX=000Bh 後的垂直偏移量

注 1:滑鼠游標的偏移量以步長(“米奇”)計算,這是滑鼠可以感知的最小位置增量。Microsoft 的驅動程式將正偏移量分配給向下運動和向右運動。畫素和滑鼠步長(“米奇”)之間的對應關係可以透過 INT 33\AX=000Fh 函式(8.03-41)設定。

注 2:INT 33\AX=0027h 函式也只接受 AX 值,並在 CX 和 DX 中返回相同的偏移量,但除此之外,根據軟體或硬體游標定義(8.03-38)返回:在暫存器 AX 中 – 螢幕掩碼或游標的起始掃描行,在暫存器 BX 中 – 游標掩碼或游標的最後一個掃描行。

8.03-40 INT 33\AX=000Ch – 滑鼠驅動程式對駐留子例程的呼叫

[edit | edit source]

準備: AX = 000Ch CX – 子例程呼叫條件的掩碼: 位 0 設定: – 滑鼠移動時呼叫 位 1 設定: – 左鍵按下時呼叫 位 2 設定: – 左鍵釋放時呼叫 位 3 設定: – 右鍵按下時呼叫 位 4 設定: – 右鍵釋放時呼叫 位 5 設定: – 中鍵按下時呼叫 位 6 設定: – 中鍵釋放時呼叫 位 7 設定: – 輪子旋轉時呼叫(注 1 到 8.03-33) ES:DX – 指向 CALL FAR 命令的子例程入口的指標。(7.03-08)

注 1:在 CX 暫存器中,可以指定多個條件,然後滑鼠驅動程式在滿足指定條件之一時呼叫子例程。CX 暫存器中位 15-8 的狀態被忽略。CX 暫存器中位 7-5 的狀態僅由支援相應滑鼠功能的驅動程式考慮。

注 2:駐留子例程以以下暫存器狀態呼叫

AX – 呼叫條件(與 CX 掩碼中相同的位分配)
BH – 自上次呼叫以來的有符號輪子移動量(注 1 到 8.03-33)
BL – 按鈕狀態位元組(注 2 到 8.03-33)
CX – 游標的水平座標(注 2 到 8.03-34)
DX – 游標的垂直座標(注 2 到 8.03-34)
SI – 水平游標偏移量(注 1 到 8.03-39)
DI – 垂直游標偏移量(注 1 到 8.03-39)。

注 3:INT 33\AX=0014h 函式能夠用新的值替換呼叫掩碼和子例程入口地址,這些新的值在 CX 和 ES:DX 暫存器中以類似方式指定;返回值 CX 和 ES:DX 暫存器包含相應替換的舊值。

注 4:如果程式指定了對駐留子例程的滑鼠呼叫,則在程式終止之前必須停用此滑鼠呼叫。為此,應使用 CX 暫存器中為 0000h 的掩碼再次呼叫 INT 33\AX=000Ch 函式。

注 5:Microsoft 的滑鼠驅動程式能夠呼叫最多四個不同的駐留子例程。第一個子例程必須由 INT 33\AX=000Ch 函式指定,其餘三個子例程可以透過 INT 33\AX=0018h 函式(8.03-45)指定。

8.03-41 INT 33\AX=000Fh – 滑鼠偏移量記錄的靈敏度

[edit | edit source]

準備: AX = 000Fh CX – 每 8 個畫素的水平步長數(預設值為 8) DX – 每 8 個畫素的垂直步長數(預設值為 16)。

8.03-42 INT 33\AX=0010h – 對游標顯示的區域性禁止

[edit | edit source]

當滑鼠的游標在螢幕上移動時,滑鼠的驅動程式會在滑鼠的游標移動到的每個位置恢復以前的螢幕影像。滑鼠驅動程式恢復以前影像內容的操作可能會干擾前臺程式執行的螢幕影像更新過程。如果在螢幕影像的更新部分隱藏滑鼠游標,可以避免這種干擾。與 INT 33\AX=0002h 函式(8.03-32)隱藏整個螢幕的滑鼠游標不同,對游標顯示的區域性禁止使游標的閃爍幾乎不可察覺。當局部影像更新過程結束時,應透過呼叫 INT 33\AX=0001h 函式(8.03-32)使滑鼠游標可見。

準備: AX = 0010h CX – 禁止區域左上角的水平 X 座標 DX – 禁止區域左上角的垂直 Y 座標 SI – 禁止區域右下角的水平 X 座標 DI – 禁止區域右下角的垂直 Y 座標。

8.03-43 INT 33\AX=0011h – 指示裝置滾輪支援檢查

[edit | edit source]

準備: AX = 0011h

返回值: AX = 574Dh – 確認驅動程式支援滾輪的簽名(注 1) CX – 位 0 設定表示滑鼠指示裝置具有滾輪。BX 內容可能會被更改。

注 1:GMOUSE.COM 驅動程式(5.03-01)版本 9.06+ 對 INT 33\AX=0011h 函式的呼叫做出響應,AX = FFFFh 簽名。這意味著驅動程式不支援指示裝置滾輪,但在 BX 暫存器中返回滑鼠的活動按鈕數量。

8.03-44 INT 33\AX=0016h–0017h – 儲存/恢復滑鼠驅動程式的狀態

[edit | edit source]

準備: AX = 0016h – 將驅動程式的狀態記錄寫入準備好的緩衝區 = 0017h – 從緩衝區中的資料恢復滑鼠驅動程式的狀態 BX – 緩衝區的大小(注 2) ES:DX – 指向緩衝區的指標(對於 AX=0017h,它必須已填充)

返回值: ES:DX – 指向包含滑鼠驅動程式狀態記錄的緩衝區的指標。

注 1:滑鼠驅動程式狀態的恢復必須在與將驅動程式的狀態記錄寫入緩衝區時處於活動狀態的影片模式相同。

注 2:儲存驅動程式狀態記錄所需的緩衝區大小應事先透過 INT 33\AX=0015h 函式確定:所需大小(以位元組為單位)將在 BX 暫存器中返回。

8.03-45 INT 33\AX=0018h – 滑鼠驅動程式對駐留子例程的呼叫

[edit | edit source]

微軟的滑鼠驅動程式能夠呼叫最多四個不同的駐留子程式。第一個子程式必須由 INT 33\AX=000Ch 函式指定(8.03-40),其餘三個子程式可以由 INT 33\AX=0018h 函式指定。

準備:AX = 0018h CX – 子程式呼叫條件掩碼

位 0 設定:– 滑鼠移動時呼叫
位 1 設定:– 左鍵按下時呼叫
位 2 設定:– 左鍵釋放時呼叫
位 3 設定:– 右鍵按下時呼叫
位 4 設定:– 右鍵釋放時呼叫
位 5 設定:– 在 SHIFT 鍵按下狀態下呼叫(注 1)
位 6 設定:– 在 CTRL 鍵按下狀態下呼叫(注 1)
位 7 設定:– 在 ALT 鍵按下狀態下呼叫(注 1)

ES:DX – CALL FAR 指令的子程式入口指標。(7.03-08)

返回時:AX = 0018h – 成功終止的簽名;AX = FFFFh – 失敗的簽名。

注 1:由 INT 33\AX=0018h 函式註冊的子程式,當任何“功能”鍵(SHIFT、CTRL、ALT)按下時都會被呼叫,因此 CX 掩碼中的位 7–5 至少要設定一個。CX 暫存器中位 15–8 的狀態將被忽略。CX 掩碼中位 4–0 的狀態將根據邏輯或運算來考慮:當這些條件中的任何一個滿足時,如果同時按下了指定的“功能”鍵,則會呼叫子程式。

注 2:當滑鼠驅動程式呼叫子程式時,它會在暫存器中保留文章 8.03-40 注 2 中列出的那些值。

注 3:為了停止對某個子程式的呼叫,INT 33\AX=0018h 函式應再次呼叫,CX 暫存器中使用相同的掩碼字,但在 ES:DX 暫存器中使用 0000:0000h 入口點地址。

注 4:INT 33\AX=0018h 函式從版本 6.0 開始由微軟的滑鼠驅動程式支援,但不一定受其他供應商的滑鼠驅動程式支援。

8.03-46 INT 33\AX=0019h – 子程式入口點地址

[edit | edit source]

響應對 INT 33\AX=0019h 函式的呼叫,微軟的滑鼠驅動程式會返回那個 TSR 子程式的入口點地址,該子程式已經由 INT 33\AX=0018h 函式(8.03-45)註冊,並在 CX 暫存器中指定了呼叫條件掩碼。返回的資料稍後可供任何前臺程式使用,以恢復特定子程式的活動。

準備:AX = 0019h CX – 呼叫條件掩碼(8.03-45)

返回時:CX = 0000h – 錯誤:未找到具有提交掩碼的 TSR。任何其他結果都表示成功,然後 BX:DX – 找到的 TSR 子程式的入口點地址;CX – 子程式呼叫條件的實際掩碼(8.03-45)。

8.03-47 INT 33\AX=001Dh–001Eh – 滑鼠游標的螢幕頁碼

[edit | edit source]

準備:AX = 001Dh – 定義滑鼠游標的螢幕頁碼 = 001Eh – 報告當前游標的螢幕頁碼 BX – 要訪問的螢幕頁碼(僅限 INT 33\AX=001Dh)

返回時:BX – 當前螢幕頁碼(僅限 INT 33\AX=001Eh 之後)

8.03-48 INT 33\AX=001Fh–0020h – 停用/重新啟用滑鼠驅動程式

[edit | edit source]

準備:AX = 001Fh – 停用滑鼠驅動程式 = 0020h – 重新啟用滑鼠驅動程式

返回時:AX = FFFFh – 失敗的簽名。成功時,AX 值將保持不變。

注 1:INT 33\AX=001Fh 函式會恢復 INT 10 和 INT 74 處理程式的中斷表中的地址,這些地址在載入滑鼠驅動程式之前就存在。

注 2:如果由滑鼠驅動程式設定的中斷處理程式地址被 INT 33\AX=001Fh 函式從中斷表中刪除,那麼 INT 33\AX=0020h 函式就可以將這些地址寫回中斷表。

注 3:成功終止後,INT 33\AX=001Fh 函式會在 ES:BX 暫存器中返回在安裝滑鼠驅動程式之前位於中斷表中的 INT 33 處理程式的地址。如果前臺程式將該地址寫回中斷表,那麼透過中斷呼叫滑鼠驅動程式的可能性將完全消除。

8.03-49 INT 33\AX=0021h – 滑鼠驅動程式安裝測試

[edit | edit source]

準備:AX = 0021h

返回時:當未安裝滑鼠驅動程式時,最可能的是 AX = 0021h。AX= FFFFh 值確認已安裝滑鼠驅動程式,然後 BX – 滑鼠按鈕的數量(注 2)。

注 1:MS-DOS7 會用指向 IRET 命令的引用來填充中斷表中的空單元格(最多 INT 3F)(7.03-30)。當未載入滑鼠驅動程式時,此 IRET 命令只會返回初始 AX 值不變。INT 33\AX=0000h 函式(8.03-31)也會報告滑鼠驅動程式的狀態,該函式也會將驅動程式重置為初始狀態。INT 33\AX=0021h 函式不會將滑鼠驅動程式重置為初始狀態,但會重置滾輪移動計數器。

注 2:在識別出 2 鍵滑鼠後,一些滑鼠驅動程式會返回 BX = FFFFh。

8.03-50 INT 33\AX=0024h – 滑鼠型別和 IRQ 設定

[edit | edit source]

準備:AX = 0024h

返回時:AX = FFFFh – 滑鼠裝置識別失敗的簽名。AX 中的任何其他值都表示成功,然後 BH.BL – 滑鼠驅動程式版本 CH – 滑鼠指示裝置型別和連線:= 00h – 滑鼠指示裝置未連線;= 01h – 滑鼠透過擴充套件卡連線;= 02h – 滑鼠連線到序列埠;= 04h – 滑鼠連線到 PS/2 埠;= 05h – 特殊的惠普滑鼠。CL – 十六進位制 IRQ 號碼(PS/2 埠除外,CL=00h)。

8.03-51 INT 33\AX=0026h – 游標的最大座標值

[edit | edit source]

準備:AX = 0026h

返回時:BX 暫存器中的非零值表示錯誤。BX = 0000h – 成功終止的簽名,然後 CX – 當前影片模式的最大水平 X 座標 DX – 當前影片模式的最大垂直 Y 座標。

注 1:INT 33\AX=0026h 函式報告整個螢幕的游標座標值。如果游標區域限制在某些範圍內(8.03-36),則應使用 INT 33\AX=0031 函式(8.03-54)確定允許的最小和最大座標值。

注 2:除非透過 INT 33\AX=0032h(8.03-55)確認滑鼠驅動程式支援此功能,否則不應呼叫 INT 33\AX=0026h 函式。

8.03-52 INT 33\AX=0028h – 始終如一的影片模式更改

[edit | edit source]

由於滑鼠游標是透過直接訪問影片記憶體繪製的,因此滑鼠驅動程式的干預必須符合影片記憶體中當前資料的格式。但是,不同的影片模式定義了不同的資料格式。因此,每次更改影片模式時,都必須與滑鼠驅動程式使用的影片資料格式更改相協調。INT 33\AX=0028h 函式提供了一種機會,可以為影片記憶體和滑鼠驅動程式進行一致的影片模式更改,這樣就不會影響滑鼠游標的外觀和移動。

準備:AX = 0028h CX – 提議的影片模式程式碼(A.10-1) DH – 字元單元的垂直大小(注 1) DL – 字元單元的水平大小(注 1)

返回時:CL 暫存器中的非零值表示失敗。CL = 00h – 成功終止的簽名。

注 1:零值 DH = DL = 00h 指定任何影片模式的預設字元單元大小。如果提議的影片模式不支援字元單元大小控制,那麼 DH 和 DL 暫存器中的任何值都會被忽略。

注 2:如果呼叫時 CX = 0000h,則不會設定影片模式,但會清除內部影片模式更改標誌。在每次呼叫滑鼠驅動程式的重置函式(8.03-31)之前,必須清除此標誌。

注 3:除非透過 INT 33\AX=0032h(8.03-55)確認滑鼠驅動程式支援此功能,否則不應呼叫 INT 33\AX=0028h 函式。

注 4:滑鼠驅動程式支援的影片模式程式碼列表可以透過對 INT 33\AX=0029h 函式進行多次連續呼叫來返回。第一次呼叫接受 CX = 0000h,並在 CX 中返回第一個支援的影片模式程式碼。第二次呼叫使用 CX 中的該程式碼不變,並在 CX 中返回下一個支援的影片模式程式碼,依此類推。一些滑鼠驅動程式會在 DS:DX 中返回指向包含影片模式描述的字串的指標;其他一些滑鼠驅動程式可能會在 DS:DX 中保留零值。呼叫迴圈的結束以返回零值 CX = 0000h 為標誌。

8.03-53 INT 33\AX=002Ah – 滑鼠游標的引數

[edit | edit source]

準備: AX = 002Ah

返回時: AX – 顯示滑鼠游標的待處理禁令數(8.03-32) BX – 游標熱點的水平 X 偏移量(注 1) CX – 游標熱點的垂直 Y 偏移量(注 1) DX – 滑鼠型別,由 INT 33\AX=0024h(8.03-50)返回的 CH。

注 1:游標座標相對於游標塊的左上角進行計數,但游標指向其熱點。熱點相對於游標塊左上角的偏移量對於兩個座標都可能在 -128 到 +127 之間。

注 2:除非透過 INT 33\AX=0032h(8.03-55)確認滑鼠驅動程式支援此函式,否則不應呼叫 INT 33\AX=002Ah 函式。

8.03-54 INT 33\AX=0031h – 獲取當前座標範圍

[edit | edit source]

INT 33\AX=0031h 函式報告當前範圍限制的值,當可用滑鼠游標區域被 INT 33\AX=0007h–0008h(8.03-36)設定的虛擬視窗限制時。

準備: AX = 0031h

返回時: AX – 水平 X 座標的最小值 BX – 垂直 Y 座標的最小值 CX – 水平 X 座標的最大值 DX – 垂直 Y 座標的最大值

注 1:當可用游標區域不受視窗限制時,座標範圍應由 INT 33\AX=0026h 函式(8.03-51)報告。

注 2:除非透過 INT 33\AX=0032h(8.03-55)確認滑鼠驅動程式支援此函式,否則不應呼叫 INT 33\AX=0031h 函式。

8.03-55 INT 33\AX=0032h – 滑鼠驅動程式支援的函式

[edit | edit source]

準備: AX = 0032h

返回時: AX – 一個標誌字,其中每一位表示對從 INT 33\AX=0034h 到 INT 33\AX=0025h 的滑鼠驅動程式函式的支援。

位 3 設定: – 支援 INT 33\AX=0031h;
位 10 設定: – 支援 INT 33\AX=002Ah;
位 11 設定: – 支援 INT 33\AX=0029h;
位 12 設定: – 支援 INT 33\AX=0028h;
位 14 設定: – 支援 INT 33\AX=0026h。

BX、CX、DX 暫存器的內容不會被儲存。

8.03-56 INT 4A – 報警處理程式鉤子

[edit | edit source]

預設 INT 4A 處理程式只是將控制權返回給呼叫程式。呼叫程式的作用屬於 BIOS 的即時時鐘報警,如果它透過 INT 1A\AH=06h 函式(8.01-94)設定為某個時間。建議應用程式載入一個攔截 INT 4A 處理程式,該處理程式將在預定時間被呼叫以執行所需操作。

注 1:INT 4A 中斷是在硬體中斷處理程式內部呼叫的。因此,必須採取所有必要的預防措施來防止重新進入 DOS(8.02-70、8.02-87)。

8.03-57 INT 67\AH=41h – 獲取頁幀段

[edit | edit source]

預設情況下,EMM386.EXE 驅動程式(5.04-02)在高階記憶體(低於 1024 kb)中安排 4 個“物理”頁,分組到一個 64-kb 幀中。對擴充套件記憶體的訪問是透過動態對映擴充套件記憶體“邏輯”頁(超過 1088 kb)到頁幀內的這 16-kb“物理”頁來實現的。頁幀通常從段地址 E000h 開始。

準備: AH = 41h

返回時: AH – 錯誤程式碼(A.06-1);如果 AH = 00h,則 BX – 頁幀的段地址(4 個“物理”頁)。

注 1:除非透過 INT 67\AH=46h(8.03-62 注 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=41h 函式。

8.03-58 INT 67\AH=42h – 獲取 EMS 頁數

[edit | edit source]

根據 EMS 規範,EMM386.EXE 驅動程式提供了對擴充套件記憶體中從 1088 到 32768 kb 排列的選定“邏輯”16-kb 頁的訪問,除了由 /L 引數(5.04-02)為 XMS 驅動程式(5.04-01)安排的訪問保留的區域。INT 67\AH=42h 函式報告擴充套件記憶體中可供 EMM386.EXE 驅動程式使用的“邏輯”EMS 頁的統計資訊。

準備: AH = 42h

返回時: AH – 錯誤程式碼(A.06-1);如果 AH = 00h,則 BX – 未分配(空閒)“邏輯”EMS 頁數 DX – “邏輯”EMS 頁總數。

注 1:除非透過 INT 67\AH=46h(8.03-62 注 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=42h 函式。

8.03-59 INT 67\AH=43h – 分配一個控制代碼和擴充套件記憶體

[edit | edit source]

與 INT 21\AH=3Dh 函式(8.02-33)不同,EMM386.EXE 驅動程式(5.04-02)只分配那些引用擴充套件記憶體區域的控制代碼,這些區域超出 1088 kb 邊界。每個區域可能包含整數個“邏輯”16-kb 頁。任何特定“邏輯”頁的規範包括它在分配區域中的編號以及分配給該分配區域的控制代碼。

準備: AH = 43h BX – 請求的非零“邏輯”頁數,每個 16 kb。返回時: AH – 錯誤程式碼(A.06-1);如果 AH = 00h,則 DX – 包含請求頁數的區域的控制代碼。

注 1:除非透過 INT 67\AH=46h(8.03-62 注 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=43h 函式。

注 2:預設情況下,EMM386.EXE 驅動程式最多可以同時保持 64 個控制代碼處於活動狀態,但“h”引數(5.04-02)可以將活動控制代碼數增加到 255 個。

注 3:LIM EMS 規範版本 4.0 規定了具有相同任務的 INT 67\AX=5A00h 函式。唯一的區別是允許在 BX 暫存器中請求 0 個“邏輯”頁。

8.03-60 INT 67\AH=44h – 將“邏輯”頁對映到“物理”頁

[edit | edit source]

這裡的術語“對映”意味著對低於 1024 kb 的特定“物理”16-kb 頁的呼叫將由 CPU 自動轉移到擴充套件記憶體中超過 1088 kb 邊界處的指定“邏輯”16-kb 頁。

準備: AH = 44h AL – 選定“物理”16-kb 頁的編號;BX – 請求的“邏輯”16-kb 頁的編號,或者 = FFFFh – 為了使指定的“物理”頁變為空閒;DX – 包含請求“邏輯”頁的記憶體區域的控制代碼。

返回時: AH – 錯誤程式碼(A.06-1);AH = 00h 表示成功終止。

注 1:除非透過 INT 67\AH=46h(8.03-62 注 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=44h 函式。

注 2:記憶體頁的計數,“物理”和“邏輯”都從 0 號開始。

註釋 3:“物理”頁 00h–03h 構成頁面幀。頁面幀的地址由 INT 67\AH=41h 函式(8.03-57)報告。如果存在,“物理”頁 04h–1Bh 的位置可以透過 INT 67\AX=5800h 函式(8.03-70)報告。如果一個“物理”頁位於傳統記憶體(低於 640 kb),則該記憶體頁所佔用的記憶體空間必須由作業系統分配給打算使用該“物理”頁的程式。

8.03-61 INT 67\AH=45h – 釋放控制代碼和記憶體區域

[編輯 | 編輯原始碼]

當與控制代碼關聯的擴充套件記憶體的一部分不再需要時,控制代碼擁有者程式必須通知 EMM386.EXE 驅動程式(5.04-02)。在呼叫 INT 67\AH=45h 函式後,擴充套件記憶體的這一部分將被視為可用,並且關聯的控制代碼將被停用。

準備:AH = 45h DX – 要釋放的記憶體區域的控制代碼

返回時: AH – 錯誤程式碼(A.06-1);AH = 00h 表示成功終止。

註釋 1:INT 67\AH=45h 函式應該僅用於停用那些由 EMM386.EXE 驅動程式(5.04-02)在呼叫 INT 67\AX=5A00h 或 INT 67\AH=43h 函式(8.03-59)後分配的控制代碼。其他控制代碼應透過 INT 21\AH=68h、INT 21\AH=6Ah 或 INT 21\AH=3Eh 函式(8.02-34)停用。

註釋 2:對控制代碼的重複請求不能恢復對與已停用的控制代碼關聯的擴充套件記憶體頁面的訪問。

8.03-62 INT 67\AH=46h – 獲取 EMM386.EXE 驅動程式的版本

[編輯 | 編輯原始碼]

準備:AH = 46h

返回:AH – 錯誤程式碼 (A.06-1);如果 AH = 00h,則 AL – EMM386.EXE 驅動程式的版本號(5.04-02)。

註釋 1:儲存在中斷表 0000:019Eh 單元中的 INT 67 處理程式的地址指向處理程式頭的開頭。相對於處理程式頭開頭的偏移量 0Ah,EMM386.EXE 驅動程式寫入了簽名 EMMXXXX0。如果找不到此簽名,則無法呼叫 INT 67 處理程式的任何函式,因為中斷表中的 INT 67 單元預設情況下未填充,可能包含無效指標(例如,0000:0000h)。在適當位置存在 EMMXXXX0 簽名確認 EMM386.EXE 驅動程式已載入,然後應該呼叫 INT 67\AH=46h 函式。INT 67\AH=46h 函式返回的 AH = 00h 值表示 EMM386.EXE 驅動程式處於活動狀態,並且已準備好執行其他 INT 67 函式。

註釋 2:當確定 EMM386.EXE 驅動程式已載入時,INT 67\AH=46h 函式返回的任何非零錯誤程式碼都表示 EMM386.EXE 驅動程式處於非活動狀態。在這種情況下,INT 67\AX=FFA5h 函式(8.03-74)可能會有所幫助:它返回 EMM386.EXE 驅動程式的 API 入口點的地址。使用指向此入口點的 CALL FAR 命令(7.03-08),可以將 EMM386.EXE 驅動程式切換到活動狀態。

8.03-63 INT 67\AH=4Bh – 獲取 EMM 控制代碼數量

[編輯 | 編輯原始碼]

準備:AH = 4Bh

返回:AH – 錯誤程式碼 (A.06-1);如果 AH = 00h,則 BX – EMM386.EXE 驅動程式分配的活動控制代碼數量。

註釋 1:除非 INT 67\AH=46h(8.03-62 的註釋 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=4Bh 函式。

注 2:預設情況下,EMM386.EXE 驅動程式最多可以同時保持 64 個控制代碼處於活動狀態,但“h”引數(5.04-02)可以將活動控制代碼數增加到 255 個。

8.03-64 INT 67\AH=4Ch – 獲取與控制代碼關聯的頁面

[編輯 | 編輯原始碼]

準備:AH = 4Ch DX – 分配給某個擴充套件記憶體區域的活動控制代碼

返回:AH – 錯誤程式碼 (A.06-1);如果 AH = 00h,則 BX – 與指定控制代碼關聯的“邏輯”頁面數量。

註釋 1:INT 67\AH=4Ch 函式僅接受那些由 EMM386.EXE 驅動程式(5.04-02)的 INT 67\AH=43h 函式(8.03-59)分配的活動控制代碼。除非 INT 67\AH=46h(8.03-62 的註釋 1)確認 EMM386.EXE 驅動程式處於活動狀態,否則不應呼叫 INT 67\AH=4Ch 函式。

8.03-65 INT 67\AH=4Eh – 儲存/恢復擴充套件記憶體對映

[編輯 | 編輯原始碼]

如果駐留模組打算使用 EMS 訪問擴充套件記憶體,則應考慮任何由呼叫駐留模組中斷的前臺程式也可能使用 EMS 訪問擴充套件記憶體。除非中斷駐留模組在完成其任務後恢復原始的擴充套件記憶體對映,否則無法恢復此前臺程式的執行。為此,INT 67\AH=4Eh 提供了 4 個子函式,這些子函式可以儲存當前擴充套件記憶體對映,並稍後恢復它。

準備:AH = 4Eh AL – 子函式:= 00h – 將當前對映儲存到資料塊中;= 01h – 從資料塊中恢復對映;= 02h – 連續執行子函式 00h 和 01h;= 03h – 確定資料塊所需的緩衝區大小。ES:DI – 指向空緩衝區的指標(對於子函式 00h 和 02h)DS:SI – 指向資料塊的指標(對於子函式 01h 和 02h)

返回:AH – 錯誤程式碼 (A.06-1);如果 AH = 00h,則 AL – 所需的緩衝區大小(以位元組為單位)(僅在子函式 03h 之後)。

註釋 1:INT 67\AH=4Eh 函式由 EMM386.EXE 驅動程式的版本 4.00 及更高版本(5.04-02)執行。因此,除非 INT 67\AH=46h(8.03-62 的註釋 1)確認 EMM386.EXE 驅動程式的適當版本和活動狀態,否則不應呼叫 INT 67\AH=4Eh 函式。

註釋 2:從 EMM386.EXE 驅動程式的版本 3.00 開始,可以分別透過 INT 67\AH=47h 和 INT 67\AH=48h 函式來執行擴充套件記憶體對映狀態的儲存和恢復。這些函式僅恢復 64-kb 頁面幀的狀態,不需要明確的資料塊,但需要在 DX 暫存器中提供一個控制代碼,該控制代碼由 EMM386.EXE 驅動程式分配給呼叫模組。

8.03-66 INT 67\AX=5000h – 更改控制代碼的對映列表

[編輯 | 編輯原始碼]

對映列表是一個表,它表示與一個控制代碼關聯的“物理”和“邏輯”記憶體頁面之間的對應關係。INT 67\AX=5000h 函式可以將當前對映列表替換為新的對映列表。INT 67\AX=5000h 函式的單個呼叫等效於多次連續呼叫 INT 67\AH=44h 對映函式(8.03-60)。

準備:AX = 5000h CX – 對映列表中的條目數量,每個條目 4 個位元組(註釋 3)DX – 分配給某個擴充套件記憶體區域的活動控制代碼 DS:SI – 指向建議的(新的)對映列表開頭的指標 返回:AH – 錯誤程式碼 (A.06-1);AH = 00h 表示成功終止。

註釋 1:INT 67\AX=5000h 函式僅適用於那些由 EMM386.EXE 驅動程式的 INT 67\AH=43h 或 INT 67\AX=5A00h 函式(8.03-59)分配的控制代碼。除非 INT 67\AH=46h(8.03-62 的註釋 1)確認 EMM386.EXE(5.04-02)驅動程式處於活動狀態,否則不應呼叫 INT 67\AX=5000h 函式。

註釋 2:如果一個“物理”頁位於傳統記憶體(低於 640 kb),則該記憶體頁所佔用的記憶體空間必須由作業系統分配給打算使用該“物理”頁的程式。

註釋 3:對映列表中的每個條目長度為 4 個位元組,由兩個字組成。每個條目中的第二個字是“物理”頁面號(最常為 0000h–0003h)。對於對映操作,條目中的第一個字必須是“邏輯”頁面號。對於相反的取消對映操作,條目中的第一個字必須是 FFFFh 值:它強制取消與相應“物理”頁面的當前關聯。

註釋 4:INT 67\AX=5001h 函式負責執行相同的任務,並接受相同的規範(除了 AX),但對對映列表中的其他資料進行操作:每個條目中的第二個字必須是相應“物理”頁面的段地址。

8.03-67 INT 67\AH=51h – 重新分配“邏輯”頁面

[編輯 | 編輯原始碼]

準備 : AH = 51h BX – 為控制代碼請求的“邏輯”頁數 DX – 一個活動控制代碼,分配給某個擴充套件記憶體區域

返回時 : AH – 錯誤程式碼 (A.06-1); 如果 AH = 00h,那麼 BX – 與指定控制代碼關聯的實際頁數。

注意 1: INT 67\AX=51h 函式只對那些由 EMM386.EXE 驅動程式的函式 INT 67\AH=43h 或 INT 67\AX=5A00h (8.03-59) 分配的控制代碼進行操作。除非 EMM386.EXE (5.04-02) 驅動程式的活動狀態透過 INT 67\AH=46h (8.03-62 的注意 1) 確認,否則不應呼叫 INT 67\AX=51h 函式。

注意 2: 如果呼叫 INT 67\AH=51h 函式以增加關聯的“邏輯”頁數,那麼新頁的序號將跟隨當前可用的“邏輯”頁的序號。如果呼叫 INT 67\AH=51h 函式以減少關聯的“邏輯”頁數,那麼序號最大的頁將首先丟失。

8.03-68 INT 67\AH=55h–56h – 在 EMS 記憶體中跳轉和子程式呼叫

[編輯 | 編輯原始碼]

當代碼在擴充套件記憶體中執行時,控制轉移操作 JMP FAR 和 CALL FAR 的目標“邏輯”頁應提前被訪問。為此,EMM386.EXE 驅動程式提供兩個函式,將控制轉移與為指定控制代碼替換對映列表結合起來。INT 67\AH=55h 函式替換對映列表並執行 JMP FAR 操作 (7.03-39),INT 67\AH=56h 函式替換對映列表並執行 CALL FAR 操作 (7.03-08)。這兩個函式都從準備好的資料塊中接收大部分所需引數。此資料塊的結構如表 A.12-6 所示。

準備 : AX = 5500h – 用於 JMP FAR 操作 = 5600h – 用於 CALL FAR 操作 DX – 一個活動控制代碼,分配給某個擴充套件記憶體區域 DS:SI – 指向資料塊 (A.12-6) 起始位置的指標。

返回時: AH – 錯誤程式碼(A.06-1);AH = 00h 表示成功終止。

注意 1: INT 67\AH=55h–56h 函式應僅由那些設計為在擴充套件記憶體中執行的程式使用。

注意 2: INT 67\AX=5501h 和 INT 67\AX=5601h 函式承擔相同的任務並接受相同的規格 (除了 AX),但操作對映列表中的其他資料:每個條目中的第二個字必須是相應“物理”頁的段地址。

注意 3: INT 67\AX=5602h 函式不需要其他初始資料,除了 AX 值,並在 BX 暫存器中返回為返回值地址保留的位元組數,這些地址由 INT 67\AX=5600-5601h 函式儲存在堆疊中。

8.03-69 INT 67\AX=5700h–5701h – 資料複製或交換

[編輯 | 編輯原始碼]

INT 67\AX=5700h–5701h 函式允許在記憶體區域之間複製資料或交換資料,這些記憶體區域可以透過不同的控制代碼訪問或屬於常規記憶體。定址引數在表 A.12-5 中所示的描述符中指定。

準備 : AX = 5700h – 將資料從一個記憶體區域複製到另一個記憶體區域 = 5701h – 在記憶體區域之間交換資料 DS:SI – 指向引數描述符 (A.12-5) 的指標

返回時: AH – 錯誤程式碼(A.06-1);AH = 00h 表示成功終止。

注意 1: 函式 INT 67\AX=5700h–5701h 僅對那些由 EMM386.EXE 驅動程式的函式 INT 67\AH=43h 或 INT 67\AX=5A00h (8.03-59) 分配的控制代碼進行操作。除非 EMM386.EXE (5.04-02) 驅動程式的活動狀態透過對 INT 67\AH=46h (8.03-62 的注意 1) 的呼叫確認,否則不應呼叫 INT 67\AX=5700h–5701h 函式。

8.03-70 INT 67\AX=5800h – 物理頁的段地址

[編輯 | 編輯原始碼]

準備 : AX = 5800h ES:DI – 指向要填充的緩衝區的指標

返回時 : AH – 錯誤程式碼 (A.06-1); 如果 AH = 00h,那麼 CX – 緩衝區中的條目數 (每個條目 4 位元組);ES:DI – 指向已填充條目的緩衝區的指標 (注意 2)

注意 1: 除非 EMM386.EXE (5.04-02) 驅動程式的活動狀態透過對 INT 67\AH=46h (8.03-62 的注意 1) 的呼叫確認,否則不應呼叫 INT 67\AH=5800h 函式。

注意 2: 緩衝區中的每個條目長度為 4 位元組,由 2 個字組成:第一個是物理頁段,第二個是相應的物理頁號。

注意 3: 物理頁數 (以及緩衝區的長度) 可以透過 INT 67\AX=5801h 函式提前獲得,該函式以類似的方式在 CX 暫存器中返回條目數,但不填充緩衝區並忽略 ES:DI 暫存器的內容。

8.03-71 INT 67\AX=DE06h – 4 KB 頁的物理地址

[編輯 | 編輯原始碼]

INT 67\AX=DE06h 函式由 VCPI 伺服器執行。它有助於理解由切換到 V86 模式 CPU 執行的 USB 地址空間轉換概念。由於在 MS-DOS7 中 EMM386.EXE 驅動程式 (5.04-02) 負責 VCPI 伺服器的任務,因此當 EMM386.EXE 驅動程式的活動狀態尚未透過對 INT 67\AH=46h (8.03-62 的注意 1) 的呼叫確認,以及當 VCPI 函式透過 /noVCPI 引數 (5.04-02 的注意 2) 停用時,不應呼叫 INT 67\AH=DE06h 函式。

準備 : AX = DE06h CX – 1024 KB 邊界以下的 4 KB 頁數 (注意 1)

返回時 : AH – 錯誤程式碼 (A.06-1); AH = 8Bh 表示頁號無效。AH = 00h 值表示成功,然後 EDX – 請求頁的物理地址 (注意 2)。

注意 1: 與 LIM EMS 函式不同,VCPI 函式操作 4 KB 頁,由 32 位 CPU 中的 TLB 地址轉換機制處理。4 KB 頁的頁號透過將其線性地址右移 12 位獲得。例如,記憶體單元 D400:1ABCh 的線性地址為 D5ABCh,因此其頁號為 CX = 00D5h。

注意 2: 對於 DOS 程式,訪問 EDX 和其他 32 位暫存器的方法如文章 7.02-06 所示。

8.03-72 INT 67\AX=DE07h – 讀取控制暫存器 CR0 的狀態

[編輯 | 編輯原始碼]

與使用 MOV 命令 (7.03-58 的注意 1) 讀取 CR0 暫存器狀態的操作不同,該操作需要 CPU 的真實模式或最高特權級別,VCPI 伺服器的 INT 67\AX=DE07h 函式在 CPU 的 V86 模式下第三 (最低) 特權級別可用。由於在 MS-DOS7 中 EMM386.EXE 驅動程式 (5.04-02) 負責 VCPI 伺服器的任務,因此當 EMM386.EXE 驅動程式的活動狀態尚未透過對 INT 67\AH=46h (8.03-62 的注意 1) 的呼叫確認,以及當 VCPI 函式透過 /noVCPI 引數 (5.04-02 的注意 2) 停用時,不應呼叫 INT 67\AH=DE07h 函式。

準備 : AX = DE07h

返回時 : AH – 錯誤程式碼 (A.06-1); 如果 AH = 00h,那麼 EBX – 控制暫存器 CR0 的當前狀態 (注意 1)。

注意 1: 對於 DOS 程式,訪問 EBX 和其他 32 位暫存器的 方法如文章 7.02-06 所示。

8.03-73 INT 67\AX=DE08h–DE09h – 訪問暫存器 DR0–DR7

[編輯 | 編輯原始碼]

與使用 MOV 命令 (7.03-58 的注意 1) 訪問 CPU 的暫存器 DR0–DR7 不同,該操作需要 CPU 的真實模式或最高特權級別,VCPI 伺服器的 INT 67\AX=DE08h–DE09h 函式在 CPU 的 V86 模式下第三 (最低) 特權級別可用。由於在 MS-DOS7 中 EMM386.EXE 驅動程式 (5.04-02) 負責 VCPI 伺服器的任務,因此當 EMM386.EXE 驅動程式的活動狀態尚未透過對 INT 67\AH=46h (8.03-62 的注意 1) 的呼叫確認,以及當 VCPI 函式透過 /noVCPI 引數 (5.04-02 的注意 2) 停用時,不應呼叫 INT 67\AH=DE08h–DE09h 函式。

準備 : AX = DE08h – 將 DR0–DR7 暫存器中的內容讀取到緩衝區中 = DE09h – 將緩衝區中的內容寫入 DR0–DR7 暫存器中 ES:DI – 指向包含資料的緩衝區的指標或用於資料的指標 (注意 1)

返回時: AH – 錯誤程式碼(A.06-1);AH = 00h 表示成功終止。

注意 1: 緩衝區長度為 32 位元組,每個暫存器從 DR0 到 DR7 填充 4 個數據位元組。與 DR4 和 DR5 暫存器相對應的資料不會被讀取,在寫入操作中被忽略。DR 暫存器的作用在附錄 A.11-5 中描述。

8.03-74 INT 67\AX=FFA5h – EMM386.EXE 驅動程式的 API 入口點

[編輯 | 編輯原始碼]

INT 67\AX=FFA5h 函式,從 4.2 版開始由 LIM EMS 規範規定,與其他 INT 67 函式的不同之處在於,即使 EMM386.EXE 驅動程式處於非活動狀態,它也會被執行,並忽略所有其他請求。但是,此功能不會排除在呼叫 INT 67\AX=FFA5h 函式之前檢查 EMM386.EXE 驅動程式是否已載入的必要性 (8.03-62 的注意 1)。

準備 : AX = FFA5h

返回時:AH = 84h – 成功終止的簽名,然後 BX:CX – EMM386.EXE API 入口點的地址。

注意 1:對 BX:CX 入口點的 CALL FAR 命令(7.03-08)強制 EMM386.EXE 執行操作,由 AX 暫存器中的值定義。

如果 AX = 0100h – 將自身切換到活動狀態;
如果 AX = 0101h – 將自身切換到非活動狀態;
如果 AX = 0500h – 顯示關於當前狀態的訊息。

當 UMB 塊和 EMS 頁面正在使用時,切換到非活動狀態的請求將不會執行。

8.03-75 INT 70 – INT 77:中斷請求 IRQ 8 – IRQ 15

[編輯 | 編輯原始碼]

當 CPU 處於真實模式時,INT 70 – INT 77 中斷處理程式組會響應來自各種裝置透過 IRQ 8 – IRQ 15 線傳送到第二個中斷控制器的請求,第二個中斷控制器又將輸出透過第一個中斷控制器的 IRQ 2 線(INT 0A,8.01-09)傳送到 CPU。每個 IRQ 8 – IRQ 15 輸入線都可以透過向埠 A1h 傳送一個位來停用(遮蔽),該位在下面的表中第三列指定。一些 IRQ 線具有專用硬體源,在下面的表中第四列列出,但其他一些 IRQ 線可用於接收來自任何裝置的請求,這些裝置被調整為透過這些線之一發送請求,並且由一個載入了相應中斷處理程式的驅動程式支援。

中斷 掩碼 請求來源 註釋
INT 70 IRQ 8 位 0 即時時鐘 注意 *1
INT 71 IRQ 9 位 1
INT 72 IRQ 10 位 2
INT 73 IRQ 11 位 3
INT 74 IRQ 12 位 4 注意 *2
INT 75 IRQ 13 位 5 算術協處理器
INT 76 IRQ 14 位 6 第一個 IDE 控制器
INT 77 IRQ 15 位 7 注意 *3

注意 1:INT 70 處理程式每秒被呼叫 1024 次。有些 BIOS 系統只在事件等待間隔中呼叫 INT 70 處理程式(INT 15\AH=83h,8.01-73)。

注意 2:IRQ 12 線的首選源是 PS2 滑鼠(如果使用)。

注意 3:IRQ 15 線的首選源是第二個 IDE 控制器或 SCSI 匯流排控制器(如果在特定 PC 中存在)。

華夏公益教科書