【发布时间】:2015-07-25 11:05:27
【问题描述】:
我正在为 16 位实模式下的 BIOS 编写引导加载程序,使用 qemu 作为我的模拟器。
我的一些代码无法从我的 HD 中读取。没关系,但真正困扰我的是当我尝试使用“获取上次驱动器操作的状态”从该操作中获取状态代码时。
根据this wikipedia resource,我可以简单地将 AH 设置为 1,并将 DL 设置为我想要的驱动器(我已经验证为 0x80)。然后,当我调用int 13h 时,AL 中应该有状态码。
但是,当我这样做时,进位标志被设置,表明我尝试读取状态本身失败。
除了指定了错误的驱动器之外,我看不出它是如何发生故障的。
所以我的问题是,这个命令(INT 13h,AH 01h)可能会失败的方式是什么?
这是我的代码:
get_status:
mov ah, 0x01 ; status fxn
mov dl, 0x80 ; 0x80 is our drive
int 0x13 ; call fxn
jc print_status_failure
jmp $
print_status_failure:
mov ax, FAIL_MSG
call print_string
jmp $
【问题讨论】:
-
你在
AL和AH中得到了什么?显然,BIOS 版本在返回信息的位置上有所不同。此外,CF集可能适用于状态本身不正常的事实,而不是请求本身失败的事实。 -
作为建议,您可能需要查看 BIOS 将哪些内容放入驱动器号。我忘记了它是否在启动时位于
DL或DH中,但有时它不是您所期望的。这可能会导致您看到的错误,因为驱动器实际上不是 0x80。 -
为什么不在 Fn 0x02 返回 CF 集后检查 AH?你会得到相同的结果
-
@Jester:我也这么认为;维基百科的文章含糊不清。 @DavidHoelzer
dl = 0x80当我第一次开始时。此外,只要我一次不抓取超过 3 个扇区,我就可以阅读。 @AlexanderZhak:所以,在我打电话给 13h 之前,ah = 0x02和al = 0x05(读取 5 个扇区)。读取操作后,ax = 0x0C03.