繁体   English   中英

如何使用16位汇编在DOS中格式化软盘?

[英]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 您需要执行以下操作:

  1. 致电服务17h设置要格式化的软盘的类型。 (此操作只需要执行一次,即可开始操作。)

  2. 致电服务18h设置格式的媒体类型。

  3. 按照上面的引用中所述的方式,为要格式化的轨道创建地址标记表。 表中每个扇区必须有一个4字节的条目。

  4. 最后,致电服务05h格式化曲目。

  5. (可选)通过致电服务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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM