69、BIOS和MS - DOS中断详解

BIOS和MS - DOS中断详解

1. 引言

在计算机系统中,中断是一种非常重要的机制,它允许计算机在执行程序的过程中暂停当前操作,转而处理一些紧急或特定的事件。本文将介绍一些常见的PC中断号及其对应的功能,主要包括PC中断、INT 21H(MS - DOS服务)、INT 10H(视频BIOS)、INT 16h(键盘BIOS)和INT 33h(鼠标功能)等方面的内容。

常见的中断号分组如下:
- 通用PC中断列表,对应存储在内存前1024字节的中断向量表。
- INT 21h MS - DOS功能。
- INT 10h视频BIOS功能。
- INT 16h键盘BIOS功能。
- INT 33h鼠标功能。

由于MS - DOS有许多不同的版本,以及各种DOS扩展程序和PC硬件控制器,记录PC中断是一项艰巨的任务。Ralf Brown的中断列表是中断信息的权威来源,可在网上以各种形式获取。

2. PC中断

PC中断涵盖了多种不同类型的事件,以下是一些常见PC中断号及其描述的列表:
| 编号 | 描述 |
| ---- | ---- |
| 0 | 除法错误。CPU生成:尝试除以零时激活。 |
| 1 | 单步执行。CPU生成:当CPU陷阱标志置位时激活。 |
| 2 | 不可屏蔽中断。外部硬件:发生内存错误时激活。 |
| 3 | 断点。CPU生成:执行0CCh(INT 3)指令时激活。 |
| 4 | INTO检测到溢出。CPU生成:执行INTO指令且溢出标志置位时激活。 |
| 5 | 打印屏幕。可通过INT 5指令或按下Shift - PrtSc键激活。 |
| 6 | 无效操作码(80286+) |
| 7 | 处理器扩展不可用(80286+) |
| 8 | IRQ0:系统定时器中断。每秒更新BIOS时钟18.2次。对于自定义编程,可参考INT 1Ch。 |
| 9 | IRQ1:键盘硬件中断。按下键时激活。从键盘端口读取键值并存储在键盘预输入缓冲区中。 |
| 0A | IRQ2:可编程中断控制器 |
| 0B | IRQ3:串行通信(COM2) |
| 0C | IRQ4:串行通信(COM1) |
| 0D | IRQ5:固定磁盘 |
| 0E | IRQ6:软盘中断。进行磁盘寻道时激活。 |
| 0F | IRQ7:并行打印机 |
| 10 | 视频服务。用于操作视频显示的例程(完整列表见表格D - 3)。 |
| 11 | 设备检查。返回一个字,显示连接到系统的所有外围设备。 |
| 12 | 内存大小。在AX中返回内存量(以1024字节块为单位)。 |
| 13 | 软盘服务。重置磁盘控制器,获取最近磁盘访问的状态,读写物理扇区,以及格式化磁盘。 |
| 14 | 异步(串行)端口服务。初始化并读写异步通信端口,并返回端口状态。 |
| 15 | 磁带控制器。 |
| 16 | 键盘服务。读取和检查键盘输入(完整列表见表格D - 4)。 |
| 17 | 打印机服务。初始化、打印并返回打印机状态。 |
| 18 | ROM BASIC。执行ROM中的磁带BASIC。 |
| 19 | 引导加载程序。重启MS - DOS。 |
| 1A | 时间。获取自机器开机以来的定时器滴答数,或设置计数器为新值。滴答每秒发生18.2次。 |
| 1B | 键盘中断。按下CTRL - BREAK时,由INT 9h执行此中断处理程序。 |
| 1C | 用户定时器中断。空例程,每秒执行18.2次。可由自定义程序使用。 |
| 1D | 视频参数。指向包含视频控制器芯片初始化和信息的表。 |
| 1E | 软盘参数。指向包含软盘控制器初始化信息的表。 |
| 1F | 图形表。8×8图形字体。存储所有ASCII码高于127的扩展图形字符的表。 |
| 20 | 终止程序。终止COM程序(建议使用INT 21h功能4Ch)。 |
| 21 | MS - DOS服务(完整列表见表格D - 2)。 |
| 22 | MS - DOS终止地址。指向父程序或进程的地址。当前程序结束时,这将是返回地址。 |
| 23 | MS - DOS中断地址。按下CTRL - BREAK时,MS - DOS跳转到此处。 |
| 24 | MS - DOS严重错误地址。当前程序发生严重错误(如磁盘介质错误)时,DOS跳转到该地址。 |
| 25 | 绝对磁盘读取(已过时)。 |
| 26 | 绝对磁盘写入(已过时)。 |
| 27 | 终止并驻留(已过时)。 |
| 28 - FF | (保留) |
| 33 | 微软鼠标。跟踪和控制鼠标的功能。 |
| 34 - 3E | 浮点仿真。 |
| 3F | 覆盖管理器。 |
| 40 - 41 | 固定磁盘服务。固定磁盘控制器。 |
| 42 - 5F | 保留:特殊用途 |
| 60 - 6B | 可供应用程序使用。 |
| 6C - 7F | 保留:特殊用途 |
| 80 - F0 | 保留:由ROM BASIC使用。 |
| F1 - FF | 可供应用程序使用。 |

