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

歡迎訪問 生活随笔!

生活随笔

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

汇编语言随笔(13)- 外中断(可屏蔽中断)、实验15

發(fā)布時(shí)間:2025/6/17 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(13)- 外中断(可屏蔽中断)、实验15 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

端口的作用

??????在PC系統(tǒng)的接口卡和主板上,裝有各種接口芯片。這些外設(shè)接口芯片內(nèi)部有若干寄存器,CPU將這些寄存器當(dāng)作端口來訪問。
??????外設(shè)的輸入不直接送入內(nèi)存和CPU,而是送入相關(guān)的接口芯片的端口中;CPU向外設(shè)的輸出也不是直接送入外設(shè),而是先送入端口中,再由相關(guān)的芯片送到外設(shè)。CPU還可以向外設(shè)輸出控制命令,這些命令也是先送到相關(guān)芯片的端口中,再由相關(guān)芯片根據(jù)命令對(duì)外設(shè)實(shí)施控制。

外中斷

??????之前所提到的中斷類型都是屬于內(nèi)中斷,也就是在CPU的內(nèi)部有需要處理的事情時(shí),產(chǎn)生中斷信息,引發(fā)中斷過程。
??????在此,我們主要介紹外中斷,也就是說當(dāng)CPU的外部有需要處理的事情時(shí),比如:外設(shè)的輸入到達(dá),相關(guān)芯片將向CPU發(fā)出相應(yīng)的中斷信息。CPU在執(zhí)行完當(dāng)前指令后,可以檢測(cè)到發(fā)送過來的中斷信息,引發(fā)中斷過程來處理外設(shè)的輸入。

??????外中斷源一共有兩類:
(1)可屏蔽中斷
??????這類中斷是CPU可以不響應(yīng)的外中斷。CPU是否響應(yīng)可屏蔽中斷,在于標(biāo)志寄存器IF位的設(shè)置。當(dāng)CPU檢測(cè)到可屏蔽中斷信息時(shí),如果IF=1,則CPU在執(zhí)行完當(dāng)前指令后響應(yīng)中斷,引發(fā)中斷過程;如果IF=0,則不響應(yīng)可屏蔽中斷。
??????故:中斷過程中的置TF=0是為了在中斷處理程序中防止CPU陷入單步執(zhí)行(內(nèi)中斷)循環(huán);而IF=0是為了在中斷處理程序中禁止其他的可屏蔽中斷(默認(rèn)中斷不能嵌套)
??????8086CPU提供的設(shè)置IF的指令如下:sti,設(shè)置IF=1;cli,設(shè)置IF=0。
(2)不可屏蔽中斷
??????這類中斷是CPU必須響應(yīng)的外中斷。當(dāng)CPU檢測(cè)到不可屏蔽中斷信息時(shí),則在執(zhí)行完當(dāng)前指令后,立即響應(yīng)引發(fā)中斷過程。 對(duì)于8086CPU,不可屏蔽中斷的中斷類型碼固定為 2,所以在中斷過程中不需要取中斷類型碼。

??????幾乎所有由外設(shè)引發(fā)的外中斷都屬于可屏蔽中斷。可屏蔽中斷也是我們的重點(diǎn)所在。

鍵盤的中斷處理過程

