上QQ阅读APP看书,第一时间看更新
2 试错
软盘这东西很不可靠,有时会发生不能读数据的状况,这时候重新再读一次就行了。所以即使出那么一、两次错,也不要轻易放弃,应该让它再试几次。当然如果让它一直重试下去的话,要是磁盘真的坏了,程序就会陷入死循环,所以我们决定重试5次,再不行的话就真正放弃。改良后的程序就是projects/03_day下的harib00b。
本次添加的部分
;读磁盘 MOV AX,0x0820 MOV ES, AX MOV CH,0 ; 柱面0 MOV DH,0 ; 磁头0 MOV CL,2 ; 扇区2 MOV SI,0 ; 记录失败次数的寄存器 retry: MOV AH,0x02 ; AH=0x02 : 读入磁盘 MOV AL,1 ; 1个扇区 MOV BX,0 MOV DL,0x00 ; A驱动器 INT 0x13 ; 调用磁盘BIOS JNC fin ; 没出错的话跳转到fin ADD SI,1 ; 往SI加1 CMP SI,5 ; 比较SI与5 JAE error ; SI >= 5时,跳转到error MOV AH,0x00 MOV DL,0x00 ; A驱动器 INT 0x13 ; 重置驱动器 JMP retry
还是从新出现的指令开始讲吧。JNC是另一个条件跳转指令,是“Jump if not carry”的缩写。也就是说进位标志是0的话就跳转。JAE也是条件跳转,是“Jump if above or equal”的缩写,意思是大于或等于时跳转。
现在说说出错时的处理。重新读盘之前,我们做了以下的处理,AH=0x00, DL=0x00, INT 0x13。通过前面介绍的(AT)BIOS的网页我们知道,这是“系统复位”。它的功能是复位软盘状态,再读一次。剩下的内容都很简单,只要读一读程序就能懂。
嗯,今天进展不错,继续努力吧。