新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 匯編入門學(xué)習(xí)筆記 (十三)—— 外中斷

匯編入門學(xué)習(xí)筆記 (十三)—— 外中斷

作者: 時(shí)間:2016-11-09 來源:網(wǎng)絡(luò) 收藏
瘋狂的暑假學(xué)習(xí)之 匯編入門學(xué)習(xí)筆記 (十三)—— 外中斷

本文引用地址:http://butianyuan.cn/article/201611/317786.htm

參考: 《匯編語言》 王爽 第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)如果是字符鍵的掃描嗎,就將該掃描嗎和它所對(duì)應(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)對(duì)鍵盤系統(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)代碼:

  1. assumecs:code
  2. codesegment
  3. start:
  4. movax,0b800h
  5. moves,ax
  6. moval,a
  7. s:
  8. moves:[160*12+40*2],al
  9. calldelay;循環(huán)10000000次,用來延時(shí)
  10. incal
  11. cmpal,z
  12. jnas
  13. movax,4c00h
  14. int21h;
  15. delay:
  16. pushax
  17. pushdx
  18. movdx,1000h;外層循環(huán)1000h次,內(nèi)層循環(huán)100000h次
  19. movax,0
  20. s1:
  21. subax,1
  22. sbbdx,0
  23. cmpax,0
  24. jnes1
  25. cmpdx,0
  26. jnes1
  27. popdx
  28. popax
  29. ret
  30. codeends
  31. endstart


再實(shí)現(xiàn)按下ESC鍵后,改變顯示字符的顏色

  1. assumecs:code
  2. stacksegment
  3. db128dup(0)
  4. stackends
  5. datasegment
  6. dw0,0
  7. dataends
  8. codesegment
  9. start:
  10. movax,stack
  11. movss,ax
  12. movsp,128
  13. movax,data
  14. movds,ax
  15. movax,0
  16. moves,ax
  17. pushes:[9*4]
  18. popds:[0];將原來的int9中斷例程的入口保存到ds:0、ds:2中
  19. pushes:[9*4+2]
  20. popds:[2]
  21. movwordptres:[9*4],offsetint9;在中斷向量表中設(shè)置新的int9*4中斷例程的入口地址
  22. moves:[9*4+2],cs
  23. movax,0b800h
  24. moves,ax
  25. moval,a
  26. s:
  27. moves:[160*12+40*2],al
  28. calldelay;循環(huán)10000000次,用來延時(shí)
  29. incal
  30. cmpal,z
  31. jnas
  32. movax,0
  33. moves,ax
  34. pushds:[0]
  35. popes:[9*4]
  36. pushds:[2]
  37. popes:[9*4+2]
  38. movax,4c00h
  39. int21h;
  40. delay:
  41. pushax
  42. pushdx
  43. movdx,1000h;外層循環(huán)1000h次,內(nèi)層循環(huán)100000h次
  44. movax,0
  45. s1:
  46. subax,1
  47. sbbdx,0
  48. cmpax,0
  49. jnes1
  50. cmpdx,0
  51. jnes1
  52. popdx
  53. popax
  54. ret
  55. int9:
  56. pushax
  57. pushbx
  58. pushes
  59. inal,60h
  60. pushf
  61. pushf
  62. popbx
  63. andbh,11111110b;設(shè)置IF=0.TF=0
  64. pushbx
  65. popf
  66. calldwordptrds:[0];模擬調(diào)用原來的int9*4中斷例程
  67. cmpal,1;1就是ESC的鍵盤掃描碼
  68. jneint9ret
  69. movax,0b800h
  70. moves,ax
  71. incbyteptres:[160*12+40*2+1];每次按下ESC鍵加1,來改變顏色屬性
  72. int9ret:
  73. popes
  74. popbx
  75. popax
  76. iret
  77. codeends
  78. endstart



關(guān)鍵詞: 匯編入門外中

評(píng)論


技術(shù)專區(qū)

關(guān)閉