3. INT 21H功能(MS - DOS服务)

通过INT 21h可使用众多MS - DOS服务,以下是一些常用功能的简要概述:
| 功能 | 描述 |
| ---- | ---- |
| 1 | 从标准输入读取字符。如果没有字符准备好,则等待输入。返回:AL = 字符。 |
| 2 | 向标准输出写入字符。接收:DL = 字符。 |
| 3 | 从标准辅助输入(串行端口)读取字符。 |
| 4 | 向标准辅助输出(串行端口)写入字符。 |
| 5 | 向打印机写入字符。接收:DL = 字符。 |
| 6 | 直接控制台输入/输出。如果DL = FFh,从标准输入读取等待的字符。如果DL为其他值,将DL中的字符写入标准输出。 |
| 7 | 无回显的直接字符输入。等待标准输入的字符。返回:AL = 字符。 |
| 8 | 无回显的字符输入。等待标准输入设备的字符。返回:AL = 字符。字符不回显。可由Ctrl - Break终止。 |
| 9 | 向标准输出写入字符串。接收:DS:DX = 字符串地址。 |
| 0A | 缓冲键盘输入。从标准输入设备读取一串字符。接收:DS:DX指向预定义的键盘结构。 |
| 0B | 检查标准输入状态。检查是否有输入字符等待。返回:如果字符准备好,AL = 0FFh;否则,AL = 0。 |
| 0C | 清除键盘缓冲区并调用输入功能。清除控制台输入缓冲区,然后执行输入功能。接收:AL = 所需功能(1、6、7、8或0Ah)。 |
| 0E | 选择默认驱动器。接收:DL = 驱动器号(0 = A,1 = B等)。 |
| 0F - 18 | FCB文件功能(已过时)。 |
| 19 | 获取当前默认驱动器。返回:AL = 驱动器号(0 = A,1 = B等) |
| 1A | 设置磁盘传输地址。接收:DS:DX包含磁盘传输区域的地址。 |
| 25 | 设置中断向量。将中断向量表中的一个条目设置为新地址。接收:DS:DX指向插入表中的中断处理程序;AL = 中断号。 |
| 26 | 创建新程序段前缀。接收:DX = 新PSP的段地址。 |
| 27 - 29 | FCB文件功能(已过时)。 |
| 2A | 获取系统日期。返回:AL = 星期几(0 - 6,星期日 = 0),CX = 年,DH = 月,DL = 日。 |
| 2B | 设置系统日期。接收:CX = 年,DH = 月,DL = 日。如果日期有效,返回:AL = 0。 |
| 2C | 获取系统时间。返回:CH = 小时,CL = 分钟,DH = 秒,DL = 百分之一秒。 |
| 2D | 设置系统时间。接收:CH = 小时,CL = 分钟,DH = 秒,DL = 百分之一秒。如果时间有效,返回:AL = 0。 |
| 2E | 设置验证标志。接收:AL = MS - DOS验证标志的新状态(0 = 关闭,1 = 打开),DL = 00h。 |
| 2F | 获取磁盘传输地址(DTA)。返回:ES:BX = 地址。 |
| 30 | 获取MS - DOS版本号。返回:AL = 主版本号,AH = 次版本号,BH = OEM序列号,BL:CX = 24位用户序列号。 |
| 31 | 终止并驻留。终止当前程序或进程,将部分程序留在内存中。接收:AL = 返回码,DX = 请求的段落数。 |
| 32 | 获取MS - DOS驱动器参数块。接收:DL = 驱动器号。返回:AL = 状态;DS:BX指向驱动器参数块。 |
| 33 | 扩展中断检查。指示MS - DOS是否正在检查Ctrl - Break。 |
| 34 | 获取INDOS标志的地址。(未记录) |
| 35 | 获取中断向量。接收:AL = 中断号。返回:ES:BX = 中断处理程序的段/偏移量。 |
| 36 | 获取磁盘可用空间。(仅FAT16)接收:DL = 驱动器号(0 = 默认,1 = A等)。返回:如果驱动器号无效,AX = 每簇扇区数或FFFFh;BX = 可用簇数,CX = 每扇区字节数,DX = 每驱动器簇数。 |
| 37 | 获取开关字符。(未记录) |
| 38 | 获取或设置国家信息。 |
| 39 | 创建子目录。接收:DS:DX指向包含路径和目录名的ASCIIZ字符串。如果进位标志置位,返回:AX = 错误代码。 |
| 3A | 删除子目录。接收:DS:DX指向包含路径和目录名的ASCIIZ字符串。如果进位标志置位,返回:AX = 错误代码。 |
| 3B | 更改当前目录。接收:DS:DX指向包含新目录路径的ASCIIZ字符串。如果进位标志置位,返回:AX = 错误代码。 |
| 3C | 创建或截断文件。创建新文件或将旧文件截断为零字节。打开文件进行输出。接收:DS:DX指向包含文件名的ASCIIZ字符串,CX = 文件属性。如果进位标志置位,返回:AX = 错误代码;否则AX = 新文件句柄。 |
| 3D | 打开现有文件。打开文件进行输入、输出或输入 - 输出。接收:DS:DX指向包含文件名的ASCIIZ字符串,AL = 访问代码(0 = 读取,1 = 写入,2 = 读写)。如果进位标志置位,返回:AX = 错误代码;否则AX = 新文件句柄。 |
| 3E | 关闭文件句柄。关闭由文件句柄指定的文件或设备。接收:BX = 先前打开或创建的文件句柄。如果进位标志置位,返回:AX = 错误代码。 |
| 3F | 从文件或设备读取。从文件或设备读取指定数量的字节。接收:BX = 文件句柄,DS:DX指向输入缓冲区,CX = 要读取的字节数。如果进位标志置位,返回:AX = 错误代码;否则,AX = 读取的字节数。 |
| 40 | 向文件或设备写入。向文件或设备写入指定数量的字节。接收:BX = 文件句柄,DS:DX指向输出缓冲区,CX = 要写入的字节数。如果进位标志置位,返回:AX = 错误代码;否则,AX = 写入的字节数。 |
| 41 | 删除文件。从指定目录中删除文件。接收:DS:DX指向包含文件名的ASCIIZ字符串。如果进位标志置位,返回:AX = 错误代码。 |
| 42 | 移动文件指针。根据指定方法移动文件读写指针。接收:CX:DX = 移动文件指针的距离(字节),AL = 方法代码,BX = 文件句柄。方法代码如下:0 = 从文件开头移动,1 = 移动到当前位置加上偏移量,2 = 移动到文件末尾加上偏移量。如果进位标志置位,返回:AX = 错误代码。 |
| 43 | 获取/设置文件属性。获取或设置文件的属性。接收:DS:DX = 指向ASCIIZ路径和文件名的指针,CX = 属性,AL = 功能代码(1 = 设置属性,0 = 获取属性)。如果进位标志置位,返回:AX = 错误代码。 |
| 44 | 设备的I/O控制。获取或设置与打开的设备句柄关联的设备信息,或向设备句柄发送控制字符串,或从设备句柄接收控制字符串。 |
| 45 | 复制文件句柄。为当前打开的文件返回一个新的文件句柄。接收:BX = 文件句柄。如果进位标志置位,返回:AX = 错误代码。 |
| 46 | 强制复制文件句柄。强制CX中的句柄引用与BX中句柄相同位置的同一文件。接收:BX = 现有文件句柄,CX = 第二个文件句柄。如果进位标志置位,返回:AX = 错误代码。 |
| 47 | 获取当前目录。获取当前目录的完整路径名。接收:DS:SI指向一个64字节的区域以保存目录路径,DL = 驱动器号。返回:DS:SI处的缓冲区填充有路径,如果进位标志置位,AX = 错误代码。 |
| 48 | 分配内存。分配请求数量的内存段落,以16字节块为单位。接收:BX = 请求的段落数。返回:AX = 分配块的段,BX = 可用的最大块大小(以段落为单位),如果进位标志置位,AX = 错误代码。 |
| 49 | 释放分配的内存。释放先前由功能48h分配的内存。接收:ES = 要释放的块的段。如果进位标志置位,返回:AX = 错误代码。 |
| 4A | 修改内存块。修改分配的内存块以包含新的块大小。块将缩小或增大。接收:ES = 块的段,BX = 请求的段落数。如果进位标志置位,返回:AX = 错误代码,BX = 可用的最大块数。 |
| 4B | 加载或执行程序。为另一个程序创建程序段前缀,将其加载到内存中并执行。接收:DS:DX指向包含程序的驱动器、路径和文件名的ASCIIZ字符串;ES:BX指向参数块,AL = 功能值。AL中的功能值:0 = 加载并执行程序;3 = 加载但不执行(覆盖程序)。如果进位标志置位,返回:AX = 错误代码。 |
| 4C | 终止进程。终止程序并返回MS - DOS或调用程序的常用方法。接收:AL = 8位返回码,可由DOS功能4Dh或批处理文件中的ERRORLEVEL命令查询。 |
| 4D | 获取进程的返回码。获取由函数调用31h或函数调用4Ch生成的进程或程序的返回码。返回:AL = 程序返回的8位代码,AH = 退出类型:0 = 正常终止,1 = 由CTRLBREAK终止,2 = 由严重设备错误终止,3 = 由函数调用31h终止。 |
| 4E | 查找第一个匹配文件。查找与给定文件规范匹配的第一个文件名。接收:DS:DX指向包含驱动器、路径和文件规范的ASCIIZ字符串;CX = 搜索时使用的文件属性。如果进位标志置位,返回:AX = 错误代码;否则,当前DTA填充有文件名、属性、时间、日期和大小。通常在调用此功能之前调用DOS函数调用1Ah(设置DTA)。 |
| 4F | 查找下一个匹配文件。查找与给定文件规范匹配的下一个文件名。此功能总是在DOS功能4Eh之后调用。如果进位标志置位,返回:AX = 错误代码;否则,当前DTA填充有文件信息。 |
| 54 | 获取验证标志。返回:AH = 磁盘I/O的验证标志(0 = 关闭;1 = 打开)。 |
| 56 | 重命名/移动文件。重命名文件或将其移动到另一个目录。接收:DS:DX指向指定当前驱动器、路径和文件名的ASCIIZ字符串;ES:DI指向新路径和文件名。如果进位标志置位,返回:AX = 错误代码。 |
| 57 | 获取/设置文件日期/时间。获取或设置文件的日期和时间戳。接收:AL = 0获取日期/时间,AL = 1设置日期/时间;BX = 文件句柄,CX = 新文件时间,DX = 新文件日期。如果进位标志置位,返回:AX = 错误代码;否则,CX = 当前文件时间,DX = 当前文件日期。 |
| 58 | 获取或设置内存分配策略。 |
| 59 | 获取扩展错误信息。返回有关MS - DOS错误的附加信息,包括错误类别、位置和建议操作。接收:BX = MS - DOS版本号(版本3.xx为零)。返回:AX = 扩展错误代码,BH = 错误类别,BL = 建议操作,CH = 位置。 |
| 5A | 创建临时文件。在指定目录中生成唯一的文件名。接收:DS:DX指向以反斜杠(\)结尾的ASCIIZ路径名;CX = 所需文件属性。如果进位标志置位,返回:AX = 错误代码;否则,DS:DX指向附加了新文件名的路径。 |
| 5B | 创建新文件。尝试创建新文件,但如果文件名已存在则失败。这可防止覆盖现有文件。接收:DS:DX指向包含路径和文件名的ASCIIZ字符串。如果进位标志置位,返回:AX = 错误代码。 |
| 5C - 61 | 省略。 |
| 62 | 获取程序段前缀(PSP)地址。返回:BX = 当前程序的PSP段值。 |
| 7303h | 获取磁盘可用空间。填充包含详细磁盘空间信息的结构。接收:AX = 7303h,ES:DI指向ExtGetDskFreSpcStruc结构,CX = ExtGetDskFreSpcStruc结构的大小,DS:DX指向包含驱动器名的空终止字符串。返回:ExtGetDskFreSpcStruc填充有磁盘信息。 |
| 7305h | 绝对磁盘读写。读取单个磁盘扇区或扇区组。在Windows NT、2000和XP下不起作用。接收:AX = 7305h,DS:BX = DISKIO结构变量的段/偏移量,CX = 0FFFFh,DL = 驱动器号(0 = 默认,1 = A,2 = B,3 = C等),SI = 读写标志。 |

