首页 > 解决方案 > 无法使用自定义引导加载程序使用 int13H 读取扇区

问题描述

最近我正在学习 x86 汇编,为了练习,我决定卷起我自己的引导加载程序。在引导加载程序本身中使用 int13H 之前,我决定尝试读取软盘上的扇区(逻辑 19)。但不幸的是,在写下代码并在 QEMU 上运行它之后,它本身并没有加载任何数据。我想我可能在某个地方错了。这是我的代码。

read_sector:
    mov     ah,02H                  ; Function code to Read Sector
    mov     al,01                   ; Read one sector
    lea     bx,[SECTOR]             ; Address of input buffer
    mov     ch,00                   ; Track 0
    mov     cl,02                   ; Sector 1
    mov     dh,01                   ; Head number 1
    mov     dl,00                   ; Drive Number ( 0 - Floppy)
    int     13H                     ; call the routine
    mov     ah,0EH
    add     al,48
    int     10H
    ret

为了清楚起见,我实际上正在阅读:

逻辑扇区 19:Track- 0 Head -1 Sector- 2

在代码中 SECTOR 代表一个标签,我可以使用它来访问写入以及从扇区读取输入数据。

我的打印功能(非常基本)代码:

print:

    mov al,03H
    int 10H
    .repeat:
        lodsb
        mov ah,0EH
        cmp al,0
        je  .done
        int  10H
        jmp .repeat     
    .done:
        ret

很抱歉代码中留下的小东西:(

关于调用这个函数和访问(打印)这里的数据是代码。

    call    read_sector 
    mov     si,[SECTOR]

但运行它时屏幕上什么也没有显示。我还参考了 Ralf Brown 文件并检查了所有内容(int 13H fun:02H)。我还检查了 ax 和进位标志中的返回码,并设置了进位标志,表示读取成功。在我没有其他来源的情况下,首先要参考的是堆栈溢出。如果有人帮助我,我将非常感激。

标签: assemblynasmx86-16bootloaderbios

解决方案


此类问题通常与未正确设置段 ( ES ) 寄存器有关。Int 13h/AH=2h以这种方式记录:

AH = 02h
AL = number of sectors to read (must be nonzero)
CH = low eight bits of cylinder number
CL = sector number 1-63 (bits 0-5)
high two bits of cylinder (bits 6-7, hard disk only)
DH = head number
DL = drive number (bit 7 set for hard disk)
ES:BX -> data buffer

ES需要设置为数据缓冲区偏移所在的段。

当您设置引导加载程序或JMP以在另一个段中编码时,您应该始终确保段寄存器加载了适当的值。您使用的段将取决于您在代码中使用的 ORG 指令。

我有可能有用的一般引导加载程序提示。


推荐阅读