System Interruption
Jun 15th, 2020
Last updated
Jun 15th, 2020
Last updated
在主板内存较高地址区内的ROM(只读存储器)中,固化了PC机的基本输入/输出系统BIOS(Basic Input/Output System)。 BIOS 提供了系统加电自检、引导并装人操作系统、主要I/O设备的控制等功能。主要的外部设备,如键盘、显示系统、磁盘(软盘和硬盘)、打印机、系统时钟等,都有相应的中断调用。主要的BIOS中断类型如下表所示。
左侧栏中的中断号都小于10H,为系统的硬中断,所谓硬中断,是由I/O硬件事件触发的,一般不由程序调用(尽管可以调用它们)。这类中断提供的是真正面向I/O硬件的中断例程。
右侧栏中的中断号大于等于10H的,为软中断,它不由I/O硬件事件触发,是供系统软件和用户程序调用的一组功能。
一些主要的I/O设备,如键盘、显示器、打印机、磁盘、异步通信口、时钟等都拥有这两种中断。
DOS是磁盘操作系统(Disk Operating System)的简称.DOS是由BIOS在开机后装入内存的,它提供了任务管理、设备管理、用户界面管理、文件管理等各种服务。
本来DOS是一套标准的软件,不会产生什么中断。但DOS借用了BIOS用软中断提供功能调用的方法,将它为编程者准备的API(应用程序编程接口)都以中断调用方式来提供。这些功能调用也不仅仅是1/O设备的功能调用。
大多数为用户提供的功能调用都位于软中断21H中,但还有其他一些DOS中断调用。主要的DOS中断调用如下表所示。
对编程者来说,使用的主要是21H中断调用。
DOS在21H中断调用中给出了绝大多数用户编程所需的功能,所以有时也将对21H的调用称为DOS功能调用。
对DOS21H功能的调用,只需将AH置成功能号,其他寄存器置上该功能号所规定的参数,即可完成所需的功能。
例如,要从应用程序中返回DOS的功能调用方法是:
平时我们直接使用 MOV AX, 4C00H
就是返回码为0的返回到DOS。
这里大部分使用栗子进行说明。
用户每按下一个键,都会产生一个键盘中断(如果允许中断的话)。
键盘的中断处理程序会根据用户按下的键,决定是否求出所按键的ASCII码,否则,将只给出该键的扫描码。
由于所按键并不会马上被用户程序读取,所以在BIOS的参数区中,定义了一个键盘输人缓冲区KB_ BUFFER。它的位置在内存0040: 001A处,结构如下:
上述缓冲区是一个先进先出的循环队列,BUFF_HEAD及BUFF_TAIL是缓冲区的两个指针。这两个指针相等,缓冲区为空。程序调用BIOS获取键盘输人时,BIOS就会从缓冲区中取出内容,同时移动指针。缓冲区满,会响铃告警。
用户按下Shift ,Ctrl, Alt ,NumLock ,Scroll,Ins及CapsLock键时, BIOS并不返回扫描码, 而是置上一种状态。
程序可通过查询状态字节获知这些键的状态。
利用 INT 16H 的 AH=2 功能可以返回此状态字节。
下图为键盘状态对应的字节:
BIOS提供给键盘的调用为16H,有三个功能,分别为:
实用栗子:
输入汉字:
在程序运行过程中检测是否有键按下:
在一个长时间运行的程序中,可以加入上面的语句序列控制程序的运行,比如按下ESC时终止程序运行,则将 cmp ah,xx
中 xx 替换为 01 即可。
BIOS使用的是16h进行调用,DOS的21h也为键盘提供了一些列的功能如下:
下面以栗子来说明A和C功能:
清除键盘缓冲区:
注意是键盘的缓冲区,不是设置的DS:DX内存的缓冲区
读入字符串,实现将其中的所有小写转大写的功能
运行实例:
in_buf 位于 DS:46,输入 huiH231-
第一个byte为78H,十进制为120
第二个byte为08H,为实际输入的字符个数
in_buf+2 开始为实际存储,如果要直接输出需要在末尾加'$'
可以看出该表和我们的键盘是对应的(标准Windows的键盘),从最左上角的ESC开始编号直到最后的Shift(右)都是可以根据键盘的位置直接读数确定的。
中断号
功能
中断号
功能
0H
除法出错
10H
显示器
1H
单步中断
11H
设备校验
2H
不可屏蔽中断
12H
内存大小检查
3H
断点中断
13H
磁盘
4H
溢出中断
14H
异步通信
5H
打印屏幕中断
15H
I/O系统扩充
8H
8254系统定时中断
16H
键盘
9H
键盘中断
17H
打印机
BH
异步通信串口1中断
18H
驻留BIOS
CH
异步通信串口0中断
19H
引导
DH
硬件中断
1AH
时钟
EH
软盘中断
1BH
键盘Break
FH
并行打印机中断
1CH
定时器
中断号
功能
20H
程序终止
21H
主要的DOS功能调用
22H
结束地址
23H
Ctrl+Break出错地址
24H
严重出错处理
25H
绝对磁盘读
26H
绝对磁盘写
27H
终止并驻留内存
28H~3EH
DOS内部使用的中断
2FH
补充的DOS中断
30H~3FH
保留给DOS
地址
属性
空间定义
说明
0040:001A
BUFF_HEAD
DW ?
首指针
0040:001C
BUFF_TAIL
DW ?
尾指针
0040:001E
KB_BUFFER
DW 16 DUP(?)
16个字的缓冲区
0040:003E
KB_BUFFER_END
LABEL, WORD
尾地址
AH号
功能
结果
说明
0
从键盘读
AH为键盘扫描码 AL为对应的ASCII(如果可以转换为ASCII)
该功能为强制读 若用户没有按键则一直等待
1
从缓冲区读
ZF=0时:AH=键盘扫描码,AL=对应的ASCII或0 ZF=1时:表示无键被按下,KB_BUFFER为空
该功能为探测读 若用户已按键,则与0相同 若用户未按键,则直接返回
2
取键盘状态字节
AL=键盘状态字节
参见上图的键盘状态字节
AH
功能说明
输入参数
返回结果
1
从键盘读入并回显
AL=字符
6
测试读键盘
DL=0FFH
AL=字符(如有输入)
7
从键盘输入一个字符并不回显
AL=字符
8
从键盘输入一个字符并不回显,检测Ctrl+Break
A
读字符至缓冲区
DS:DX=缓冲
字符及计数已经设置好
B
读键盘状态
AL=0FFH(有输入) AL=00H(无输入)
C
清除键盘缓冲区并调用一种功能
AL=功能号(1,6,7,8,A)