Int 13H AH=00h 有什么用

问题描述 投票:0回答:1

我不明白 Int 13H AH=00h 在我的虚拟软盘 img 上的用途

我从命令行创建了一个 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,以覆盖软盘中包含的其他程序,然后我调用这个重置函数来检查是否可以恢复崩溃的程序,但没有结果

这是整个引导扇区代码。 :https://esauvage.developpez.com/tutoriels/asm/assembleur-intel-avec-nasm/amorce.asm

Int 13H AH=00h 有什么用处以及在此上下文中重置意味着什么?

assembly virtualbox interrupt x86-16 bios
1个回答
0
投票

Int 13H AH=00h 有什么用处以及在此上下文中重置意味着什么?

BIOS.ResetDiskSystem 函数 00h 将为通过 DL 寄存器选择的驱动器重置控制器。在这种情况下,“重置”意味着强制驱动器将其磁头拉至磁道 0,以便下一次 I/O 操作可以从磁道 0 开始。正是这种重新校准有时会在磁盘发生错误后导致磨擦声。在虚拟机上时您不会听到这个声音! 每当像 BIOS.ReadDiskSectors function 02h 或 BIOS.WriteDiskSectors function 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
指令在您提供链接的完整代码中找不到!

    

© www.soinside.com 2019 - 2024. All rights reserved.