《自己动手写操作系统》之ReadSector

;----------------------------------------------------------------------------
; 函数名: 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


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值