下面是一个简单的mermaid流程图,展示了使用INT 21h功能读取文件的基本流程:

graph TD
    A[开始] --> B[打开文件: INT 21h功能3D]
    B --> C{是否成功打开?}
    C -- 是 --> D[读取文件: INT 21h功能3F]
    C -- 否 --> E[处理错误]
    D --> F[关闭文件: INT 21h功能3E]
    F --> G[结束]
    E --> G

4. INT 10H功能(视频BIOS)

INT 10h功能主要用于视频显示的操作,以下是一些常见功能的描述:
| 功能 | 描述 |
| ---- | ---- |
| 0 | 设置视频模式。将视频显示设置为单色、文本、图形或彩色模式。接收:AL = 显示模式。 |
| 1 | 设置光标线。确定光标的起始和结束扫描线。接收:CH = 光标起始线,CL = 光标结束线。 |
| 2 | 设置光标位置。在屏幕上定位光标。接收:BH = 视频页面,DH = 行,DL = 列。 |
| 3 | 获取光标位置。获取光标的屏幕位置及其大小。接收:BH = 视频页面。返回:CH = 光标起始线,CL = 光标结束线,DH = 光标行,DL = 光标列。 |
| 4 | 读取光笔。读取光笔的位置和状态。返回:CH = 像素行,BX = 像素列,DH = 字符行,DL = 字符列。 |
| 5 | 设置显示页面。选择要显示的视频页面。接收:AL = 所需页面号。 |
| 6 | 向上滚动窗口。将当前视频页面上的窗口向上滚动,用空白替换滚动的行。接收:AL = 要滚动的行数,BH = 滚动行的属性,CX = 左上角行和列,DX = 右下角行和列。 |
| 7 | 向下滚动窗口。将当前视频页面上的窗口向下滚动,用空白替换滚动的行。接收:AL = 要滚动的行数,BH = 滚动行的属性,CX = 左上角行和列,DX = 右下角行和列。 |
| 8 | 读取字符和属性。读取当前光标位置的字符及其属性。接收:BH = 显示页面。返回:AH = 属性字节,AL = ASCII字符代码。 |
| 9 | 写入字符和属性。在当前光标位置写入字符及其属性。接收:AL = ASCII字符,BH = 视频页面,CX = 重复因子。 |
| 0A | 写入字符。仅在当前光标位置写入字符(无属性)。接收:AL = ASCII字符,BH = 视频页面,BL = 属性,CX = 复制因子。 |
| 0B | 设置调色板。为彩色或EGA适配器选择一组可用颜色。接收:AL = 显示模式,BH = 活动显示页面。 |
| 0C | 写入图形像素。在彩色图形模式下写入图形像素。接收:Al = 像素值,CX = X坐标,DX = Y坐标。 |
| 0D | 读取图形像素。读取给定位置的单个图形像素的颜色。接收:CX = X坐标,DX = Y坐标。 |
| 0E | 写入字符。向屏幕写入字符并推进光标。接收:AL = ASCII字符代码,BH = 视频页面,BL = 属性或颜色。 |
| 0F | 获取当前视频模式。获取当前视频模式。返回:AL = 视频模式,BH = 活动视频页面。 |
| 10 | 设置视频调色板。(仅EGA)设置视频调色板寄存器、边框颜色或闪烁/强度位。接收:AL = 功能代码(00 = 设置调色板寄存器,01 = 设置边框颜色,02 = 设置调色板和边框颜色,03 = 设置/重置闪烁/强度位),BH = 颜色,BL = 要设置的调色板寄存器。如果AL = 2,ES:DX指向颜色列表。 |
| 11 | 字符生成器。为EGA显示选择字符大小。例如,43行显示使用8×8字体,25行显示使用8×14字体。 |
| 12 | 备用选择功能。返回有关EGA显示的技术信息。 |
| 13 | 写入字符串。(仅PC/AT)向视频显示写入一串文本。接收:AL = 模式,BH = 页面,BL = 属性,CX = 字符串长度,DH = 行,DL = 列,ES:BP指向字符串。 |

