无法用汇编语言读取磁盘扇区

时间:2013-10-15 12:37:45

标签: assembly x86 bios

我试图通过以下代码读取磁盘扇区:

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寄存器将具有所请求的扇区的确切数量,但仍然设置了Carry标志!

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

1 个答案:

答案 0 :(得分:4)

一些提示:

  1. 你应该加载CH零,而不是一个,因为圆柱体从零开始编号。
  2. 失败时会在AH中返回错误代码,您看过那个吗?
  3. 从cd(正如你所说的那样)启动会使事情变得复杂,特别是检查你是否启用了软盘仿真。或者只是使用虚拟软盘,直到你做对了。
  4. BIOS通常会在DL为您传递启动驱动器,因此不需要覆盖它。
  5. 使用软盘映像和固定点#1,它适用于我的bochs和qemu(没有virtualbox)。