2 试错

软盘这东西很不可靠,有时会发生不能读数据的状况,这时候重新再读一次就行了。所以即使出那么一、两次错,也不要轻易放弃,应该让它再试几次。当然如果让它一直重试下去的话,要是磁盘真的坏了,程序就会陷入死循环,所以我们决定重试5次,再不行的话就真正放弃。改良后的程序就是projects/03_day下的harib00b。

本次添加的部分

  1. ;读磁盘
  2. MOV AX,0x0820
  3. MOV ES,AX
  4. MOV CH,0 ; 柱面0
  5. MOV DH,0 ; 磁头0
  6. MOV CL,2 ; 扇区2
  7. MOV SI,0 ; 记录失败次数的寄存器
  8. retry:
  9. MOV AH,0x02 ; AH=0x02 : 读入磁盘
  10. MOV AL,1 ; 1个扇区
  11. MOV BX,0
  12. MOV DL,0x00 ; A驱动器
  13. INT 0x13 ; 调用磁盘BIOS
  14. JNC fin ; 没出错的话跳转到fin
  15. ADD SI,1 ; SI1
  16. CMP SI,5 ; 比较SI5
  17. JAE error ; SI >= 5时,跳转到error
  18. MOV AH,0x00
  19. MOV DL,0x00 ; A驱动器
  20. INT 0x13 ; 重置驱动器
  21. JMP retry

还是从新出现的指令开始讲吧。JNC是另一个条件跳转指令,是“Jump if not carry”的缩写。也就是说进位标志是0的话就跳转。JAE也是条件跳转,是“Jump if above or equal”的缩写,意思是大于或等于时跳转。

现在说说出错时的处理。重新读盘之前,我们做了以下的处理,AH=0x00,DL=0x00,INT 0x13。通过前面介绍的(AT)BIOS的网页我们知道,这是“系统复位”。它的功能是复位软盘状态,再读一次。剩下的内容都很简单,只要读一读程序就能懂。

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