69,371
社区成员
发帖
与我相关
我的任务
分享
.............
;以下读每一个扇区,
StartRead:
mov ax, [SectAdr]
mov es, ax ; es:bx,段地址
mov bx, [MemAdr] ; es:bx,偏移地址
mov dl, 0h ; 驱动器号
mov dh, [BeginSide] ; 读写头号
mov ch, [BeginTrack] ; 磁道号
mov cl, [BeginField] ; 扇区号
ReadField:
mov ah, 02h ; 读磁盘
mov al, 01h ; 一个扇区
int 13h ; 磁盘服务中断
jc ReadField ; 不成功重新读
;读一个扇区后应该做以下调整
inc byte [BeginField] ; 调整扇区号
cmp byte [BeginField], 013h ; 每个磁道的一侧包括18个扇区,读完后要调整磁道号和磁头号
jne next0 ; 否则跃过磁道号与磁头号调整跳转到next0,只调整内存地址和扇区计数
mov byte [BeginField], 01h ; 重新置扇区号,从1号开始到18号结束,而不是从0号开始
cmp byte [BeginSide], 00h ; 查看磁头号,看是否需要增加磁道号
je next1 ; 不需要则直接跳转到调整磁头号
inc byte [BeginTrack] ; 调整磁道号
next1:
xor byte [BeginSide], 0x01 ; 调整磁头号
next0:
mov bx, [MemAdr]
add bx, 0x0200 ; 每读入一个扇区地址增加512个字节
mov [MemAdr], bx ; 调整内存地址
inc byte [Num] ; 调整读入扇区数
cmp byte [Num], 0x80 ; 检查是否读入128个扇区,即64k数据
jne next2 ; 如果不到64k,则跳转到next2,继续下一次读扇区操作
inc byte [Sect] ; 如果达到64k,则增加读入段数计数值
;即时显示,读完一个64k段在新的一行显示一个“Sect”
mov ax, cs
mov es, ax
mov ax, DoneSect
mov bp, ax ; ES: BP = ...
mov cx, 6 ; CX = ...
mov ax, 01301h ; AH = 13, AL = 01h
mov bx, 000ch ; ...0(BH=0)....(BL=0Ch,..)
mov dh, byte [Sect]; 第Sect,即新增加的行
mov dl, 0 ; 第0列
int 10h ; 10h ...
mov byte [Num], 0h
mov bx, 0h
mov [MemAdr], bx
mov ax, [SectAdr] ; 调整段地址
add ax, 0x1000
mov [SectAdr], ax
cmp byte [Sect], 01h ; 如果读入1段则停止读入
je next3
next2:
jc StartRead
BeginTrack: db 0x0 ; 开始磁道号
BeginSide: db 0x0 ; 开始磁头号
BeginField: db 0x2 ; 开始扇区号
Num: db 0x0 ; 读入扇区数
Sect: db 0x0 ; 读入段数
MemAdr: dw 0x0000 ; 偏移地址
SectAdr: dw 0x7000 ; 段地址
.....................