匯編語言(第3版丰嘉,王爽著):實驗17 編寫包含多個功能子程序的中斷例程

實驗17 編寫包含多個功能子程序的中斷例程

1) 前提知識:

  1. 說明
  1. 我用的是 DOSBox 0.74-3 啟動并運行的夯到,而且我沒有軟盤,因此我只能操作硬盤
  2. 直接向磁盤扇區(qū)寫入數(shù)據(jù)是危險的饮亏,很可能覆蓋掉重要的數(shù)據(jù)耍贾,所以千萬不要隨便對硬盤中的扇區(qū)進行寫入。文章中所有程序的功能都是從硬盤中讀取數(shù)據(jù)路幸。
  1. 從 硬盤中讀取數(shù)據(jù) 的測試代碼

文件名:pro174.asm

assume cs:code

code segment
    ; 程序功能:
    ;     讀取 0 面 0 道 1 扇區(qū)的內(nèi)容到 0:200
    ; 入口參數(shù):
    ;     (ah)=13h 的功能號(2 表示讀扇區(qū))
    ;     (al)=讀取的扇區(qū)數(shù)
    ;     (ch)=磁道號
    ;     (cl)=扇區(qū)號
    ;     (dh)=磁頭號(對于軟盤即面號逼争,因為一個面用一個磁頭來讀寫)
    ;     (dl)=驅(qū)動器號(軟驅(qū)從 0 開始:0 代表軟驅(qū)A,1 代表軟驅(qū)B劝赔;硬盤從 80h 開始,80h 代表硬盤C胆敞,81h 代表硬盤D)
    ;     es:bx 指向接收從扇區(qū)讀入數(shù)據(jù)的內(nèi)存區(qū)
    ; 返回參數(shù):
    ;     操作成功:(ah)=0着帽,(al)=讀入的扇區(qū)數(shù)
    ;     操作失敗:(ah)=出錯代碼
    start:
        mov ax, 0
        mov es, ax
        mov bx, 200h        ; es:bx 指向接收從扇區(qū)讀入數(shù)據(jù)的內(nèi)存區(qū)

        mov ah, 2           ; int 13h 的功能號(2 號子程序表示讀扇區(qū))
        mov al, 1           ; 讀取的扇區(qū)數(shù)
        mov ch, 0           ; 磁道號
        mov cl, 1           ; 扇區(qū)號
        mov dh, 0           ; 磁頭號(對于軟盤即面號移层,因為一個面用一個磁頭來讀寫)
        mov dl, 80h         ; 驅(qū)動器號(軟驅(qū)從 0 開始:0 代表軟驅(qū)A仍翰,1 代表軟驅(qū)B;硬盤從 80h 開始观话,80h 代表硬盤C予借,81h 代表硬盤D)
        int 13h

        mov ax, 4c00h
        int 21h
code ends

end start
從 硬盤中讀取數(shù)據(jù) 的測試代碼的調(diào)試過程
讀取硬盤失敗的情況

2) 實驗17 正文:

  1. 思路

實驗要求是安裝一個新的 int 7ch 中斷例程,然后將傳入的 邏輯扇區(qū)號 轉化為 int 13h 中斷例程需要的入口參數(shù)频蛔,邏輯扇區(qū)號 算出物理編號的算法已經(jīng)給出灵迫,基本是除法操作,相對來說不算太難

  1. 實現(xiàn)代碼:

文件名:exp17.asm

assume cs:code

