我一直在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 :(得分:2)
我认为你的磁盘缓冲区太低了,在0000:0200上覆盖了RAM中的BIOS数据区。 这也可以解释为什么输出进入错误的屏幕位置 - 光标位置也存储在那里。 引导加载程序可以使用地址0000:0500及以上的所有内存,因此请尝试将指针设置得更高。
我注意到你在第4行有0,而在第1行已经归零了。似乎没必要。 并不是它节省了很多,但两个字节是两个字节......