您的位置 首页 方案

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

疯狂的暑假学习之汇编入门学习笔记(十三)——外中断参考:《汇编语言》王爽第15章1.外中断信息外中断分为可屏蔽中断和不可屏…

张狂的暑假学习之 汇编入门学习笔记 (十三)—— 外中止

参阅: 《汇编语言》 王爽 第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


声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/276850.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部