code segment
    start:
        mov ax, cs
        mov ds, ax
        mov si, offset int7ch                       ; 設置 ds:si 指向源地址
        mov ax, 0
        mov es, ax
        mov di, 200h                                ; 設置 es:di 指向目的地址
        mov cx, offset int7chend - offset int7ch    ; 設置 cx 為傳輸長度
        cld                                         ; 設置傳輸方向為正
        rep movsb

        ; 設置中斷向量表
        mov ax, 0
        mov es, ax
        cli
        mov word ptr es:[7ch * 4], 200h
        mov word ptr es:[7ch * 4 + 2], 0
        sti

        mov ax, 4c00h
        int 21h


    ; 新的 int 7ch 中斷例程晦溪,實現(xiàn)通過邏輯扇區(qū)號對軟盤進行讀寫
    ; 參數(shù)說明:
    ; 1. 用 ah 寄存器傳遞功能號:0 表示讀瀑粥,1 表示寫;
    ; 2. 用 dx 寄存器傳遞要讀寫的扇區(qū)的邏輯扇區(qū)號三圆;
    ; 3. 用 es:bx 指向存儲讀出數(shù)據(jù)或?qū)懭霐?shù)據(jù)的內(nèi)存區(qū)狞换。
    int7ch:
        cmp ah, 1
        ja int7chret         ; 當 ah 傳遞的功能號大于 1 則轉移

        push cx
        push dx
        push si
        push di             ; 保護現(xiàn)場避咆,因為調(diào)用 int 13h,ax 會存儲讀寫操作的結果修噪,所以 ax 不需要入棧

        mov di, ax          ; 將傳遞進來的 功能號保存起來
        mov ax, dx          ; 將 邏輯扇區(qū)號 放到 ax 中查库,用于做除法操作
        mov dx, 0           ; 除數(shù)為 16 位,因此被除數(shù)為 32 位黄琼,需要 ax 和 dx
        mov si, 1440
        div si              ; 除數(shù)為 16 位樊销,則 AX 存儲除法操作的商,DX 存儲除法操作的余數(shù)
        mov si, ax          ; 將商保存起來
        mov ax, dx          ; 將余數(shù)放到 ax 中适荣,還需要做除法
        mov cl, 18
        div cl              ; 除數(shù)為 8 位现柠,則 AL 存儲除法操作的商,AH 存儲除法操作的余數(shù)

        mov ch, al          ; 磁道號
        mov cl, ah
        inc cl              ; 扇區(qū)號
        mov ax, di          ; ah 為傳遞進來的 功能號
        add ah, 2           ; int 13h 的功能號
        mov al, 1           ; 讀取的扇區(qū)數(shù)
        mov dx, si
        mov dh, dl          ; 磁頭號(對軟盤即面號弛矛,因為一個面用一個磁頭來讀寫)
        mov dl, 80h         ; 驅(qū)動器號(軟驅(qū)從 0 開始:0 代表軟驅(qū)A够吩,1 代表軟驅(qū)B;硬盤從 80h 開始丈氓,80h 代表硬盤C周循,81h 代表硬盤D)

        int 13h             ; 調(diào)用 int 13h 來對磁盤進行讀寫

    int7chret:
        pop di
        pop si
        pop dx
        pop cx              ; 恢復現(xiàn)場
        iret

    int7chend:
        nop
code ends

end start
  1. 新的 int 7ch 中斷例程測試代碼:

文件名:exp17d.asm

assume cs:code

code segment
    start:
        mov ah, 0                 ; 用 ah 寄存器傳遞功能號:0 表示讀,1 表示寫
        mov dx, 0                 ; 用 dx 寄存器傳遞要讀寫的扇區(qū)的邏輯扇區(qū)號
        mov bx, 0
        mov es, bx
        mov bx, 200h              ; 用 es:bx 指向存儲讀出數(shù)據(jù)或?qū)懭霐?shù)據(jù)的內(nèi)存區(qū)

        int 7ch                   ; 調(diào)用新的 int 7ch 中斷例程

        mov ax, 4c00h
        int 21h
code ends

end start
  1. 代碼調(diào)試示意圖:


    實驗17 代碼調(diào)試示意圖
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末万俗,一起剝皮案震驚了整個濱河市湾笛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌闰歪,老刑警劉巖嚎研,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異库倘,居然都是意外死亡临扮,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門教翩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杆勇,“玉大人,你說我怎么就攤上這事饱亿⊙镣耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵彪笼,是天一觀的道長钻注。 經(jīng)常有香客問我,道長配猫,這世上最難降的妖魔是什么队寇? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮章姓,結果婚禮上佳遣,老公的妹妹穿的比我還像新娘识埋。我一直安慰自己,他們只是感情好零渐,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布窒舟。 她就那樣靜靜地躺著,像睡著了一般诵盼。 火紅的嫁衣襯著肌膚如雪等缀。 梳的紋絲不亂的頭發(fā)上莹弊,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天樱哼,我揣著相機與錄音誊垢,去河邊找鬼。 笑死戒财,一個胖子當著我的面吹牛热监,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播饮寞,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼孝扛,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了幽崩?” 一聲冷哼從身側響起苦始,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎慌申,沒想到半個月后陌选,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡蹄溉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年柠贤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片类缤。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖邻吭,靈堂內(nèi)的尸體忽然破棺而出餐弱,到底是詐尸還是另有隱情,我是刑警寧澤囱晴,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布膏蚓,位于F島的核電站,受9級特大地震影響畸写,放射性物質(zhì)發(fā)生泄漏驮瞧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一枯芬、第九天 我趴在偏房一處隱蔽的房頂上張望论笔。 院中可真熱鬧采郎,春花似錦、人聲如沸狂魔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽最楷。三九已至整份,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間籽孙,已是汗流浹背烈评。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留犯建,地道東北人讲冠。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像胎挎,于是被迫代替她去往敵國和親沟启。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容