2

我正在尝试通过以下代码读取磁盘扇区:

disk_load :
push dx 

mov ah , 0x02 ; BIOS read sector function
mov al , dh ; Read DH sectors(dh is initialized before calling the routine)
mov ch , 0x01 ;
mov dh , 0x00 ; Select head 0
mov cl , 0x02 ; Start reading from second sector ( i.e.
; after the boot sector )

mov dl,0x80 (tried with 0x00 as well)

int 0x13 ; BIOS interrupt

pop dx ; Restore DX from the stack
jc cset

cmp dh,al ; if AL ( sectors read ) != DH ( sectors expected )
jne disk_error ; 

问题是,每次都设置进位标志表示错误。最初我尝试了引导磁盘 0x00,后来我检查 AL 寄存器时发现没有读取任何扇区。然后我更改为 0x80 ,现在 AL 寄存器将具有请求的确切扇区数,但仍然设置了进位标志!

那么这里可能是什么问题呢?进位似乎总是在 int 0x13 之后设置!如果这很重要,我正在 Virtual Box 中运行一个 iso 文件。

4

1 回答 1

4

一些提示:

  1. 您应该加载CH零,而不是一,因为气缸从零开始编号。
  2. 失败时返回错误代码AH,你看过吗?
  3. 从 cd 启动(如您所说的 iso)会使事情复杂化,特别是检查您是否启用了软盘仿真。或者只是使用虚拟软盘,直到你做对了。
  4. BIOS 通常会为您传递引导驱动器,DL因此无需覆盖它。

使用软盘映像和固定点 #1,它适用于我的 bochs 和 qemu(没有 virtualbox)。

于 2013-10-15T17:13:18.917 回答