微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 汇编入门学习笔记 (十三)—— 外中断

汇编入门学习笔记 (十三)—— 外中断

时间:11-09 来源:互联网 点击:
疯狂的暑假学习之 汇编入门学习笔记 (十三)—— 外中断

参考: 《汇编语言》 王爽 第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 字符,要实现间隔显示,就要有延时,用循环非常多的次数来延时。

实现代码:

  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;循环10000000次,用来延时
  10. incal
  11. cmpal,z
  12. jnas
  13. movax,4c00h
  14. int21h;
  15. delay:
  16. pushax
  17. pushdx
  18. movdx,1000h;外层循环1000h次,内层循环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



再实现按下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;在中断向量表中设置新的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;循环10000000次,用来延时
  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;外层循环1000h次,内层循环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;设置IF=0.TF=0
  64. pushbx
  65. popf
  66. calldwordptrds:[0];模拟调用原来的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


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top