装配BIOS中断13h磁盘超时

时间:2014-06-02 23:21:03

标签: assembly operating-system interrupt

我一直在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教程之后)

1 个答案:

答案 0 :(得分:2)

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

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