Int 13H AH=00h有什么用

What is the use of Int 13H AH=00h

提问人:Bastien Portigo 提问时间:11/3/2023 最后编辑:Sep RolandBastien Portigo 更新时间:11/4/2023 访问量:123

问:

我不明白在我的虚拟软盘 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 有什么用,在这种情况下重置是什么意思?

组装 VirtualBox Interrupt x86-16 BIOS

评论

0赞 Sep Roland 11/4/2023
“然后我调用了这个重置功能来检查是否可以放回崩溃的程序,但没有结果。目前还不清楚你在这里想说什么!例如。您是否撤消了对扇区 2 到 7 的覆盖,或者您是否希望重置功能为您做到这一点?

答:

3赞 Sep Roland 11/4/2023 #1

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

评论

0赞 Bastien Portigo 11/10/2023
我遵循的教程包含错误,我添加了 mov dl,0 以调试代码 我可以有一个 Int 13H AH=00h 的具体示例吗 在以 16 位模式运行的处理器上用 nasm 编码的示例 为了在实践中理解它,有必要 Int 13H AH=00h 对代码有影响, 如果我删除它,它会导致错误或更改
1赞 Sep Roland 11/12/2023
@BastienPortigo An example that uses NASM is stackoverflow.com/questions/34216893/…. Whether removing the BIOS.ResetDiskSystem function from that code would cause a change is unsure, I would even say unprobable. The number of reasons why a disk I/O can fail are no doubt numerous, but forcing the drive to pull its head to track 0, will only help if the original error was due to inaccuracies in the drive's addressing mechanism (hardware).
1赞 Sep Roland 11/12/2023
@BastienPortigo "inaccuracies in the drive's addressing mechanism" means that it could matter whether we move to a particular sector on the drive coming from a lower-numbered sector or from a higher-numbered sector. Nothing in the world can stop immediately, so neither can drive heads.
0赞 Bastien Portigo 11/14/2023
Have you ever personally had an error with BIOS.ReadDiskSectors function 02h or BIOS.WriteDiskSectors function 03h which forced you to use Int 13H AH=00h and which was impossible to resolve without a reset? Maybe 13H AH=00h is not useful on a virtual machine and that it only has an impact on a real floppy disk?