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

  • Post author:
  • Post category:其他


;----------------------------------------------------------------------------
; 函数名: 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 版权协议,转载请附上原文出处链接和本声明。