汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)
不同類型內中斷的區分-中斷類型碼
??????8086cpu中在下面4種情況下會產生內中斷:(1),除法錯誤 (如之前提到的除法溢出)??????(2),單步執行??????(3),執行into指令??????(4),執行int指令。那么當內中斷發生時cpu如何來區分到底是哪種中斷源呢?
??????通過中斷類型碼,這是一個字節數據,一共可以表示256種中斷信息的來源。上述中斷信息對應的中斷類型碼為:(1),除法錯誤:0??????(2),單步執行:1??????(3),執行into指令:4??????(4),執行int指令,該指令的格式為int n,其中n為字節型立即數,是提供給cpu的中斷類型碼。(如前面經常用到的 int 21h)
如何找到相對應的中斷處理程序-中斷向量表
??????一旦發現了某種內中斷的產生后,需要執行相關的中斷處理程序來對中斷進行處理。cpu要想執行中斷處理程序的話,就需要讓CS:IP指向它,那么從哪里找到相應的中斷處理程序入口地址呢?
??????中斷向量表,顧名思義,這個表里面存儲著中斷向量,而每一個中斷向量就是一個中斷處理程序的入口地址,在內存高地址處存放CS,低地址存放IP。有256種中斷源,那么就有256種中斷向量,二者是一一對應的。中斷向量表存儲在內存的0000;0000-0000:03ff之間的1024個內存單元處。
??????對于N號內中斷,它的中斷處理程序入口地址中的段地址為4*N+2,偏移地址為4*N
中斷過程和中斷處理程序
??????中斷過程:
(1)從中斷信息中取得中斷類型碼N
(2)標志寄存器的值入棧(中斷過程會改變標志寄存器的值,故先將其保存)。pushf
(3)設置標志寄存器的第8位TF和第9位IF的值為0。TF=0,IF=0
(4)CS的內容入棧。push cs
(5)IP的內容入棧。push ip
(6)讀取相應的中斷處理程序的入口地址用來設置CS和IP。(IP)=4*N,(CS)=4*N+2
??????中斷處理程序:
(1)保存用到的寄存器
(2)處理中斷
(3)恢復用到的寄存器
(4)用iret指令返回,(pop IP,pop CS,popf 剛好對應于中斷過程的寄存器入棧順序,用來恢復cpu中斷前的現場環境)
單步執行
??????cpu在執行完一條指令后,如果檢測到標志寄存器的TF位為1,則產生單步中斷。單步中斷的中斷類型碼為1,它的中斷過程為:(1)取得中斷類型碼1(2)標志寄存器入棧,TF、IF置為0(3)CS、IP入棧(4)設置(IP)=1*4,(CS)=1*4+2
??????Debug的單步執行t命令就是利用了cpu的單步中斷功能。首先,Debug提供了單步中斷的中斷處理程序,功能為顯示所有寄存器中的內容后等待輸入命令;然后,在使用t命令執行指令時,Debug將TF設置為1,使得cpu工作于單步中斷方式下,因此在cpu執行完這條指令后引發單步中斷,而執行單步中斷的中斷處理程序會將所有寄存器的內容顯示在屏幕上,并等待輸入命令。
??????如果在TF=1時引發單步中斷轉而執行中斷處理程序。而此時TF=1,則在執行中斷處理程序的第一條指令后又引發單步中斷,又得去執行中斷處理程序,但是又因為TF=1引發單步中斷,…從而陷入死循環中。所以在執行中斷處理程序前需要將TF設置為0,這也是我們之前所做的工作。
特殊情況(向ss寄存器中傳送數據)
??????在ss寄存器中傳送數據后,即使發生中斷,cpu也不會響應。因為ss:sp聯合指向棧頂,對它們的設置應該連續完成,否則在中斷過程中的寄存器入棧保存操作會出現錯誤。所以:我們應該將設置ss和sp的指令連續存放,使得設置sp的指令緊接著設置ss的指令執行。
??????Debug利用了cpu的單步中斷功能,在mov ss,ax指令執行后,cpu不響應任何中斷,所以Debug也沒法將此時的寄存器狀態用中斷處理程序來顯示出來,只有當下一步設置sp的指令執行后,cpu可以進行中斷響應了,Debug的t命令才能執行單步中斷的中斷處理程序來顯示寄存器的內容。
實驗12
??????編寫0號中斷的處理程序,使得在除法溢出發生時,在屏幕中間顯示字符串“divede error!",然后返回到DOS。
assume cs:codecode segmentstart: mov ax,csmov ds,axmov si,offset s0mov ax,0mov es,axmov di,200hcldmov cx,offset s0end-offset s0rep movsb 安裝中斷處理程序到0000:0200處mov ax,0mov ds,axmov word ptr [0*4],200hmov word ptr [0*4+2],0 更改中斷向量表mov ax,4x00hint 21hs0: jmp short stdb "divide error!"st: mov ax,csmov ds,axmov si,202hmov ax,0b800hmov es,axmov di,12*160+32*2mov cx,13lo: mov al,[si]mov es:[di],alinc siadd di,2loop lomov ax,4c00hint 21h s0end:nop 中斷處理程序code endsend start 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 汇编语言随笔(9)-实验11(用条件转移
- 下一篇: 汇编语言随笔(11)- int 指令(返