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的网页我们知道,这是“系统复位”。它的功能是复位软盘状态,再读一次。剩下的内容都很简单,只要读一读程序就能懂。

嗯,今天进展不错,继续努力吧。