当从hdd读取扇区时,我的代码陷入了无限循环

时间:2014-09-11 22:28:38

标签: assembly

我在互联网上找到了一个示例代码,用于从保护模式下的hdd读取扇区。但是,该代码的still_going部分会导致无限循环。我不明白这段代码有什么问题。 ch寄存器包含扇区计数,ebx寄存器包含放置读取数据的起始偏移量。我需要帮助。谢谢。

disk_load:
mov     dx,1f6h         ;Drive and head port
mov     al,0a0h         ;Drive 0, head 0
out     dx,al

mov     dx,1f2h         ;Sector count port
mov     al, ch          ;Read ch sectors
out     dx, al

mov     dx,1f3h         ;Sector number port
mov     al,2            ;Start reading from sector two
out     dx,al

mov     dx,1f4h         ;Cylinder low port
mov     al,0            ;Cylinder 0
out     dx,al

mov     dx,1f5h         ;Cylinder high port
mov     al,0            ;The rest of the cylinder 0
out     dx,al

mov     dx,1f7h         ;Command port
mov     al,20h          ;Read with retry.
out     dx,al
still_going:
in      al,dx
test    al,8            ;This means the sector buffer requires servicing.
jz      still_going     ;Don't continue until the sector buffer is ready.

mov     cx, 256        ;One sector /2
mov     edi, ebx
mov     dx, 1f0h         ;Data port - data comes in and out of here.
rep     insw
ret

1 个答案:

答案 0 :(得分:0)

您还需要检查状态寄存器(01F7h)的BSY(第7位)和ERR(第0位)标志。首先等待BSY标志清除,然后检查是否设置了DRQ(第3位)或ERR标志。如果设置了DRQ标志,则可以读取数据。如果设置了ERR,您应该读取错误寄存器(01F1h)以找出错误。

您还应该实现某种超时,以便更好地从其他错误或意外的设备行为中恢复。此外,当您的代码请求可变数量的扇区时(由CH寄存器指示),您只能读取512字节。