;----------------------------------------------------------------------------
; 函数名: ReadSector
;
; 作用:
; 从第 ax 个 Sector 开始, 将 cl 个 Sector 读入 es:bx 中
ReadSector:
; -----------------------------------------------------------------------
; 怎样由扇区号求扇区在磁盘中的位置 (扇区号 -> 柱面号, 起始扇区, 磁头号)
; -----------------------------------------------------------------------
; 设扇区号为 x
; ┌ 柱面号 = y >> 1
; x ┌ 商 y ┤
; -------------- => ┤ └ 磁头号 = y & 1
; 每磁道扇区数 │
; └ 余 z => 起始扇区号 = z + 1
mov dl, [BPB_SecPerTrk] ; dl为启动器号,它应该是0(软盘),所以一开始可以方便的使用这个寄存器
div dl ; y 在 al 中, z 在 ah 中
mov ch, al ; 尽早腾出al寄存器,以便将读取扇区数(cl)写入al
shr ch, 1
mov dh, al
and dh, 1
mov al, cl ; al为要读取的扇区数
inc ah ; z ++
mov cl, ah ; cl <- 起始扇区号
; 至此, "柱面号, 起始扇区, 磁头号" 全部得到,还顺表把al设置好了
mov dl, [BS_DrvNum] ; 驱动器号 (0 表示 A 盘)
.GoOnReading:
mov ah, 2 ; 读
int 13h
jc .GoOnReading ; 如果读取错误 CF 会被置为 1, 这时就不停地读, 直到正确为止
ret
版权声明:本文为donger_soft原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。