5. INT 16h功能(键盘BIOS)

INT 16h功能用于键盘输入的处理,以下是一些常见功能:
| 功能 | 描述 |
| ---- | ---- |
| 03h | 设置键盘重复率。接收:AH = 03h,AL = 5,BH = 重复延迟,BL = 重复率。BH中的延迟值:0 = 250 ms;1 = 500 ms;2 = 750 ms;3 = 1000 ms。BL中的重复率从0(最快)到1Fh(最慢)。无返回值。 |
| 05h | 将键推入缓冲区。将键盘字符和相应的扫描码推入键盘预输入缓冲区。接收:AH = 05h,CH = 扫描码,CL = 字符代码。如果预输入缓冲区已满,进位标志将置位,AL = 1。无返回值。 |
| 10 | 等待按键。等待输入字符和键盘扫描码。接收:AH = 10h。返回:AH = 扫描码,AL = ASCII字符。 |
| 11 | 检查键盘缓冲区。查看键盘预输入缓冲区中是否有字符等待。接收:AH = 01h。如果有键等待,其扫描码在AH中返回,ASCII码在AL中返回,零标志清除(字符将保留在输入缓冲区中)。如果没有键等待,零标志置位。 |
| 12 | 获取键盘标志。返回存储在低RAM中的键盘标志字节。接收:AH = 12h。返回:AX中的键盘标志。 |

