【问题标题】:INT 13h, get status of last opINT 13h,获取最后一次操作的状态
【发布时间】: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 $

【问题讨论】:

  • 你在ALAH 中得到了什么?显然,BIOS 版本在返回信息的位置上有所不同。此外,CF 集可能适用于状态本身不正常的事实,而不是请求本身失败的事实。
  • 作为建议,您可能需要查看 BIOS 将哪些内容放入驱动器号。我忘记了它是否在启动时位于DLDH 中,但有时它不是您所期望的。这可能会导致您看到的错误,因为驱动器实际上不是 0x80。
  • 为什么不在 Fn 0x02 返回 CF 集后检查 AH?你会得到相同的结果
  • @Jester:我也这么认为;维基百科的文章含糊不清。 @DavidHoelzer dl = 0x80 当我第一次开始时。此外,只要我一次不抓取超过 3 个扇区,我就可以阅读。 @AlexanderZhak:所以,在我打电话给 13h 之前,ah = 0x02al = 0x05(读取 5 个扇区)。读取操作后,ax = 0x0C03.

标签: assembly boot 16-bit


【解决方案1】:

然后,当我调用 int 13h 时,AL 中应该有状态码。

INT 13h 的 BIOS 函数 01h 仅在 AH 寄存器中返回结果。进位标志没有定义,所以你不应该在调用这个函数后测试任何失败

【讨论】:

  • 太棒了!当我检查 AH 而不是 AL 时,我得到了一致的行为。在得到“未找到媒体类型”后,我意识到我的问题是读取超出了 Qemu 虚拟 HD 上的扇区数。谢谢!
  • 为了将来的参考,维基百科的错误已得到纠正。
猜你喜欢
  • 1970-01-01
  • 2019-09-05
  • 2020-06-27
  • 1970-01-01
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 2016-03-04
相关资源
最近更新 更多