BIOS中断向量表

BIOS中断是由主板提供的,在实模式下,我们写的OS内核想要访问硬件,就必须借助BIOS中断,BIOS提供了很多中断例程

中断向量表

中断向量是中断服务程序入口地址的偏移量与段基址,一个中断向量占据4字节空间。中断向量表是8086系统内存中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量。

在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。

由于中断向量表可以在操作系统层面灵活修改,因此,不同的系统的中断向量表可能是不同的。此外,intel在CPU的保护模式下,占用了0x00 ~ 0x1F共32个中断号,在Linux下,是从0x20开始用于系统自身的中断的,包括8259芯片的中断重置。

实模式中断

在实模式下,中断向量表占据内存最低的1KB,共256个表项。每个表项4子节,包含一个2子节的段地址和2子节的偏移,即中断处理程序的入口地址。

中断号 描述
INT00h CPU: 除零错,或商不合法时触发
INT01h CPU: 单步陷阱,TF标记为打开状态时,每条指令执行后触发
INT02h CPU: 非可屏蔽中断, 如 开机自我测试 时发生内存错误触发。
INT03h CPU: 第一个未定义的中断向量, 约定俗成仅用于调试程序
INT04h CPU: 算数溢出。通常由INTO指令在置溢出位时触发。
INT05h 在按下Shift-Print Screen或BOUND指令检测到范围异常时触发。
INT06h CPU: 非法指令。
INT07h CPU: 没有数学协处理器时尝试执行浮点指令触发。
INT08h IRQ0: 可编程中断控制器每 55 毫秒触发一次,即每秒 18.2 次。
INT09h IRQ1: 每次键盘按下、按住、释放。
INT0Ah IRQ2:
INT0Bh IRQ3: COM2/COM4。
INT0Ch IRQ4: COM1/COM3。
INT0Dh IRQ5: 硬盘控制器(PC/XT 下)或 LPT2。
INT0Eh IRQ6: 需要时由软碟控制器呼叫。
INT0Fh IRQ7: LPT1。
INT11h 返回设备列表。
INT12h 获取常规内存容量。
INT 16h 从键盘缓冲区中读取一个键盘输入
INT18h 执行磁带上的 BASIC 程序:“真正的”IBM 兼容机在 ROM 里内置 BASIC 程序
当引导失败时由 BIOS 调用此例解释执行。
(例:打印“Boot disk error. Replace disk and press any key to continue...”这类提示信息)
INT19h 加电自检之后载入操作系统。

键盘输入(16H)

下面的指令从键盘缓冲区中读取一个键盘输入,并且将其从缓冲区中删除:

mov ah,0
int 16h

结果:(ah)=扫描码,(al)=ASCII码。

可以阅读书籍,查看详细内容。

int 16h中断例程的0号功能,进行如下的工作。

  1. 检查键盘缓冲区中是否有数据
  2. 没有则继续做第1步
  3. 读取缓冲区第一个字单元中的键盘输入
  4. 将读取的扫描送入ah,ASCII码送入al
  5. 将已读取的键盘输入从缓冲区删除

可见,BIOS的int 9中断例程和int 16h中断例程是一堆互相配合的程序。

服务号:16 扩展键盘读取

返回键盘缓冲区中的下一个字符; 如果没有可用的字符,则此服务会一直等待,直到有可用的字符。 提供此服务是为了支持增强型(101/102 键)键盘。

输入: AH = 10h 输出: AL = ASCII字符代码 AH = 扫描代码 此服务仅在 85 年 11 月 15 日及之后的 AT、86 年 1 月 10 日及之后的 PC XT 和 XT-286 上受支持。

扫描码是代表键盘上按键位置的数字。 随着新键的添加和键盘布局的重新排列,这种编号方案与其最初的目的不一致。 查看扫描码列表。

如果字符是特殊字符,AL 将为 0,AH 中的值将是键的扩展扫描码。 查看扫描码列表。

使用扫描代码来区分代表相同 ASCII 代码的键,例如键盘顶部的加号键和灰色的加号键。

从键盘缓冲区中删除字符后,键盘缓冲区开始指针(在 0:041Ah)增加 2。如果开始指针超出缓冲区的末尾,则开始指针重置为键盘的开头 缓冲。

