重要提示:此代码将在没有格式化或恢复的情况下使媒体无法使用。使用未使用的、空的或不需要的介质。
复制 BIOS 中断函数的行为应该很简单,但在线有关它的信息在现实生活中的使用场景中却乏善可陈。所以我编写了代码来读取 2.5" 硬盘驱动器标识信息,这是 int 13h 的函数。我在检查 0x1f7 状态寄存器的 DRQ(数据准备好查询?)位的阶段遇到了问题。当我评论在 check-DRQ 循环中代码继续执行,但数据全为 0,可能是因为它没有被读取。我尝试过改变从属和主位,以及主/辅助总线......辅助总线通过 DRQ 检查但数据似乎全为 1。重要的是,int 13h 在同一个驱动器和同一台机器上工作正常。有谁知道是否有办法:a)知道硬盘的 ide 位置(主要/次要,主/从)正在启动,然后 b) 测试它' s 那里没有读取它,并且 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