(1)鍵盤輸入
??????鍵盤上的每一個(gè)鍵相當(dāng)于一個(gè)開關(guān),鍵盤中有一個(gè)芯片對(duì)鍵盤上的每一個(gè)鍵的開關(guān)狀態(tài)進(jìn)行掃描。
??????按下一個(gè)鍵時(shí),開關(guān)接通,該芯片產(chǎn)生一個(gè)掃描碼,稱其為通碼。通碼說明了按下的鍵在鍵盤上的位置。通碼被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口地址為60h。
??????松開按下的鍵時(shí),也產(chǎn)生一個(gè)掃描碼,稱其為斷碼。斷碼說明了松開的鍵的位置,也被送入到60h端口中。
??????掃描碼的長度為一個(gè)字節(jié),通碼的第 7 位為0,斷碼的第 7 位為1。 斷碼 = 通碼 + 80h。比如 g 鍵的通碼為 22h,斷碼為 a2h。
(2)引發(fā) 9 號(hào)中斷
??????當(dāng)鍵盤輸入到達(dá) 60h 端口時(shí),相關(guān)芯片會(huì)對(duì)CPU發(fā)出中斷類型碼為 9 的可屏蔽中斷。如果此時(shí) IF=1,則響應(yīng)中斷,引發(fā)中斷過程,執(zhí)行相應(yīng)的中斷處理程序。
(3)執(zhí)行 int 9 中斷例程
?????? 讀出60h端口中的掃描碼。
?????? 如果為字符鍵的掃描碼,將它和它對(duì)應(yīng)的字符碼(ASCII碼)送入內(nèi)存中的BIOS鍵盤緩沖區(qū);如果是控制鍵(Ctrl、Caps)的掃描碼,將它轉(zhuǎn)變?yōu)闋顟B(tài)字節(jié)寫入內(nèi)存中存儲(chǔ)狀態(tài)字節(jié)的單元。
?????? 對(duì)鍵盤系統(tǒng)進(jìn)行相關(guān)的控制,如,對(duì)相關(guān)芯片發(fā)出應(yīng)答信息。

??????補(bǔ)充:BIOS鍵盤緩沖區(qū)是系統(tǒng)啟動(dòng)后,BIOS用于存放 int 9 中斷例程所接收的鍵盤輸入的內(nèi)存區(qū)。該內(nèi)存區(qū)可以存儲(chǔ)15個(gè)鍵盤輸入,int 9 中斷例程除了接收掃描碼外,還需要產(chǎn)生和掃描碼對(duì)應(yīng)的字符碼,故:在緩沖區(qū)中,一個(gè)鍵盤輸入用一個(gè)字單元存放,高位字節(jié)存放掃描碼,低位字節(jié)存放字符碼。
??????內(nèi)存單元 0040:17 存儲(chǔ)鍵盤狀態(tài)字節(jié),用來記錄控制鍵和切換鍵的狀態(tài)。比如說:按下 Ctrl 鍵,對(duì)應(yīng)的位置1,松開置0。按下 Insert 鍵,對(duì)應(yīng)的位置1表示處于刪除態(tài),否則置0。

編寫 int 9 中斷例程

?????? 編程:在屏幕中間依次顯示‘a(chǎn)’-’z’,并可以讓人看清。在顯示的過程中,按下Esc鍵后,改變顯示的顏色。(Esc鍵的通碼是1)
?????? 思路:在鍵盤輸入到達(dá)60h端口后,就會(huì)引發(fā)9號(hào)中斷,CPU轉(zhuǎn)而去執(zhí)行 int 9 中斷例程。我們編寫 int 9 中斷例程的功能如下:
??????(1)從60h讀取鍵盤輸入,這是為了對(duì)特定輸入稍后進(jìn)行處理。
??????(2)調(diào)用BIOS的 int 9 中斷例程,處理其他細(xì)節(jié)。
調(diào)用原 int 9 的中斷過程需要有4步:
??????a,取中斷類型碼9;
??????b,pushf;
??????c,置 IF、TF為0;
??????d,設(shè)置新的CS:IP。
其中a步驟可以忽略,并且c步驟也是可以忽略的,因?yàn)樵贑PU進(jìn)入到我們編寫的新 int 9 中斷例程后,IF、TF已經(jīng)置為0了,而執(zhí)行指令 in al,60h 后不會(huì)改變IF、TF的值,所以c被省略。
??????補(bǔ)充:c步驟代碼如下
????????????pushf
????????????pop bx
????????????and bh,11111100b ??????IF、TF在標(biāo)志寄存器的第9位和第8位。
????????????push bx
????????????popf
??????(3)判斷是否為Esc的掃描碼,若是,改變顯示的顏色,否則直接返回。

