【发布时间】:2018-12-26 12:55:28
【问题描述】:
重要提示:此代码将在不格式化或恢复的情况下使媒体无法使用。使用未使用的、空的或不需要的介质。
复制 BIOS 中断函数的行为应该很简单,但有关它的在线信息在现实生活中的使用场景中乏善可陈。所以我编写了代码来读取 2.5" 硬盘驱动器标识信息,这是 int 13h 的函数。我在检查 0x1f7 状态寄存器的 DRQ(数据准备好查询?)位的阶段遇到了问题。当我评论在 check-DRQ 循环中代码继续执行,但数据全为 0,可能是因为它没有被读取。我尝试过改变从属和主位,以及主/辅助总线......辅助总线通过 DRQ 检查但数据似乎全为 1。重要的是,int 13h 在同一驱动器和同一台机器上工作正常。有谁知道是否有办法: a) 知道正在引导的硬盘的 ide 位置(主/从,主/从),然后 b)在不读取它的情况下测试它的存在,并且 c) 弄清楚如何让 DRQ 位变为绿色?错误寄存器在 DRQ 出来之前是否有意义?
有趣的是,BIOS 显示除了 USB、DVD 和 LAN 条目之外的 3 个 HDD,但我只有两个用于硬盘驱动器的插槽。而且我永远无法插入我的 HDD,使其成为 HDD1。奇怪。这有关系吗?
这是我的可引导代码,用于使用控制寄存器从 ATA HDD 主主机读取并将其几个字节作为二进制数打印在屏幕上:
[bits 16]
[org 0x7c00]
xor ax, ax
cli
mov dx, 0x1f7
m1:
in al, dx
test al, 010000000b
jnz m1
mov dx, 0x1f6
mov al, 0xE0 ; LBA mode - not needed for this?
out dx,al
mov dx, 0x1f7
m2:
in al, dx
test al, 010000000b ; wait for BSY to be 0
jnz m2
test al, 001000000b ; wait for DRDY to be 1
jz m2
mov dx, 0x1f7
mov al, 0xEC ; identify drive command
out dx, al
mov dx, 0x1f7
m3:
in al, dx
test al, 010000000b
jnz m3
mov dx, 0x1f7
m4:
in al, dx
test al, 000001000b ; this test for DRQ never turns 1
jz m4
mov ax, 0
mov es, ax
mov di, 0x7e00 ;save the identification to 0x7e00
mov dx, 0x1f0
mov cx, 256
rep insw
mov ax, 0xb800 ; display in table of binary bytes
mov es, ax
mov di, 0
mov ax, 0
mov ds, ax
mov si, 0x7e00 ;starting RAM address to read
mov cx, 0
mov dl, 20 ;how many lines to print
morelines:
mov bh, 7 ;how many bytes per line
morebytes:
mov ah, [ds:si]
mov bl, 8 ;counter for bits of each byte to print
morebits:
shl ah, 1
mov al, 48
jnc zero
mov al, 49
zero:
mov [es:di], al
inc di
inc di
dec bl
jnz morebits
mov al, 32
mov [es:di], al
inc di
inc di
inc si
dec bh
jnz morebytes
add cx, 80*2
mov di, cx
dec dl
jnz morelines
times 510 - ($ - $$) db 0
dw 0xaa55
【问题讨论】:
-
@rcgldr 有没有人在线反汇编过他们的 INT 0x13 BIOS 代码?
-
"而且我永远无法插入我的 HDD,使其成为 HDD1"。在我的系统上,BIOS 对驱动器进行编号,如果只有一个驱动器,它将是驱动器 0,无论它连接到哪个插槽。我的 BIOS 允许我查看插入哪个插槽的内容,这可能会有所帮助在这个情况下。我删除了我之前的 cmets。
-
这不是一个答案,它只是我制作的一个引导加载程序,它试图获取可能对这个问题有用的扩展磁盘驱动器信息。你能告诉我们这个引导加载程序显示的驱动器、主/从值、IOport、控制端口和 IRQ 将它添加到你的问题吗? capp-sysware.com/misc/osdev/eddinfo/boot.asm
标签: assembly x86 bootloader real-mode ata