6. INT 33h功能(鼠标功能)

INT 33h功能用于鼠标的控制和跟踪,以下是一些常见功能:
| 功能 | 描述 |
| ---- | ---- |
| 0000h | 重置鼠标并获取状态。接收:AX = 0000h。重置鼠标并确认其可用。如果找到鼠标,将其置于屏幕中心,将其显示页面设置为视频页面0,隐藏其指针,并将其米基到像素的比率和速度设置为默认值。鼠标的移动范围设置为整个屏幕区域。 |
| 0001h | 显示鼠标指针。接收:AX = 0001h。无返回值。鼠标驱动程序会记录此功能的调用次数。 |
| 0002h | 隐藏鼠标指针。接收:AX = 0002h。无返回值。鼠标不可见时仍会跟踪其位置。 |
| 0003h | 获取鼠标位置和状态。接收:AX = 0003h。返回:BX = 鼠标按钮状态,CX = X坐标(以像素为单位),DX = Y坐标(以像素为单位)。 |
| 0004h | 设置鼠标位置。接收:AX = 0004h,CX = X坐标(以像素为单位),DX = Y坐标(以像素为单位)。无返回值。 |
| 0005h | 获取按钮按下信息。接收:AX = 0005h,BX = 按钮ID(0 = 左,1 = 右,2 = 中)。返回:AX = 按钮状态,BX = 按钮按下计数器,CX = 最后一次按钮按下的X坐标,DX = 最后一次按钮按下的Y坐标。 |
| 0006h | 获取按钮释放信息。接收:AX = 0006h,BX = 按钮ID(0 = 左,1 = 右,2 = 中)。返回:AX = 按钮状态,BX = 按钮释放计数器,CX = 最后一次按钮释放的X坐标,DX = 最后一次按钮释放的Y坐标。 |
| 0007h | 设置水平限制。接收:AX = 0007h,CX = 最小X坐标(以像素为单位),DX = 最大X坐标(以像素为单位)。无返回值。 |
| 0008h | 设置垂直限制。接收:AX = 0008h,CX = 最小Y坐标(以像素为单位),DX = 最大Y坐标(以像素为单位)。无返回值。 |

