彙編入門學習筆記 (十三)—— 外中斷,彙編學習筆記
瘋狂的暑假學習之 彙編入門學習筆記 (十三)—— 外中斷
參考: 《組合語言》 王爽 第15章
1.外中斷資訊
外中斷分為可屏蔽中斷和不可屏蔽中斷
可屏蔽中斷
先看看內中斷所引發的中斷過程:
(1)取中斷類型嗎n。
(2)標誌寄存器入棧,設定IF=0,TF=0.
(3)CS、IP入棧
(4)(IP)=(n*4),(CS)=(n*4+2)
可屏蔽中斷的中斷過程於內中斷所引發的中斷過程不同的地方只是,第一步不同。可屏蔽中斷的中斷過程,CPU要先看IF的值,如果IF=0就不執行中斷,如果IF=1執行中斷。
不可屏蔽中斷
不可屏蔽中斷是CPU必須相應的中斷。不可屏蔽中斷很少,所以中斷類型嗎固定為2,中斷過程不需要取中斷類型嗎
不可屏蔽中斷的中斷過程:
(1)標誌寄存器入棧,設定IF=0,TF=0.
(2)CS、IP入棧
(3)(IP)=(8),(CS)=(0AH)
2. PC機鍵盤的處理過程
當我們按下一個鍵時,鍵盤上的晶片產生一個掃描碼,掃描嗎說明了按下鍵盤的鍵在鍵盤的位置。掃描嗎被送入主板上的相關介面晶片的寄存器中,該寄存器的連接埠是60h。一般按下一個鍵的掃描嗎叫通嗎,鬆開一個鍵的掃描嗎叫斷碼,通嗎第7位0,斷碼第7位1,即 斷碼=通嗎 + 80h
鍵盤的掃描嗎到達60h是,相關晶片就會向CPU發出中斷類型嗎為9的可屏蔽中斷資訊。
int 9 中斷常式主要工作:
(1)讀出60h連接埠的掃描嗎
(2)如果是字元鍵的掃描嗎,就將該掃描嗎和它所對應的字元嗎(ASCII嗎)送入記憶體中的BIOS鍵盤緩衝區;如果是修飾鍵(如Ctrl)和切換鍵(如CapsLock)的掃描嗎,則將其轉變為狀態位元組(用二進位位記錄修飾鍵和切換鍵狀態的位元組)寫入記憶體中儲存的狀態位元組單元
(3)對鍵盤系統進行相關的控制。比如,相相關晶片發出應答資訊。
3. 修改int 9 中斷
先實現,在螢幕中間間隔顯示‘a’ ~ 'z' 字元,要實現間隔顯示,就要有延時,用迴圈非常多的次數來延時。
實現代碼:
assume cs:codecode segmentstart:mov ax,0b800hmov es,axmov al,'a's:mov es:[160*12+40*2],alcall delay ;迴圈10000000次,用來延時inc alcmp al,'z'jna smov ax,4c00hint 21h;delay:push axpush dxmov dx,1000h ;外層迴圈1000h次,內層迴圈100000h次mov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axretcode endsend start
再實現按下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]pop ds:[0] ;將原來的int 9 中斷常式的入口儲存到 ds:0、ds:2中push es:[9*4+2]pop ds:[2] mov word ptr es:[9*4],offset int9 ;在中斷向量表中設定新的int 9*4中斷常式的入口地址mov es:[9*4+2],csmov ax,0b800hmov es,axmov al,'a's:mov es:[160*12+40*2],alcall delay ;迴圈10000000次,用來延時inc alcmp al,'z'jna smov ax,0mov es,axpush ds:[0]pop es:[9*4]push ds:[2]pop es:[9*4+2]mov ax,4c00hint 21h;delay:push axpush dxmov dx,1000h ;外層迴圈1000h次,內層迴圈100000h次mov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axretint9:push axpush bxpush esin al,60hpushf pushfpop bxand bh,11111110b ;設定IF=0.TF=0push bxpopfcall dword ptr ds:[0] ;類比調用原來的int 9*4中斷常式cmp al,1 ;1就是ESC的鍵盤掃描碼jne int9retmov ax,0b800hmov es,axinc byte ptr es:[160*12+40*2+1] ;每次按下ESC鍵加1,來改變顏色屬性int9ret:pop espop bxpop axiretcode endsend start
51單片機 外部中斷(組合語言)問題
主程式是:流水燈0到7依次點亮、流水燈7到0依次點亮,反覆迴圈。
外部中斷程式是:燈全亮、全滅3次。
但是,程式沒有開中斷的指令,中斷程式是不會執行的。
START: ;在下面添加:
SETB EA ;開總中斷.
SETB EX0 ;開INT0中斷.
CLR IT0 ; 設定INT0為電平觸發.
MOVA,#00H
……
外部中斷就可以實現了。
學習組合語言需要怎入門?
彙編是執行效率最高的語言了
但是也非常的依賴於硬體,已經準系統多用中斷調用來實現,所以也需要瞭解
比如寄存器,可以有什麼運算,一般做法
其實最簡單,就是看實現什麼功能是怎麼實現的,你就可以很快的投入應用
這樣你很快就是高手,學會稍微的變化還是比較容易的,最難就是記憶那些特殊的處理方法
而且也沒什麼道理