zoukankan      html  css  js  c++  java
  • 汇编学习笔记(12)外中断

    概念

    外中断,顾名思义是用来处理外部设备输入的中断程序,主要分为两种:

    • 可屏蔽中断:根据标志寄存器IF位的值来判断是否响应,若IF=1,则CPU再执行完当前指令后响应中断;若IF=0则不响应
    • 不可屏蔽中断:CPU必须响应的外部中断,中断码固定为2

    键盘输入的处理过程

    1.键盘输入:按下一个键产生一个通码,松开一个键产生一个断码,断码=通码+80h
      2.引发9号中断:引发9号中断例程,当然,IF要等于1
      3.执行9号中断:将字符键的扫描码及ASCII码送入BIOS键盘缓冲区,低位字节存储ASCII码,高位字节存储扫描码,若是控制键,将0040:17单元置为相应状态

    编写9号中断例程

     1 ;编写int 9号例程,按下F1时改变DOS界面颜色
     2 assume cs:codesg,ss:stack
     3 
     4 stack segment
     5     db 128 dup(0)
     6 stack ends
     7 
     8 
     9 codesg segment
    10     
    11 start:
    12     ;设置栈空间
    13     mov ax,stack
    14     mov ss,ax
    15     mov sp,128
    16     ;将原来的9号例程地址保存在0000:01e0
    17     mov ax,0
    18     mov es,ax
    19     push es:[9*4]
    20     pop es:[01e0h]
    21     push es:[9*4+2]
    22     pop es:[01e2h]
    23     ;ds:si指向int9
    24     push cs
    25     pop ds
    26     ;安装在0000:01e4开始的内存空间
    27     mov si,offset int9
    28     mov di,01e4h
    29     mov cx,offset int9end-offset int9
    30     cld
    31     rep movsb
    32     ;将中断向量表中9号例程的地址改为新地址
    33     cli
    34     mov word ptr es:[9*4],01e4h
    35     mov word ptr es:[9*4+2],0
    36     sti
    37     
    38     mov ax,4c00h
    39     int 21h
    40 
    41 int9:
    42     push ax
    43     push bx
    44     push cx
    45     push es
    46     ;读取键盘输入
    47     in al,60h
    48     pushf
    49     ;调用原有9号例程
    50     call dword ptr cs:[01e0h]
    51     ;判断是否为F1
    52     cmp al,3bh
    53     jne int9ret
    54     mov ax,0b800h
    55     mov es,ax
    56     mov bx,1
    57     mov cx,2000
    58 change:
    59     inc byte ptr es:[bx]
    60     add bx,2
    61     loop change
    62 int9ret:
    63     pop es
    64     pop cx
    65     pop bx
    66     pop ax
    67     iret
    68 int9end:
    69     nop
    70 codesg ends
    71 
    72 end start
  • 相关阅读:
    [NOIP 2012] 疫情控制
    [HDU 6315] Naive Operations
    [BZOJ 3363] Cow Marathon
    单片机的模块化编程
    QT中定时器的使用方法
    47: error: undefined reference to `QWebView::QWebView(QWidget*)'
    如何分析一个QT类
    个人收集的一些库、工具、技术介绍
    点阵字体显示系列之二:汉字显示
    点阵字体显示系列之一:ASCII码字库的显示
  • 原文地址:https://www.cnblogs.com/michaelle/p/4023327.html
Copyright © 2011-2022 走看看