下面是一个mermaid流程图,展示了使用INT 33h功能控制鼠标的基本流程:

graph TD
    A[开始] --> B[重置鼠标: INT 33h功能0000h]
    B --> C[显示鼠标指针: INT 33h功能0001h]
    C --> D{是否需要移动鼠标?}
    D -- 是 --> E[设置鼠标位置: INT 33h功能0004h]
    D -- 否 --> F{是否需要获取鼠标状态?}
    E --> F
    F -- 是 --> G[获取鼠标位置和状态: INT 33h功能0003h]
    F -- 否 --> H[隐藏鼠标指针: INT 33h功能0002h]
    G --> H
    H --> I[结束]

通过了解和使用这些中断功能,开发者可以更好地控制计算机的硬件资源,实现各种复杂的应用程序。不同的中断功能在不同的场景下发挥着重要作用,例如视频显示、键盘输入、鼠标控制和文件操作等。在实际编程中,需要根据具体需求选择合适的中断功能,并正确处理可能出现的错误。

7. 中断功能的实际应用示例

7.1 读取键盘输入并显示在屏幕上

下面我们结合INT 16h和INT 21h功能,实现一个简单的程序,该程序可以读取键盘输入的字符,并将其显示在屏幕上。

操作步骤:
  1. 使用INT 16h功能10h等待键盘输入。
  2. 获取输入的字符和扫描码。
  3. 使用INT 21h功能2将字符显示在屏幕上。

