日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)

發(fā)布時(shí)間:2025/6/17 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

不同類型內(nèi)中斷的區(qū)分-中斷類型碼

??????8086cpu中在下面4種情況下會(huì)產(chǎn)生內(nèi)中斷:(1),除法錯(cuò)誤 (如之前提到的除法溢出)??????(2),單步執(zhí)行??????(3),執(zhí)行into指令??????(4),執(zhí)行int指令。那么當(dāng)內(nèi)中斷發(fā)生時(shí)cpu如何來區(qū)分到底是哪種中斷源呢?
??????通過中斷類型碼,這是一個(gè)字節(jié)數(shù)據(jù),一共可以表示256種中斷信息的來源。上述中斷信息對(duì)應(yīng)的中斷類型碼為:(1),除法錯(cuò)誤:0??????(2),單步執(zhí)行:1??????(3),執(zhí)行into指令:4??????(4),執(zhí)行int指令,該指令的格式為int n,其中n為字節(jié)型立即數(shù),是提供給cpu的中斷類型碼。(如前面經(jīng)常用到的 int 21h)

如何找到相對(duì)應(yīng)的中斷處理程序-中斷向量表

??????一旦發(fā)現(xiàn)了某種內(nèi)中斷的產(chǎn)生后,需要執(zhí)行相關(guān)的中斷處理程序來對(duì)中斷進(jìn)行處理。cpu要想執(zhí)行中斷處理程序的話,就需要讓CS:IP指向它,那么從哪里找到相應(yīng)的中斷處理程序入口地址呢?
??????中斷向量表,顧名思義,這個(gè)表里面存儲(chǔ)著中斷向量,而每一個(gè)中斷向量就是一個(gè)中斷處理程序的入口地址,在內(nèi)存高地址處存放CS,低地址存放IP。有256種中斷源,那么就有256種中斷向量,二者是一一對(duì)應(yīng)的。中斷向量表存儲(chǔ)在內(nèi)存的0000;0000-0000:03ff之間的1024個(gè)內(nèi)存單元處。
??????對(duì)于N號(hào)內(nèi)中斷,它的中斷處理程序入口地址中的段地址為4*N+2,偏移地址為4*N

中斷過程和中斷處理程序

??????中斷過程:
(1)從中斷信息中取得中斷類型碼N
(2)標(biāo)志寄存器的值入棧(中斷過程會(huì)改變標(biāo)志寄存器的值,故先將其保存)。pushf
(3)設(shè)置標(biāo)志寄存器的第8位TF和第9位IF的值為0。TF=0,IF=0
(4)CS的內(nèi)容入棧。push cs
(5)IP的內(nèi)容入棧。push ip
(6)讀取相應(yīng)的中斷處理程序的入口地址用來設(shè)置CS和IP。(IP)=4*N,(CS)=4*N+2

??????中斷處理程序:
(1)保存用到的寄存器
(2)處理中斷
(3)恢復(fù)用到的寄存器
(4)用iret指令返回,(pop IP,pop CS,popf 剛好對(duì)應(yīng)于中斷過程的寄存器入棧順序,用來恢復(fù)cpu中斷前的現(xiàn)場(chǎng)環(huán)境)

單步執(zhí)行

??????cpu在執(zhí)行完一條指令后,如果檢測(cè)到標(biāo)志寄存器的TF位為1,則產(chǎn)生單步中斷。單步中斷的中斷類型碼為1,它的中斷過程為:(1)取得中斷類型碼1(2)標(biāo)志寄存器入棧,TF、IF置為0(3)CS、IP入棧(4)設(shè)置(IP)=1*4,(CS)=1*4+2
??????Debug的單步執(zhí)行t命令就是利用了cpu的單步中斷功能。首先,Debug提供了單步中斷的中斷處理程序,功能為顯示所有寄存器中的內(nèi)容后等待輸入命令;然后,在使用t命令執(zhí)行指令時(shí),Debug將TF設(shè)置為1,使得cpu工作于單步中斷方式下,因此在cpu執(zhí)行完這條指令后引發(fā)單步中斷,而執(zhí)行單步中斷的中斷處理程序會(huì)將所有寄存器的內(nèi)容顯示在屏幕上,并等待輸入命令。
??????如果在TF=1時(shí)引發(fā)單步中斷轉(zhuǎn)而執(zhí)行中斷處理程序。而此時(shí)TF=1,則在執(zhí)行中斷處理程序的第一條指令后又引發(fā)單步中斷,又得去執(zhí)行中斷處理程序,但是又因?yàn)門F=1引發(fā)單步中斷,…從而陷入死循環(huán)中。所以在執(zhí)行中斷處理程序前需要將TF設(shè)置為0,這也是我們之前所做的工作。

特殊情況(向ss寄存器中傳送數(shù)據(jù))

??????在ss寄存器中傳送數(shù)據(jù)后,即使發(fā)生中斷,cpu也不會(huì)響應(yīng)。因?yàn)閟s:sp聯(lián)合指向棧頂,對(duì)它們的設(shè)置應(yīng)該連續(xù)完成,否則在中斷過程中的寄存器入棧保存操作會(huì)出現(xiàn)錯(cuò)誤。所以:我們應(yīng)該將設(shè)置ss和sp的指令連續(xù)存放,使得設(shè)置sp的指令緊接著設(shè)置ss的指令執(zhí)行。
??????Debug利用了cpu的單步中斷功能,在mov ss,ax指令執(zhí)行后,cpu不響應(yīng)任何中斷,所以Debug也沒法將此時(shí)的寄存器狀態(tài)用中斷處理程序來顯示出來,只有當(dāng)下一步設(shè)置sp的指令執(zhí)行后,cpu可以進(jìn)行中斷響應(yīng)了,Debug的t命令才能執(zhí)行單步中斷的中斷處理程序來顯示寄存器的內(nèi)容。

實(shí)驗(yàn)12

??????編寫0號(hào)中斷的處理程序,使得在除法溢出發(fā)生時(shí),在屏幕中間顯示字符串“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 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的汇编语言随笔(10)-内中断及实验12(返回到dos的中断处理程序)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。