<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/317786.htm

          參考: 《匯編語(yǔ)言》 王爽 第15章

          1.外中斷信息

          外中斷分為可屏蔽中斷和不可屏蔽中斷

          可屏蔽中斷

          先看看內(nèi)中斷所引發(fā)的中斷過(guò)程:

          (1)取中斷類型嗎n。

          (2)標(biāo)志寄存器入棧,設(shè)置IF=0,TF=0.

          (3)CS、IP入棧

          (4)(IP)=(n*4),(CS)=(n*4+2)

          可屏蔽中斷的中斷過(guò)程于內(nèi)中斷所引發(fā)的中斷過(guò)程不同的地方只是,第一步不同??善帘沃袛嗟闹袛噙^(guò)程,CPU要先看IF的值,如果IF=0就不執(zhí)行中斷,如果IF=1執(zhí)行中斷。

          不可屏蔽中斷

          不可屏蔽中斷是CPU必須相應(yīng)的中斷。不可屏蔽中斷很少,所以中斷類型嗎固定為2,中斷過(guò)程不需要取中斷類型嗎

          不可屏蔽中斷的中斷過(guò)程:

          (1)標(biāo)志寄存器入棧,設(shè)置IF=0,TF=0.

          (2)CS、IP入棧

          (3)(IP)=(8),(CS)=(0AH)

          2. PC機(jī)鍵盤的處理過(guò)程

          當(dāng)我們按下一個(gè)鍵時(shí),鍵盤上的芯片產(chǎn)生一個(gè)掃描碼,掃描嗎說(shuō)明了按下鍵盤的鍵在鍵盤的位置。掃描嗎被送入主板上的相關(guān)接口芯片的寄存器中,該寄存器的端口是60h。一般按下一個(gè)鍵的掃描嗎叫通嗎,松開(kāi)一個(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é))寫(xiě)入內(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ù)來(lái)延時(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次,用來(lái)延時(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];將原來(lái)的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次,用來(lái)延時(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)用原來(lái)的int9*4中斷例程
          67. cmpal,1;1就是ESC的鍵盤掃描碼
          68. jneint9ret
          69. movax,0b800h
          70. moves,ax
          71. incbyteptres:[160*12+40*2+1];每次按下ESC鍵加1,來(lái)改變顏色屬性
          72. int9ret:
          73. popes
          74. popbx
          75. popax
          76. iret
          77. codeends
          78. endstart



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

          評(píng)論


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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();