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 |
结果:(ah)=扫描码,(al)=ASCII码。
可以阅读书籍,查看详细内容。
int 16h中断例程的0号功能,进行如下的工作。
- 检查键盘缓冲区中是否有数据
- 没有则继续做第1步
- 读取缓冲区第一个字单元中的键盘输入
- 将读取的扫描送入ah,ASCII码送入al
- 将已读取的键盘输入从缓冲区删除
可见,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 | 重置实时钟闹铃。 |