我在互联网上找到了一个示例代码,用于从保护模式下的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
答案 0 :(得分:0)
您还需要检查状态寄存器(01F7h
)的BSY(第7位)和ERR(第0位)标志。首先等待BSY标志清除,然后检查是否设置了DRQ(第3位)或ERR标志。如果设置了DRQ标志,则可以读取数据。如果设置了ERR,您应该读取错误寄存器(01F1h
)以找出错误。
您还应该实现某种超时,以便更好地从其他错误或意外的设备行为中恢复。此外,当您的代码请求可变数量的扇区时(由CH
寄存器指示),您只能读取512字节。