官术网_书友最值得收藏!

2 試錯(cuò)

軟盤這東西很不可靠,有時(shí)會(huì)發(fā)生不能讀數(shù)據(jù)的狀況,這時(shí)候重新再讀一次就行了。所以即使出那么一、兩次錯(cuò),也不要輕易放棄,應(yīng)該讓它再試幾次。當(dāng)然如果讓它一直重試下去的話,要是磁盤真的壞了,程序就會(huì)陷入死循環(huán),所以我們決定重試5次,再不行的話就真正放棄。改良后的程序就是projects/03_day下的harib00b。

本次添加的部分

;讀磁盤

        MOV      AX,0x0820
        MOV      ES, AX
        MOV      CH,0              ; 柱面0
        MOV DH,0 ; 磁頭0
        MOV CL,2 ; 扇區(qū)2

        MOV SI,0 ; 記錄失敗次數(shù)的寄存器
retry:
        MOV      AH,0x02          ; AH=0x02 : 讀入磁盤
        MOV      AL,1              ; 1個(gè)扇區(qū)
        MOV      BX,0
        MOV      DL,0x00          ; A驅(qū)動(dòng)器
        INT      0x13              ; 調(diào)用磁盤BIOS
        JNC      fin               ; 沒出錯(cuò)的話跳轉(zhuǎn)到fin
        ADD      SI,1              ; 往SI加1
        CMP      SI,5              ; 比較SI與5
        JAE      error             ; SI >= 5時(shí),跳轉(zhuǎn)到error
        MOV      AH,0x00
        MOV      DL,0x00          ; A驅(qū)動(dòng)器
        INT      0x13              ; 重置驅(qū)動(dòng)器
        JMP      retry

還是從新出現(xiàn)的指令開始講吧。JNC是另一個(gè)條件跳轉(zhuǎn)指令,是“Jump if not carry”的縮寫。也就是說進(jìn)位標(biāo)志是0的話就跳轉(zhuǎn)。JAE也是條件跳轉(zhuǎn),是“Jump if above or equal”的縮寫,意思是大于或等于時(shí)跳轉(zhuǎn)。

現(xiàn)在說說出錯(cuò)時(shí)的處理。重新讀盤之前,我們做了以下的處理,AH=0x00, DL=0x00, INT 0x13。通過前面介紹的(AT)BIOS的網(wǎng)頁我們知道,這是“系統(tǒng)復(fù)位”。它的功能是復(fù)位軟盤狀態(tài),再讀一次。剩下的內(nèi)容都很簡(jiǎn)單,只要讀一讀程序就能懂。

嗯,今天進(jìn)展不錯(cuò),繼續(xù)努力吧。

主站蜘蛛池模板: 宁陕县| 关岭| 崇左市| 赞皇县| 白银市| 云南省| 类乌齐县| 江永县| 任丘市| 开江县| 彩票| 尖扎县| 德令哈市| 翁源县| 林西县| 尖扎县| 唐山市| 肥乡县| 南汇区| 临澧县| 清水县| 新绛县| 利川市| 吉木乃县| 黎平县| 临沧市| 宝鸡市| 台中县| 安吉县| 道真| 白水县| 邯郸市| 济源市| 大丰市| 永年县| 沙洋县| 崇信县| 兴宁市| 崇明县| 翼城县| 湘潭县|