以下是一个简单的伪代码示例:

; 等待键盘输入
MOV AH, 10h
INT 16h  ; 此时AH为扫描码,AL为ASCII字符

; 显示字符
MOV DL, AL
MOV AH, 2
INT 21h

7.2 更改视频显示模式

使用INT 10h功能0可以更改视频显示模式。以下是一个将视频显示设置为彩色文本模式的示例。

操作步骤:
  1. 设置AL寄存器为所需的显示模式。例如,彩色文本模式可以设置为03h。
  2. 调用INT 10h功能0。

以下是伪代码示例:

MOV AL, 03h  ; 设置为彩色文本模式
MOV AH, 0
INT 10h

7.3 鼠标控制示例

我们可以使用INT 33h功能来控制鼠标的显示、位置和获取其状态。以下是一个简单的示例,展示如何重置鼠标、显示鼠标指针并获取其位置。

操作步骤:
  1. 使用INT 33h功能0000h重置鼠标。
  2. 使用INT 33h功能0001h显示鼠标指针。
  3. 使用INT 33h功能0003h获取鼠标位置和状态。

以下是伪代码示例:

; 重置鼠标
MOV AX, 0000h
INT 33h

; 显示鼠标指针
MOV AX, 0001h
INT 33h

; 获取鼠标位置和状态
MOV AX, 0003h
INT 33h
; 此时BX为鼠标按钮状态,CX为X坐标,DX为Y坐标