如果键盘上没有可用的字符,将为键盘发出一个 INT 15h,服务 90h(设备忙),通知操作系统发生了键盘循环,从而允许操作系统执行另一个任务。

键入每个字符后,发出一个 INT 15h,Service 91h(中断完成)。 这允许操作系统切换回在键盘上等待字符的任务。

有关适用于所有键盘的等效服务,请参阅服务 00h,但不支持增强型(101/102 键)键盘上的新键。

显示服务(Video Service——INT 10H)

使用 INT 10H 中断服务程序时,先指定 AH 寄存器为下表编号其中之一,该编号表示欲调用的功用,而其他寄存器的详细说明,参考表后文字,当一切设定好之后再调用 INT 10H

功能 功能代码 参数 返回
设置显示模式 AH=00H AL=显示模式 AL=显示模式标志/CRT控制模式字节
设置文本方式光标 AH=01H CH=行扫描开始,CL=行扫描结束
通常一个字符单元有8个扫描行(0-7)。所以,CX=0607H是一个正常的光标,CX=0007H是一个完整块光标。
如果设置CH的第5位,这通常意味着“隐藏光标”,所以CX=2607H是一种无形光标。
有些视频卡有16条扫描线(00H-0Fh)。
有些视频卡不使用CH的第5位,对于这种情况,可以尝试行扫描开始大于行扫描结束(如:CX=0706h)
设置光标位置 AH=02H BH=页码,DH=行,DL=列
获取光标位置和形状 AH=03H BX=页码 AX=0,CH=行扫描开始,CL=行扫描结束,DH=行,DL=列
读取光笔位置(VGA系统不工作) AH=04H AH=状态(0=无触发,1=触发)
BX=X像素,CH=Y像素,CL=像素行模式(0FH-10H)
DH=字符Y,DL=字符X
选择活动显示页 AH=05H AL=页码
向上滚动窗口 AH=06H AL=滚动的行(0=清除,被用于CH,CL,DH,DL)
BH=背景颜色和前景颜色
CH=高行数,CL=左列数,DH=低行数,DL=右列数
向下滚动窗口 AH=07H 参考向上滚动
读光标所在位置的字符和属性 AH=08H BH=页码 AH=颜色,AL=字符
在当前光标位置写字符和属性 AH=09H AL=字符,BH=页码,BL=颜色,CX=多次打印字符
在光标位置写入字符 AH=0AH AL=字符,BH=页码,CX=多次打印字符
设置背景/边框颜色 AH=0BH,BH=00H BL=背景/边框颜色(边框颜色只能在文本模式设置)
设置调色板 AH=0BH,BH=01H BL=调色板ID(只使用于CGA,但现在的显示卡都支持多个或所有模式。)
写图形像素 AH=0CH AL=颜色,BH=页码 CX=x,DX=y 无
读图形像素 AH=0DH BH=页码,CX=x,DX=y AL=颜色
电传打字机输出 AH=0EH AL=字符,BH=页码,BL=颜色(只适用于图形模式)
获取当前显示模式 AH=0FH AH=屏幕字符的列数
AL=显示模式(参见功能00H中的说明)
BH=页码
写字符串(EGA+,最低PCAT) AH=13H AL=写模式,BH=页码,BL=颜色
CX=字符串长度,DH=行,DL=列
ES:BP=字符串偏移量

AH=00H 显示模式列表

AL 文字/图形 分辨率 颜色
00 文字 40*25 2
01 文字 40*25 16
02 文字 80*25 2
03 文字 80*25 16
04 图形 320*200 2
05 图形 320*200 4
06 图形 640*200 2

AH=01H光标属性

CH的第7位必须是 0,第 5、6 位表示光标属性

CH位6 CH位5 属性
0 0 正常
0 1 隐形
1 0
1 1 闪烁缓慢

AH=06颜色属性

二进制数 颜色 例子 二进制数 颜色 例子
0000 黑色 black 1000 灰色 gray
0001 蓝色 blue 1001 淡蓝色 light blue
0010 绿色 green 1010 淡绿色 light green
0011 青色 cyan 1000 淡青色 light cyan
0100 红色 red 1100 淡红色 light red
0101 紫红色 magenta 1101 淡紫红色 light magenta
0110 棕色 brown 1110 黄色 yellow
0111 银色 light gray 1111 白色 white