assume cs:codestack segmentdb 128 dup(0)stack endsdata segmentdw 0,0data endscode segmentstart: mov ax,stackmov ss,axmov sp,128mov ax,datamov ds,axmov ax,0mov es,axpush es:[9*4] ;這幾句是將原來int 9 例程保存在ds:0處,pop ds:[0] ;因?yàn)樾枰獙?duì)常規(guī)的鍵盤輸入進(jìn)行處理。push es:[9*4+2]pop ds:[2]cli ;這幾句是將我們編寫的新的 int 9 例程作為默認(rèn)的mov word ptr es:[9*4],offset int9 ;鍵盤輸入的中斷處理程序。應(yīng)該注意到:mov es:[9*4+2],cs ;在此并沒有將新的例程安裝到0:200處,sti ;因?yàn)樾碌?int 9例程只在本程序執(zhí)行期間;才會(huì)被使用,程序結(jié)束后不再被調(diào)用,所以無需在內(nèi)存中保存。;并且在執(zhí)行過程中需要屏蔽CPU對(duì)鍵盤中斷的響應(yīng)。mov ax,0b800h ;這是程序執(zhí)行的主體部分,依次顯示字符mov es,axmov ah,'a's: mov es:[160*12+40*2],ahcall delay ;必須采用延遲顯示,否則顯示字符的速度很快,看不清楚。inc ahcmp ah,'z'jna smov ax,0 ;在程序結(jié)束后,臨時(shí)的 int 9 例程不再被使用,需要將mov es,ax ;中斷向量表原 int 9 的入口地址恢復(fù)。cli ;但是在對(duì)中斷例程的入口地址更改時(shí),應(yīng)該禁止對(duì)鍵盤中斷的響應(yīng),push ds:[0] ;否則CPU會(huì)跳到一個(gè)錯(cuò)誤的中斷處理程序入口地址。pop es:[9*4]push ds:[2]pop es:[9*4+2]stimov ax,4c00hint 21hdelay: push ax ;cpu執(zhí)行指令的循環(huán)次數(shù)為10000000h次,以此作為延遲顯示的時(shí)間間隔push dxmov dx,1000hmov ax,0sl: sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axret int9: push axpush bxpush esin al,60h ;讀取鍵盤輸入pushf ;模仿調(diào)用int 9中斷例程來處理其他硬件細(xì)節(jié)call dword ptr ds:[0]cmp al,1 ;判斷是否為Esc的掃描碼,并進(jìn)行我們自己特定的鍵盤中斷處理jne int9retmov ax,0b800hmov es,axinc byte ptr es:[160*12+40*2+1]int9ret:pop espop bxpop axiretcode endsend start

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

??????安裝一個(gè)新的 int 9 中斷例程,功能:在DOS下,按下“A”鍵后,除非不再松開,如果松開,就顯示滿屏幕的“A”,其他的鍵照常處理。(斷碼=通碼+80h。“A”的通碼為1Eh)

assume cs:codestack segment db 128 dup(0)stack endscode segmentstart: mov ax,stackmov ss,axmov sp,128mov ax,cs ;將ds:si處的新int 9例程安裝到內(nèi)存0:204h處。mov ds,axmov si,offset int9mov ax,0mov es,axmov di,204hmov cx,offset int9end-offset int9cldrep movsbpush es:[9*4] ;將原來的int 9入口地址存儲(chǔ)在內(nèi)存0:200h-0:203h處。pop es:[200h]push es:[9*4+2]pop es:[202h]climov word ptr es:[9*4],204h ;將新的int 9例程的入口地址放在中斷向量表中。mov word ptr es:[9*4+2],0stimov ax,4c00hint 21hint9: push axpush espush dipush cxin al,60hpushfcall dword ptr cs:[200h]cmp al,1eh+80h ;判斷是否為“A”的斷碼jne int9retmov ax,0b800hmov es,axmov di,0mov cx,2000s: mov byte ptr es:[di],'A'add di,2loop sint9ret: pop cxpop dipop espop axiretint9end: nopcode endsend start

總結(jié)

以上是生活随笔為你收集整理的汇编语言随笔(13)- 外中断(可屏蔽中断)、实验15的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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