8. 中断功能的错误处理

在使用中断功能时,可能会出现各种错误,例如文件打开失败、内存分配失败等。因此,我们需要正确处理这些错误,以确保程序的稳定性。

8.1 检查进位标志

许多中断功能在执行失败时会设置进位标志(CF)。我们可以通过检查进位标志来判断操作是否成功。

例如,在使用INT 21h功能3D打开文件时:

; 打开文件
MOV AH, 3Dh
MOV AL, 0  ; 只读模式
MOV DX, offset filename  ; 文件名地址
INT 21h

JC error_handler  ; 如果进位标志置位,跳转到错误处理程序

; 文件打开成功,继续操作

8.2 获取错误代码

一些中断功能在操作失败时会返回错误代码。我们可以根据错误代码来确定具体的错误原因。

例如,在使用INT 21h功能3D打开文件失败后,可以获取错误代码:

error_handler:
MOV error_code, AX  ; 将错误代码保存到变量error_code中
; 根据错误代码进行相应的处理

9. 总结

本文详细介绍了BIOS和MS - DOS中断的相关知识,包括PC中断、INT 21H(MS - DOS服务)、INT 10H(视频BIOS)、INT 16h(键盘BIOS)和INT 33h(鼠标功能)等方面的内容。

9.1 主要内容回顾

  • PC中断 :涵盖了各种系统级和硬件相关的中断,如系统定时器中断、键盘硬件中断、磁盘中断等。这些中断在计算机系统的正常运行中起着关键作用。
  • INT 21H功能 :提供了丰富的MS - DOS服务,包括文件操作、内存管理、设备控制等。通过这些功能,开发者可以方便地实现各种应用程序。
  • INT 10H功能 :主要用于视频显示的操作,如设置视频模式、控制光标、读写像素等。这些功能使得开发者可以对视频显示进行灵活的控制。
  • INT 16h功能 :用于键盘输入的处理,如设置键盘重复率、检查键盘缓冲区等。
  • INT 33h功能 :用于鼠标的控制和跟踪,如重置鼠标、显示/隐藏鼠标指针、获取鼠标位置和状态等。

9.2 实际应用建议

在实际编程中,开发者需要根据具体需求选择合适的中断功能,并正确处理可能出现的错误。同时,要注意一些已过时的功能,避免在新的程序中使用。

通过合理利用这些中断功能,开发者可以更好地控制计算机的硬件资源,实现各种复杂的应用程序。希望本文的内容对大家在计算机编程和系统开发方面有所帮助。

下面是一个mermaid流程图,总结了使用中断功能的一般流程:

graph TD
    A[确定需求] --> B[选择合适的中断功能]
    B --> C[设置寄存器参数]
    C --> D[调用中断]
    D --> E{操作是否成功?}
    E -- 是 --> F[继续后续操作]
    E -- 否 --> G[处理错误]
    F --> H[结束]
    G --> H

通过以上的介绍和示例,相信大家对BIOS和MS - DOS中断有了更深入的理解。在实际应用中,不断实践和探索,才能更好地掌握这些中断功能的使用。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值