AH=0CH/0DH显示范围

显示模式 X座标 Y 座标 颜色bit数
4 0~319 0~199 0、1
5 0~319 0~199 0~3
6 0~639 0~199 0、1

AH=13H写字符串

AL= 显示输出方式

  • 0—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置不变
  • 1—字符串中只含显示字符,其显示属性在BL中。显示后,光标位置改变
  • 2—字符串中含显示字符和显示属性。显示后,光标位置不变
  • 3—字符串中含显示字符和显示属性。显示后,光标位置改变

其他BIOS中断

直接磁盘服务(Direct Disk Service——INT 13H)

中断 说明 入参 出参
AH=00h 复位磁盘驱动器。
AH=01h 检查磁盘驱动器状态。
AH=02h 读扇区。 AL=扇区数
CH,CL=磁盘号,扇区号
DH,DL=磁头号,驱动器号
ES,BX=数据缓冲区地址
读成功:AH=0 AL=读取的扇区数
读失败:AH=出错代码
AH=03h 写扇区。 同上 同上
AH=04h 校验扇区。
AH=05h 格式化磁道。
AH=08h 获取驱动器参数。
AH=09h 初始化硬盘驱动器参数。
AH=0Ch 寻道。
AH=0Dh 复位硬盘控制器。
AH=15h 获取驱动器类型。
AH=16h 获取软驱中盘片的状态。
AH 出错代码
00H 无错
01H 非法命令
02H 地址目标未发现
03H 磁盘写保护(软盘)
04H 扇区未发现
05H 复位失败(硬盘)
06H 软盘取出(软盘)
07H 错误的参数表(硬盘)
08H DMA越界(软盘)
09H DMA超过64K界限
0AH 错误的扇区标志(硬盘)
0BH 错误的磁道标志(硬盘)
0CH 介质类型未发现(软盘)
0DH 格式化时非法扇区号(硬盘)
0EH 控制数据地址目标被发现(硬盘)
0FH DMA仲裁越界(硬盘)
10H 不正确的CRC或ECC编码
11H ECC校正数据错(硬盘)
20H 控制器失败
40H 查找失败
80H 磁盘超时(未响应)
AAH 驱动器未准备好(硬盘)
BBH 未定义的错误(硬盘)
CCH 写错误(硬盘)
E0H 状态寄存器错(硬盘)
FFH 检测操作失败(硬盘)

串口通信例程(INT 14H)

中断 说明
AH=00h 初始化串口。
AH=01h 写出字符。
AH=02h 读入字符。
AH=03h 状态。

系统支持例程(INT 15H)

中断 说明
AH=4FH 键盘拦截。
AH=83H 事件等待。
AH=84H 读游戏杆。
AH=85H SysRq 键。
AH=86H 等待。
AH=87H 块移动。
AH=88H 获取扩展内存容量。
AH=C0H 获取系统参数。
AH=C1H 获取扩展 BIOS 数据区块。
AH=C2H 指针设备功能。
AH=E8h, AL=01h (AX = E801h) 获取扩展内存容量(自从 1994 年引入的新功能),可获取到 64MB 以上的内存容量。
AH=E8h, AL=20h (AX = E820h) 查询系统地址映射。该功能取代了 AX=E801h 和 AH=88h。

键盘通信例程(INT 16H)

中断 说明
AH=00h 读字符。
AH=01h 读输入状态。
AH=02h 读 Shift 键(修改键)状态。
AH=10h 读字符(增强版)。
AH=11h 读输入状态(增强版)。
AH=12h 读 Shift 键(修改键)状态(增强版)

时钟服务(INT 1AH)

中断 说明
AH=00h 读取实时钟。
AH=01h 设置实时钟。
AH=02h 读取实时钟时间。
AH=03h 设置实时钟时间。
AH=04h 读取实时钟日期。
AH=05h 设置实时钟日期。
AH=06h 设置实时钟闹铃。
AH=07h 重置实时钟闹铃。