匯編入門學(xué)習(xí)筆記 (十三)—— 外中斷
參考: 《匯編語言》 王爽 第15章
1.外中斷信息
外中斷分為可屏蔽中斷和不可屏蔽中斷
可屏蔽中斷
先看看內(nèi)中斷所引發(fā)的中斷過程:
(1)取中斷類型嗎n。
(2)標(biāo)志寄存器入棧,設(shè)置IF=0,TF=0.
(3)CS、IP入棧
(4)(IP)=(n*4),(CS)=(n*4+2)
可屏蔽中斷的中斷過程于內(nèi)中斷所引發(fā)的中斷過程不同的地方只是,第一步不同??善帘沃袛嗟闹袛噙^程,CPU要先看IF的值,如果IF=0就不執(zhí)行中斷,如果IF=1執(zhí)行中斷。
不可屏蔽中斷
不可屏蔽中斷是CPU必須相應(yīng)的中斷。不可屏蔽中斷很少,所以中斷類型嗎固定為2,中斷過程不需要取中斷類型嗎
不可屏蔽中斷的中斷過程:
(1)標(biāo)志寄存器入棧,設(shè)置IF=0,TF=0.
(2)CS、IP入棧
(3)(IP)=(8),(CS)=(0AH)
2. PC機(jī)鍵盤的處理過程
當(dāng)我們按下一個(gè)鍵時(shí),鍵盤上的芯片產(chǎn)生一個(gè)掃描碼,掃描嗎說明了按下鍵盤的鍵在鍵盤的位置。掃描嗎被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口是60h。一般按下一個(gè)鍵的掃描嗎叫通嗎,松開一個(gè)鍵的掃描嗎叫斷碼,通嗎第7位0,斷碼第7位1,即 斷碼=通嗎 + 80h
鍵盤的掃描嗎到達(dá)60h是,相關(guān)芯片就會(huì)向CPU發(fā)出中斷類型嗎為9的可屏蔽中斷信息。
int 9 中斷例程主要工作:
(1)讀出60h端口的掃描嗎
(2)如果是字符鍵的掃描嗎,就將該掃描嗎和它所對應(yīng)的字符嗎(ASCII嗎)送入內(nèi)存中的BIOS鍵盤緩沖區(qū);如果是控制鍵(如Ctrl)和切換鍵(如CapsLock)的掃描嗎,則將其轉(zhuǎn)變?yōu)闋顟B(tài)字節(jié)(用二進(jìn)制位記錄控制鍵和切換鍵狀態(tài)的字節(jié))寫入內(nèi)存中存儲(chǔ)的狀態(tài)字節(jié)單元
(3)對鍵盤系統(tǒng)進(jìn)行相關(guān)的控制。比如,相相關(guān)芯片發(fā)出應(yīng)答信息。
3. 修改int 9 中斷
先實(shí)現(xiàn),在屏幕中間間隔顯示‘a’ ~ z 字符,要實(shí)現(xiàn)間隔顯示,就要有延時(shí),用循環(huán)非常多的次數(shù)來延時(shí)。
實(shí)現(xiàn)代碼:
- assumecs:code
- codesegment
- start:
- movax,0b800h
- moves,ax
- moval,a
- s:
- moves:[160*12+40*2],al
- calldelay;循環(huán)10000000次,用來延時(shí)
- incal
- cmpal,z
- jnas
- movax,4c00h
- int21h;
- delay:
- pushax
- pushdx
- movdx,1000h;外層循環(huán)1000h次,內(nèi)層循環(huán)100000h次
- movax,0
- s1:
- subax,1
- sbbdx,0
- cmpax,0
- jnes1
- cmpdx,0
- jnes1
- popdx
- popax
- ret
- codeends
- endstart
再實(shí)現(xiàn)按下ESC鍵后,改變顯示字符的顏色
- assumecs:code
- stacksegment
- db128dup(0)
- stackends
- datasegment
- dw0,0
- dataends
- codesegment
- start:
- movax,stack
- movss,ax
- movsp,128
- movax,data
- movds,ax
- movax,0
- moves,ax
- pushes:[9*4]
- popds:[0];將原來的int9中斷例程的入口保存到ds:0、ds:2中
- pushes:[9*4+2]
- popds:[2]
- movwordptres:[9*4],offsetint9;在中斷向量表中設(shè)置新的int9*4中斷例程的入口地址
- moves:[9*4+2],cs
- movax,0b800h
- moves,ax
- moval,a
- s:
- moves:[160*12+40*2],al
- calldelay;循環(huán)10000000次,用來延時(shí)
- incal
- cmpal,z
- jnas
- movax,0
- moves,ax
- pushds:[0]
- popes:[9*4]
- pushds:[2]
- popes:[9*4+2]
- movax,4c00h
- int21h;
- delay:
- pushax
- pushdx
- movdx,1000h;外層循環(huán)1000h次,內(nèi)層循環(huán)100000h次
- movax,0
- s1:
- subax,1
- sbbdx,0
- cmpax,0
- jnes1
- cmpdx,0
- jnes1
- popdx
- popax
- ret
- int9:
- pushax
- pushbx
- pushes
- inal,60h
- pushf
- pushf
- popbx
- andbh,11111110b;設(shè)置IF=0.TF=0
- pushbx
- popf
- calldwordptrds:[0];模擬調(diào)用原來的int9*4中斷例程
- cmpal,1;1就是ESC的鍵盤掃描碼
- jneint9ret
- movax,0b800h
- moves,ax
- incbyteptres:[160*12+40*2+1];每次按下ESC鍵加1,來改變顏色屬性
- int9ret:
- popes
- popbx
- popax
- iret
- codeends
- endstart
評論