BIOS中斷呼叫

BIOS中断调用（英語：BIOS interrupt calls）是一組功能，为DOS程式與一些软件提供使用IBM PC兼容机上BIOS的功能。許多現代作業系統（如Windows、Linux）的啟動程式會使用BIOS中斷呼叫載入內核，然後由內核將處理器從16位元真實模式轉換到32位元保護模式（或64位元長模式）[1]。

## 中断调用

[编辑]

若要调用中断，可以使用X86汇编语言的INT指令。例如，如下的x86汇编语言指令可以使用BIOS的0x10中断向屏幕打印一个字符。

mov ah, 0x0e
mov al, '!'
int 0x10

## BIOS 中斷向量表

[编辑]

中斷  | 描述

|

INT 00h  | CPU：除零错，或商不合法时触发
INT 01h  | CPU：单步陷阱，TF标记为打开状态时，每条指令执行后触发
INT 02h  | CPU：非可屏蔽中断（英语：Non-maskable interrupt），如開機自我測試时发生内存错误。
INT 03h  | CPU：第一个未定义的中断向量，约定俗成仅用于调试程序
INT 04h  | CPU：算数溢出。通常由INTO指令在置溢出位时触发。
INT 05h  | 在按下`⇧ Shift`+`Prt Sc`或BOUND指令检测到范围异常时触发。
INT 06h  | CPU：非法指令。
INT 07h  | CPU：没有数学协处理器时尝试执行浮点指令触发。
INT 08h  | IRQ0：可编程中断控制器每 55 毫秒触发一次，即每秒 18.2 次。
INT 09h  | IRQ1：每次键盘按下、按住、释放。
INT 0Ah  | IRQ2：
INT 0Bh  | IRQ3：COM2/COM4。
INT 0Ch  | IRQ4：COM1/COM3。
INT 0Dh  | IRQ5：硬盘控制器（PC/XT 下）或 LPT2。
INT 0Eh  | IRQ6：需要時由軟碟控制器呼叫。
INT 0Fh  | IRQ7：LPT1。
INT 10h  | 显示服务 - 由BIOS或操作系统设定以供软件调用。  | AH=00h  | 设定显示模式

|

AH=01h  | 设定游标形态
AH=02h  | 設定游標位置
AH=03h  | 获取光标位置与形态
AH=04h  | 获取光标位置
AH=05h  | 設定顯示頁
AH=06h  | 清除或捲軸畫面(上)
AH=07h  | 清除或捲軸畫面(下)
AH=08h  | 读取游标处字符与属性
AH=09h  | 更改游标处字符与属性
AH=0Ah  | 更改游标处字符
AH=0Bh  | 设定边界颜色
AH=0Eh  | 在TTY模式下写字符
AH=0Fh  | 取得目前顯示模式
AH=13h  | 写字符串
INT 11h  | 返回设备列表。
INT 12h  | 获取常规内存容量。
INT 13h  | 低階磁碟服務。  | AH=00h  | 复位磁盘驱动器。

|

AH=01h  | 检查磁盘驱动器状态。
AH=02h  | 读扇区。
AH=03h  | 写扇区。
AH=04h  | 校验扇区。
AH=05h  | 格式化磁道。
AH=08h  | 取得驱动器参数。
AH=09h  | 初始化硬盘驱动器参数。
AH=0Ch  | 寻道。
AH=0Dh  | 复位硬盘控制器。
AH=15h  | 取得驱动器类型。
AH=16h  | 取得软驱中盘片的状态。
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 17h  | 打印服务。  | AH=00h  | 打印字符。

|

AH=01h  | 初始化打印机。
AH=02h  | 检查打印机状态。
INT 18h  | 执行磁带上的 BASIC 程序：“真正的”IBM 兼容机在 ROM 里内置 BASIC 程序，当引导失败时由 BIOS 调用此例程解释执行。（例：打印“Boot disk error. Replace disk and press any key to continue...”这类提示信息）
INT 19h  | 加电自检之后载入操作系统。
INT 1Ah  | 实时钟服务。  | AH=00h  | 读取实时钟。

|

AH=01h  | 设置实时钟。
AH=02h  | 读取实时钟時間。
AH=03h  | 设置实时钟時間。
AH=04h  | 读取实时钟日期。
AH=05h  | 设置实时钟日期。
AH=06h  | 设置实时钟闹铃。
AH=07h  | 重置实时钟闹铃。
INT 1Bh  | Ctrl+Break，由 IRQ 9 自动调用。
INT 1Ch  | 预留，由 IRQ 8 自动调用。
INT 1Dh  | 不可调用：指向视频参数表（包含视频模式的数据）的指针。
INT 1Eh  | 不可调用：指向软盘模式表（包含关于软驱的大量信息）的指针。
INT 1Fh  | 不可调用：指向视频图形字符表（包含从 80h 到 FFh 的 ASCII 字符的数据）的信息。
INT 41h  | 地址指针：硬盘参数表（第一硬盘）。
INT 46h  | 地址指针：硬盘参数表（第二硬盘）。
INT 4Ah  | 实时钟在闹铃时调用。
INT 70h  | IRQ8：由实时钟调用。
INT 74h  | IRQ12：由鼠标调用
INT 75h  | IRQ13：由数学协处理器调用。
INT 76h  | IRQ14：由第一個 IDE 控制器所呼叫
INT 77h  | IRQ15：由第二個 IDE 控制器所呼叫

## 参见

[编辑]

* DOS中断调用（英语：DOS interrupt call）
* 中断描述符表（英语：Interrupt descriptor table）
* 输入/输出基地址（英语：Input/Output Base Address）
* 拉尔夫·布朗的中断列表（英语：Ralf Brown's Interrupt List）

## 参考资料

[编辑]

* The x86 Interrupt List（页面存档备份，存于互联网档案馆） (a.k.a. RBIL, Ralf Brown's Interrupt List)
* Embedded BIOS User's Manual[失效連結]
* PhoenixBIOS 4.0 User's Manual
* HTML version of Ralf Brown Interrupt List（页面存档备份，存于互联网档案馆）
* IBM Personal System/2 and Personal Computer BIOS Interface Technical Reference, IBM, 1988, ISBN 999857739X
* System BIOS for IBM PCs, Compatibles, and EISA Computers, Phoenix Technologies（英语：Phoenix Technologies）, 1991, ISBN 0201577607
* Programmer's Guide to the AMIBIOS, American Megatrends, 1993, ISBN 0070015619
* The Programmer's PC Sourcebook by Thom Hogan, Microsoft Press, 1991 ISBN 155615321X

1. ^ From bootloader to kernel · Linux Inside. 0xax.gitbooks.io.  [2020-09-10]. （原始内容存档于2020-08-06）.