【问题标题】:Assembly BIOS Interrupt 13h Disk Timeout汇编 BIOS 中断 13h 磁盘超时
【发布时间】:2014-07-23 04:18:12
【问题描述】:

我一直在 NASM 中编写引导加载程序,但在读取磁盘时遇到问题:当我尝试读取多个扇区时磁盘超时:

xor     ax, ax
mov     es, ax
mov     ds, ax
mov     ah, 0
int     0x13      ; Reset disk with int 0x13 ah 0x0

mov     al, 2     ; Read 2 sectors
mov     ah, 0x2   ; int 13 ah 0x2 is read disk
mov     bx, 0x200 ; Load to 0x200
mov     cl, 2     ; Sector 2
mov     ch, 0     ; Cylinder 0
mov     dl, 0     ; Floppy drive 0
mov     dh, 1     ; Head 1
;       LBA is block 19 (root directory of FAT12)
int     0x13

mov     si, bx ; Print first filename to check success

当我使用mov cl,1,即读取一个扇区而不是两个(或更多)扇区时,程序正常打印第一个文件名,没有错误。然而,当我尝试读取多个扇区时,文件名没有正常打印*并且ah 包含0x80,这对应于磁盘超时(即它尚未准备好)以及设置进位标志。我无法弄清楚为什么会这样。谢谢。

*字符串打印在屏幕右上角——远离光标位置

软件:Virtual Floppy Drive + Bochs 2.6.2(遵循this 教程)

【问题讨论】:

  • 为什么要将段寄存器设置为 0?
  • 这是引导加载程序的开头;我删掉了很多不相关的代码。将段寄存器归零可使sidibx 更易于寻址。

标签: assembly operating-system interrupt


【解决方案1】:

我认为您正在覆盖 RAM 中的 BIOS 数据区域,因为您的磁盘缓冲区太低,位于 0000:0200。 这也可以解释为什么输出到错误的屏幕位置——光标位置也存储在那里。 引导加载程序可以使用地址 0000:0500 及以上地址的所有内存,因此请尝试将指针设置得高一点。

我注意到你在第 4 行是 0,而它在第 1 行已经归零。似乎没有必要。 不是说省了很多,而是两个字节就是两个字节……

【讨论】:

    猜你喜欢
    • 2010-12-31
    • 2013-01-09
    • 2012-02-21
    • 2014-11-29
    • 2019-09-25
    • 1970-01-01
    • 2020-04-12
    • 2017-04-27
    • 2012-01-31
    相关资源
    最近更新 更多