[英]How to pass/retrieve DOS command-line parameters in a 16-bit assembly program?
[英]How to format a floppy diskette in DOS using 16-bit assembly?
我在舊書中學習了DOS的x86匯編編程,在有關中斷的討論中,我看到了13h。 這本書說我可以用它來格式化驅動器。 但不幸的是,我的書中沒有提供有關如何執行此操作的更多信息。
我變得非常好奇,並嘗試對自己使用它,但是它不起作用。 如何使用16位x86組件格式化驅動器A:中的軟盤? 這簡單嗎? 我正在使用TASM進行編譯和鏈接,並在MS-DOS中運行。
也許除了使用int 13h
之外還有其他方法嗎?
int 13h
是執行此操作的適當方法,但實際上不是使用DOS服務,而是使用它來調用ROM BIOS服務。 我認為DOS不提供任何格式化磁盤的服務。 應用程序通常僅使用OS提供的服務來執行高級讀/寫操作,而將FAT的這種低級操作留給操作系統。
具體而言, int 13h
,服務05h
格式化磁盤磁道。 (當您調用該中斷時,服務號會在AH
寄存器中。)請注意,此服務會格式化單個磁道 ,而不是一次格式化整個磁盤。 您必須多次調用此服務才能格式化整個磁盤。 這樣做的好處是,它允許您為每個軌道甚至是軌道上的每個扇區指定不同的特征(某些老式的復制保護方案通過使用奇數球格式創建軌道來使用此特征)。
服務05h
的參數與其他所有磁盤讀/寫服務的參數基本相同,除了您不需要指定扇區號(通常在CL
傳遞)外,因為您無法格式化單個扇區。 這是軟盤服務所需參數的列表:
DL
DH
CH
CL
(不用於格式!) AL
ES:BX
如果中斷在進位標志( CF
)清零的情況下返回,則沒有錯誤發生,並且AH
寄存器將包含0。如果設置了CF
,則發生了錯誤,並且AH
寄存器包含了錯誤代碼。
用Peter Norton的話,從IBM PC和PS / 2的新程序員指南 :
軟盤磁道上的每個扇區都有4個與之關聯的描述性字節。 通過創建一個4字節組的表並將該表的地址傳遞到寄存器對
ES:BX
,可以為每個要格式化的扇區指定這4個字節。 格式化磁盤磁道時,4字節組將立即寫入磁道中各個扇區的前面。 與磁盤上的扇區相關聯的4個字節的數據稱為地址標記 ,磁盤控制器在讀取,寫入和驗證操作期間將其用於標識各個扇區。 這4個字節分別稱為C(表示柱面),H(表示磁頭),R(表示記錄(或扇區號))和N(表示每個扇區的字節數)(也稱為大小碼 )。讀取或寫入扇區時,軟盤控制器會在磁盤磁道中搜索該扇區的ID,該ID的主要部分是R(記錄或扇區號)。 實際不需要該地址標記中的圓柱體和磁頭參數,因為讀/寫磁頭機械地定位在正確的軌道上,並且電子方式選擇了側面,但是記錄並測試了它們以進行安全檢查。
尺寸代碼(N)可以采用以下所示的四個標准值中的任何一個:
N | Sector Size (bytes) | Sector Size (KB) –––––|–––––––––––––––––––––|––––––––––––––––– 0 | 128 | 1/8 1 | 256 | 1/4 2 | 512 | 1/2 3 | 1024 | 1
正常設置為代碼2(512字節)。
格式化軟盤磁道的完整過程相當復雜,所涉及的不僅僅是調用服務05h
。 您需要執行以下操作:
致電服務17h
設置要格式化的軟盤的類型。 (此操作只需要執行一次,即可開始操作。)
致電服務18h
設置格式的媒體類型。
按照上面的引用中所述的方式,為要格式化的軌道創建地址標記表。 表中每個扇區必須有一個4字節的條目。
最后,致電服務05h
格式化曲目。
(可選)通過致電服務04h
來跟蹤格式化過程。 這驗證了可以找到並讀取該扇區,以及循環冗余校驗(CRC)是否正確。 DOS的format.com
這樣做是為了在格式化每個軌道后對其進行驗證,但是磁盤驅動器通常足夠可靠,因此不需要真正進行驗證。
所有這些磁盤I / O服務都使用與上面列出的參數相同的參數,盡管與服務05h
,其中一些參數可能會被忽略。 在線搜索中斷指南以獲取更多詳細信息。 例如, 這是ROM BIOS磁盤I / O服務的完整列表 。 還有另一個 。 彼得·諾頓(Peter Norton)的上述指南也很出色,如果您可以在某個地方找到舊的副本,例如亞馬遜嗎?
(請注意,格式化硬盤和PS / 2中的ESDI驅動器時會有些許不同,因此必須使用完全不同的服務來格式化1Ah
。)
更新:事實證明,畢竟可能有DOS API可以執行此操作。 不幸的是,我不知道它真的使事情變得如此簡單。 關鍵是使用IOCTL。
IOCTL API是由DOS定義的,但實際上是由設備驅動程序實現/處理的,這意味着支持是由驅動程序供應商和版本而不是DOS的版本確定的。 如果您使用的是VM環境,它應支持此環境,但我尚未進行實際測試。
DOS功能44h
是設備I / O控制(IOCTL),因此您在調用INT 21h
(DOS中斷)之前將AH
設置為44h
。
要進行格式化,您需要將IOCTL用於塊設備。 塊IOCTL函數至少需要DOS 3.2或更高版本(有些甚至需要更高的版本)。 它們不僅允許一次訪問整個軌道,而且還支持格式化功能。 可使用子函數0Dh
訪問它們,因此將AL
設置為0Dh
。
放在一起,您只需將AX
設置為440Dh
並調用INT 21h
。 格式功能的次要代碼是42h
,位於CL
。
總之,用於格式化邏輯驅動器上的磁道的DOS塊IOCTL函數將被調用如下:
AX
== 440Dh
CL
== 42h
CH
== 08h
(塊設備類別) BX
==驅動器號(0 =默認值,1 = A:,2 = B:等) DS:DX
== IoctlFmtVrfyTrackRec
結構的地址,該結構指示要格式化的缸蓋和缸蓋編號 如果函數返回時設置了進位標志,則AX
包含錯誤代碼。
不幸的是,除了此頁面之外,我無法在線找到有關IoctlFmtVrfyTrackRec
任何文檔。 這些東西早於網絡,幾乎沒有上傳到那里。 :-(您確實需要一本類似Advanced MS-DOS Programming的書,我也沒有。
我確實設法在Scribd上找到了該文檔,該文檔聲稱是Pierre Desloover編寫的使用IOCTL格式的實現。 我還沒有測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.