内中断---汇编学习笔记
內(nèi)中斷
“中斷信息”是要求CPU馬上進(jìn)行某種處理,并向所要進(jìn)行的該種處理提供了必備的參數(shù)的通知信息。
12.1 內(nèi)中斷的產(chǎn)生
當(dāng)CPU內(nèi)部有下面的情況發(fā)生的時(shí)候,將產(chǎn)生相應(yīng)的中斷信息。
8086CPU用稱為中斷類型碼的數(shù)據(jù)來標(biāo)識(shí)中斷信息的來源。中斷類型碼為一個(gè)字節(jié)型數(shù)據(jù),可以表示256種中斷信息的來源。
12.2 中斷處理程序
CPU收到中斷信息后,需要對(duì)中斷信息進(jìn)行處理。而如何對(duì)中斷信息進(jìn)行處理,可以由我們編程決定。
CPU的設(shè)計(jì)者必須在中斷信息和其處理程序的入口地址之間建立某種聯(lián)系,使得CPU根據(jù)中斷信息可以找到要執(zhí)行的處理程序。
12.3 中斷向量表
中斷向量表的內(nèi)存中保存,其中存放著256個(gè)中斷源所對(duì)應(yīng)的中斷處理程序的入口,如圖。
可見,CPU只要知道中斷類型碼,就可以將中斷類型碼作為中斷向量表的表項(xiàng)號(hào),定位相應(yīng)的表項(xiàng),從而得到中斷處理程序的入口地址。
中斷向量表在內(nèi)存中存放,對(duì)于8086CP機(jī),中斷向量表指定放在內(nèi)存地址0處。從內(nèi)存0000:0000到0000:03FF的1024個(gè)單元中存放著中斷向量表。
對(duì)于8086CPU,這個(gè)入口地址包括段地址和偏移地址,所以一個(gè)表項(xiàng)占兩個(gè)字,高地址字存放段地址,低地址字存放偏移地址。
檢測(cè)點(diǎn) 12.1
(1)用Debug查看內(nèi)存,情況如下:
0000:0000 68 10 A7 00 8B 01 70 00-16 00 9D 03 8B 01 70 00
則3號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口地址為:0070:018B。
(2)存儲(chǔ)N號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口的偏移地址的內(nèi)存單元的地址為:0000:N*4.
存儲(chǔ)N號(hào)中斷源對(duì)應(yīng)的中斷處理程序入口的段地址的內(nèi)存單元的地址為:0000:N*4+2.
12.4 中斷過程
從上面的講解中,我們知道,可以用中斷類型碼,在中斷向量表中找到中斷處理程序的入口。找到這個(gè)入口地址的最終目的是用它設(shè)置CS和IP,使CPU執(zhí)行中斷處理程序。用中斷類型碼找到中斷向量,并用它設(shè)置CS和IP,這個(gè)工作是由CPU的硬件自動(dòng)完成的。CPU硬件完成這個(gè)工作的過程被稱為中斷過程。
下面是8086CPU在收到中斷信息后,所引發(fā)的中斷過程。
更簡(jiǎn)潔的描述中斷過程,如下:
12.5 中斷處理程序和iret指令
CPU隨時(shí)都可能只想中斷處理程序,所以中斷處理程序必須一直存儲(chǔ)在內(nèi)存某段空間中。而中斷處理程序入口地址,即中斷向量,必須存儲(chǔ)在對(duì)應(yīng)的中斷向量表表項(xiàng)中。
中斷處理程序的編寫方法和子程序的比較相似,下面是常規(guī)的步驟:
iret指令的功能用匯編語法描述為:
pop IP pop CS popf12.6 除法錯(cuò)誤中斷的處理
當(dāng)CPU執(zhí)行div發(fā)生了除法溢出錯(cuò)誤,將產(chǎn)生中斷類型碼為0的中斷信息,CPU將檢測(cè)到這個(gè)信息,然后引發(fā)中斷過程,轉(zhuǎn)去執(zhí)行0號(hào)中斷所對(duì)應(yīng)的中斷處理程序。
12.7 編寫處理0號(hào)中斷
這里略過,自己看,內(nèi)容很細(xì)致。
12.8 安裝
其實(shí)就是將代碼復(fù)制到程序的某個(gè)地方,這里也略過!貼上代碼。
assume cs:code code segment start:mov ax,csmov ds,axmov si,offset do0 ;設(shè)置ds:si指向源地址mov ax,0mov es,axmov di,200h ;設(shè)置es:di指向的目的地址mov cx,offset do0end-offset do0 ;設(shè)置cx為傳輸長(zhǎng)度cld ;設(shè)置傳輸方向?yàn)檎?/span>rep movsb ;復(fù)制設(shè)置中斷向量表mov ax,4c00hint 21hdo0:顯示字符串"overflow!"mov ax,4c00hint 21h do0end:nop code ends end start12.9 do0
顯示字符串”overflow!”的子程序。不能夠再去一個(gè)data的數(shù)據(jù)區(qū),因?yàn)榭赡軙?huì)被覆蓋,所以應(yīng)該如下:
12.10 設(shè)置中斷向量
最重要點(diǎn)的一點(diǎn):
mov ax,0 mov es,ax mov word ptr es:[0*4],200h ;低地址字 mov word ptr es:[0*4+2],0 ;高地址字12.11 單步中斷
基本上,CPU在執(zhí)行完一條指令之后,如果檢測(cè)到標(biāo)志寄存器的TF位為1,則產(chǎn)生單步中斷,引發(fā)中斷過程。單步中斷的中斷類型碼為1,則它所引發(fā)的中斷過程如下。
注意,第2步很重要,因?yàn)槿绻粚F位置0,則將陷入一個(gè)永遠(yuǎn)不能結(jié)束的循環(huán)。因?yàn)閱尾街袛鄬⒁l(fā)單步中斷的中斷程序,而單步中斷的中斷程序?qū)⒁l(fā)單步中斷程序中的中斷程序…
于是中斷過程如下:
12.12 響應(yīng)中斷的特殊情況
一般情況下,CPU在執(zhí)行完當(dāng)前指令后,如果檢測(cè)到中斷信息,就響應(yīng)中斷程序,引發(fā)中斷過程。可是,在有些情況下,CPU在執(zhí)行完當(dāng)前指令后,即便是發(fā)生中斷,也不會(huì)響應(yīng)。
比如,在執(zhí)行完向ss寄存器傳送數(shù)據(jù)的指令后,即便發(fā)生中斷,CPU也不會(huì)響應(yīng)。這樣做的主要原因是,ss:sp聯(lián)合指向棧頂,而對(duì)它們的設(shè)置應(yīng)該連續(xù)完成。如果執(zhí)行完設(shè)置ss的指令后,CPU響應(yīng)中斷,引發(fā)中斷過程,要在棧中壓入標(biāo)志寄存器、CS和IP的值。而ss改變,ss:sp指向的不是正確的棧頂,將引發(fā)錯(cuò)誤。所以CPU在執(zhí)行完設(shè)置ss的指令后,不響應(yīng)中斷。這給連續(xù)設(shè)置ss和sp指向正確的棧頂提供了一個(gè)時(shí)機(jī)。即,我們應(yīng)該利用這個(gè)特性,將設(shè)置ss和sp的指令連續(xù)存放,使得設(shè)置sp的指令緊接著設(shè)置ss的指令執(zhí)行,而在此之間,CPU不會(huì)引發(fā)中斷過程。
實(shí)驗(yàn)12 編寫0號(hào)中斷的處理程序
分析:
assume cs:codesgcodesg segmentstart:ds:[si]是源地址0:200是目的地址cx是長(zhǎng)度rep movsbmov ax,0mov es,axmov word ptr es:[0*4],200hmov word ptr es:[0*4],0mov ax,10div 0mov ax,4c00hint 21hdo0:db "divide error!"do0start:在屏幕中間顯示"divide error!"mov ax,4c00hint 21hdo0end:nopcodesg ends end start實(shí)際代碼:
assume cs:codesgcodesg segmentstart:mov ax,csmov ds,axmov si,offset do0 ;源地址mov ax,0mov es,axmov di,200h ;目的地址mov cx,offset do0end-offset do0 ;長(zhǎng)度cld ;方向rep movsb ;安裝mov ax,0mov es,axmov word ptr es:[0*4],200hmov word ptr es:[0*4+2],0 ;設(shè)置中斷向量表mov ax,10mov dx,0div dxmov ax,4c00hint 21hdo0:jmp short do0startdb "divide error!" ;字符串do0start:mov ax,csmov ds,axmov si,202hmov ax,0b800hmov es,axmov di,12*160+36*2mov cx,13s:mov al,[si]mov es:[di],alinc siadd di,2loop s ;顯示字符串mov ax,4c00h ;退出程序int 21hdo0end:nopcodesg ends end start實(shí)驗(yàn)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的内中断---汇编学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国搜索引擎市场用户行为洞察2020
- 下一篇: 面试题,你做了哪些事情来提升自己的沟通能