彙編語言實驗:編寫0號中斷處理程序

彙編語言實驗:編寫0號中斷處理程序

任務:編寫0號中斷處理程序,使得在除法溢出發生時,在屏幕中間顯示字符串“divide error!”,然後返回操作系統。

下面寫給出效果,再給出實現代碼,最後給出設計思路(爲什麼這樣做呢?因爲本次實驗沒有任何難度,改編之前的示範程序就可以了,我也偷個懶,不寫註釋了)

這裏寫圖片描述

實現代碼如下:

assume      cs:code,ss:stack

stack       segment
    db  512 dup(?)
stack       ends

code        segment

main:           mov     ax,stack
                mov     ss,ax
                mov     sp,512
                mov     ax,0
                mov     ds,ax

                call    install_do0

                mov     ax,1000h
                mov     bh,0
                div     bh


                mov     ax,4c00h
                int     21h
;***********************************************************
install_do0:    push    ax
                push    cx
                push    ds
                push    es
                push    si
                push    di

                mov     ax,0
                mov     es,ax
                mov     di,200h

                mov     ax,cs
                mov     ds,ax
                mov     si,offset do0
                mov     cx,offset install_end - offset do0
                cld
                rep     movsb

                mov     ax,0
                mov     es,ax
                mov     word ptr es:[0*4],200h
                mov     word ptr es:[0*4+2],0

                jmp     near ptr install_end
;------------------------------------------------------------
do0:            jmp     short do0_start
                db 'divide error!'
    do0_start:  mov     ax,cs
                mov     ds,ax
                mov     si,202h

                mov     ax,0b800h
                mov     es,ax
                mov     di,10*160+20*2

                mov     cx,13
    s:          mov     al,[si]
                mov     es:[di],al
                mov     byte ptr es:[di+1],2
                inc     si
                add     di,2
                loop    s

                mov     ax,4c00h
                int     21h
;------------------------------------------------------------
install_end:    pop     di
                pop     si
                pop     es
                pop     ds
                pop     cx
                pop     ax
                ret
code        ends

end     main

中斷的過程其實很容易理解,概括的說就是CPU自己完成一下操作
1. 取得中斷類型碼N
2. pushf, 標誌寄存器壓棧
3. 設置標誌爲TF=0,IF=0
4. push CS,將CS壓棧
5. push IP,將IP壓棧
6. 設置IP,CS爲中斷向量表存放的地址,也就是使(IP) = (N*4),
(CS) = (N*4+2)

至於編寫中斷處理程序,和編寫普通的子程序沒有多大區別:
1. 保存用到的寄存器
2. 處理中斷
3. 恢復寄存器
4. iret 返回
其中,iret 指令相當於先retf ,然後popf

這裏我在編寫0號中斷處理程序do0時,直接返回操作系統,沒有使用iret,因爲我在debug中調試時,發現中斷過程發生時,堆棧區存入的CS,IP指向的仍然時div bh 指令(這不是玩我嗎),所以乾脆在do0中直接返回操作系統算了。

最後,總結一下我此次實驗的思路:

  • 首先,編寫安裝子程序install_do0,功能是將中斷處理程序do0安裝到內存空間0:0200~0:02FF(中斷向量表中的空餘表項,沒有任何信息,是一段安全空間)中。
  • 在子程序install_do0中,修改中斷向量表,使得0號中斷髮生時,可以執行程序do0(do0程序的代碼就在子程序install_do0中,只不過作爲數據傳送到目的地址中,沒有被執行罷了,這也充分說明了代碼和數據沒有本質的區別)

好了,總算是把王爽的教材中“內中斷”的部分學習完了,任務也算基本完成了。可以繼續學習新的內容了,我在學習彙編的路上越走越遠……

發佈了58 篇原創文章 · 獲贊 31 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章