bios中断
ddatsh
BIOS中断
BIOS 和 DOS 存在于实模式下,通过建立在中断向量表(Interrupt Vector Table,IVT)中的软中断指令 int 中断号来调用
中断向量表
中断服务程序入口地址的偏移量与段基址,一个中断向量占据4字节空间。中断向量表是8086系统内存中最低端1K字节空间,作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量
在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址
由于中断向量表可以在操作系统层面灵活修改,不同系统的中断向量表可能不同
intel在CPU的保护模式下,占用了0x00 ~ 0x1F共32个中断号,Linux下从0x20开始用于系统自身的中断,包括8259芯片的中断重置
实模式中断
在实模式下,中断向量表占据内存最低的1KB,共256个表项。每个表项4子节,包含一个2子节的段地址和2子节的偏移,即中断处理程序的入口地址
中断号 | 描述 |
---|---|
00h | CPU: 除零错,或商不合法时触发 |
01h | CPU: 单步陷阱,TF标记为打开状态时,每条指令执行后触发 |
02h | CPU: 非可屏蔽中断, 如 开机自我测试 时发生内存错误触发 |
03h | CPU: 第一个未定义的中断向量, 约定俗成仅用于调试程序 |
04h | CPU: 算数溢出。通常由INTO指令在置溢出位时触发 |
05h | 在按下Shift-Print Screen或BOUND指令检测到范围异常时触发 |
06h | CPU: 非法指令 |
07h | CPU: 没有数学协处理器时尝试执行浮点指令触发 |
08h | IRQ0: 可编程中断控制器每 55 毫秒触发一次,即每秒 18.2 次 |
09h | IRQ1: 每次键盘按下、按住、释放 |
0Ah | IRQ2: |
0Bh | IRQ3: COM2/COM4 |
0Ch | IRQ4: COM1/COM3 |
0Dh | IRQ5: 硬盘控制器(PC/XT 下)或 LPT2 |
0Eh | IRQ6: 需要时由软碟控制器呼叫 |
0Fh | IRQ7: LPT1 |
11h | 返回设备列表 |
12h | 获取常规内存容量 |
16h | 从键盘缓冲区中读取一个键盘输入 |
18h | 执行磁带上的 BASIC 程序 “真正的”IBM 兼容机在 ROM 里内置 BASIC 程序 当引导失败时由 BIOS 调用此例解释执行 (例:Boot disk error. Replace disk and press any key to continue…”) |
19h | 加电自检之后载入操作系统 |
显示服务(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—字符串中含显示字符和显示属性。显示后,光标位置改变