提问人:Bastien Portigo 提问时间:11/3/2023 最后编辑:Sep RolandBastien Portigo 更新时间:11/4/2023 访问量:123
Int 13H AH=00h有什么用
What is the use of Int 13H AH=00h
问:
我不明白在我的虚拟软盘 img 上使用 Int 13H AH=00h。
我从命令行创建了一个 img 虚拟软盘:
copy amorce.com/B+programme.com/B disk.img /Y
软盘称为“disk.img”。它由一个“amorce.com”的引导扇区组成,引导扇区包含在 512 字节软盘的第一个扇区中。软盘还包含一个程序,它占用 6 个扇区,因此从 2 到 7。
然后,我将软盘放在没有带有虚拟盒子的操作系统的虚拟机上。计算机直接启动引导扇区程序。
在引导扇区代码中,我得到以下代码行:
initialise_disque:
mov dl, 0
xor ax, ax
int 0x13
jc initialise_disque
在此代码中没有检测到错误,只是问题是我不明白它的用处。
文档告诉我它会重置软盘系统,但在这种情况下这意味着什么?
当我删除这些代码行时,它不会更改其余代码中的任何内容。
为了尝试了解此功能的有用性,我检查了执行该功能后是否删除了软盘中包含的程序,但事实并非如此。
我还在引导扇区中添加了代码,以便在扇区 2 到 7 上写入,以覆盖软盘中包含的其他程序。然后我调用了这个重置函数来检查是否可以放回崩溃的程序,但没有结果。
这是整个引导扇区代码。
Int 13H AH=00h 有什么用,在这种情况下重置是什么意思?
答:
Int 13H AH=00h 有什么用,在这种情况下重置是什么意思?
The BIOS.ResetDiskSystem 函数 00h 将重置通过 DL 寄存器选择的驱动器的控制器。在这种情况下,“重置”意味着强制驱动器将其磁头拉到磁道 0,以便下一个 I/O 操作可以从磁道 0 开始。正是这种重新校准有时会在磁盘错误发生后发出磨擦声。在虚拟机上时,您不会听到这种声音!
每当磁盘像 BIOS 一样运行时。ReadDiskSector 函数 02h 或 BIOS。WriteDiskSector 函数 03h 报告错误,最好重试失败的操作几次,然后在持续失败后放弃。在两次尝试之间,您可以使用此功能,以便磁盘操作可以从定义明确且安全的起点开始,即 casu 轨道 0。
为了尝试了解此功能的有用性,我检查了执行该功能后是否删除了软盘中包含的程序,但事实并非如此。
请放心,使用此功能不会删除磁盘上的任何文件,也不会覆盖任何扇区。
initialise_disque: ; Initialise le lecteur de disque xor ax, ax int 0x13 jc initialise_disque; En cas d'erreur on recommence (sinon, de toute façon, on ne peut rien faire) lire: mov ax, 0x1000 ; ES:BX = 1000:0000 xor bx, bx mov es, ax mov ah, 2 ; Fonction 0x02 : chargement mémoire mov al, 6 ; On s'arrête au secteur n° 6 xor ch, ch ; Premier cylindre (n° 0) mov cl, 2 ; Premier secteur (porte le n° 2, le n° 1, on est dedans, et le n° 0 n'existe pas) ; Ca fait donc 5 secteurs xor dh, dh ; Tête de lecture n° 0 ; Toujours pas d'identifiant de disque, c'est toujours le même. int 0x13 ; Lit ! jc lire ; En cas d'erreur, on recommence
单独重复重置功能几乎没有意义。在尝试读取磁盘扇区的同一循环中使用它。最好使用计数(如 5 次),这样您就不会无限期地尝试,并且可以通知用户灾难性的失败。
mov al, 6 ; On s'arrête au secteur n° 6 ; Ca fait donc 5 secteurs
这是错误的。AL 中的参数指定要读取的扇区数。从扇区 2 (CL=2) 开始,您将读取扇区 2、3、4、5、6 和 7。总共有 6 个。
您的 VESA 代码会覆盖 BIOS 在引导时在 DL 寄存器中为您提供的磁盘 ID。最好保留该值,以便您可以在程序的这一部分使用它。
我看到问题代码片段中的说明在您提供链接的完整代码中无处可寻!mov dl,0
评论