在引导加载程序中使用 int 13h ah=42h 读取 LBA 硬盘

Posted

技术标签:

【中文标题】在引导加载程序中使用 int 13h ah=42h 读取 LBA 硬盘【英文标题】:LBA Harddisk Read using int 13h ah=42h in bootloader 【发布时间】:2015-07-16 05:00:00 【问题描述】:

我正在尝试使用 Int 13h 函数 ah = 42h 加载 fat 16 分区的根目录!据我所知,所有参数均已正确设置。这是代码:`

    mov byte[DAP.sz],0x10
    mov byte[DAP.res],0
    mov cx,word[TotalRootDirSecs]
    mov word[DAP.count],cx
    mov word[DAP.offset],0x0500
    mov word[DAP.seg],0x0
    mov eax,dword[IstRootDirSec]
    add eax,dword[BPB_HiddSec]
    mov dword[DAP.baseLo],eax
    mov dword[DAP.baseHi],0x0
    mov di,5
    pusha
.loop:
    dec di
    cmp di,0
    jz .failed  
    mov si,0x0
    mov ds,si
    mov si,DAP
    mov dl,0x80
    mov ah,0x42
    int 0x13
    jc .loop
    popa
    mov si,RootLoaded
    call Print16
    cli
    hlt
.failed:
    mov al,ah
    add al,48
    mov ah,0eh
    int 0x10
    popa
    cli
    hlt`

返回到 ah 的错误代码是 1,这是不正确的参数(LBA 超出范围),但我转储了寄存器并且所有值都是正确的。 请任何人都可以告诉错误在哪里。 提前致谢。

【问题讨论】:

发布IstRootDirSecBPB_HiddSecDAP 我发现了错误。 :) 错误是我使用 IstRootDirSec 变量作为 DWORD 但它是一个单词,我必须将其转换为 DWORD。谢谢 【参考方案1】:

错误是我将 IstRootDirSec 变量用作 DWORD,但它是一个单词,我必须将其转换为 DWORD。

xor eax,eax
mov ax,word[IstRootDirSec]
add eax,dword[BPB_HiddSec]

【讨论】:

以上是关于在引导加载程序中使用 int 13h ah=42h 读取 LBA 硬盘的主要内容,如果未能解决你的问题,请参考以下文章

BIOS int 13H,AH=02(读取软盘)和堆栈段

BIOS int 13h 无法读取第一条轨道

BIOS int 13h/AH=42 未读取磁盘或未读取到内存中的正确位置

读取磁盘:CHS方式

通过在 OS/bootloader 中传递 bios

显示字符串