BIOS和MS - DOS中断详解
1. 引言
在计算机系统中,中断是一种重要的机制,它允许计算机在执行主程序的过程中,暂停当前操作,转而去处理一些紧急或特定的事件。这里将介绍一些常用的PC中断号,主要分为以下几类:
- 通用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 | 视频服务。用于操作视频显示的例程(完整列表见相关表格)。 |
| 11 | 设备检查。返回一个字,表示系统连接的所有外围设备。 |
| 12 | 内存大小。在AX中返回内存量(以1024字节块为单位)。 |
| 13 | 软盘服务。重置磁盘控制器,获取最近磁盘访问的状态,读写物理扇区,以及格式化磁盘。 |
| 14 | 异步(串行)端口服务。初始化并读写异步通信端口,并返回端口状态。 |
| 15 | 磁带控制器。 |
| 16 | 键盘服务。读取和检查键盘输入(完整列表见相关表格)。 |
| 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服务(完整列表见相关表格)。 |
| 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 LR
A[开始] --> B{选择功能}
B -->|功能1| C[从标准输入读取字符]
B -->|功能2| D[向标准输出写入字符]
B -->|功能9| E[向标准输出写入字符串]
B -->|功能3C| F[创建或截断文件]
C --> G[结束]
D --> G
E --> G
F --> 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指向字符串(在IBM - PC或PC/XT上不起作用)。 |
5. 键盘BIOS INT 16h功能
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字符。(功能00h使用较旧的键盘类型实现相同功能) |
| 11 | 检查键盘缓冲区。查看键盘预输入缓冲区中是否有字符等待。接收:AH = 01h。返回:若有键等待,其扫描码在AH中返回,ASCII码在AL中返回,零标志清除(字符仍留在输入缓冲区)。若无键等待,零标志置位。(功能01h使用较旧的键盘类型实现相同功能) |
| 12 | 获取键盘标志。返回存储在低RAM中的键盘标志字节。接收:AH = 12h。返回:AX中的键盘标志。(功能02h使用较旧的键盘类型实现相同功能) |
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 LR
A[开始] --> B{选择功能}
B -->|功能0000h| C[重置鼠标并获取状态]
B -->|功能0001h| D[显示鼠标指针]
B -->|功能0003h| E[获取鼠标位置和状态]
C --> F[结束]
D --> F
E --> F
通过了解这些中断和相关功能,开发者可以更好地控制计算机系统的各种硬件设备和执行特定的操作,为开发更高效、更强大的程序奠定基础。
7. 中断功能的实际应用示例
7.1 INT 21h读取输入和写入输出示例
在实际编程中,INT 21h的输入输出功能非常常用。以下是一个简单的示例,展示如何使用INT 21h从标准输入读取字符并将其输出到标准输出:
.MODEL SMALL
.STACK 100H
.DATA
prompt_msg DB 'Please enter a character: $'
output_msg DB 'You entered: $'
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 显示提示信息
LEA DX, prompt_msg
MOV AH, 09H
INT 21H
; 从标准输入读取字符
MOV AH, 01H
INT 21H
MOV BL, AL ; 保存读取的字符
; 换行
MOV AH, 02H
MOV DL, 0DH
INT 21H
MOV DL, 0AH
INT 21H
; 显示输出信息
LEA DX, output_msg
MOV AH, 09H
INT 21H
; 输出读取的字符
MOV DL, BL
MOV AH, 02H
INT 21H
; 程序结束
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
7.2 INT 10h设置视频模式示例
INT 10h的设置视频模式功能可以让我们改变屏幕的显示方式。以下是一个设置视频模式为彩色文本模式的示例:
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 设置视频模式为彩色文本模式(模式3)
MOV AH, 00H
MOV AL, 03H
INT 10H
; 程序结束
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
7.3 INT 16h等待按键示例
INT 16h的等待按键功能可以让程序暂停,直到用户按下一个键。以下是一个简单的示例:
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 等待按键
MOV AH, 10H
INT 16H
; 程序结束
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
7.4 INT 33h控制鼠标示例
INT 33h可以用于控制鼠标的各种操作。以下是一个简单的示例,展示如何重置鼠标并获取其状态:
.MODEL SMALL
.STACK 100H
.CODE
MAIN PROC
MOV AX, @DATA
MOV DS, AX
; 重置鼠标并获取状态
MOV AX, 0000H
INT 33H
; 程序结束
MOV AH, 4CH
INT 21H
MAIN ENDP
END MAIN
8. 中断使用的注意事项
8.1 中断向量表的管理
中断向量表存储了中断处理程序的入口地址,在设置中断向量(如使用INT 21h的功能25h)时,需要谨慎操作,避免覆盖重要的中断处理程序。在修改中断向量之前,最好先备份原有的中断向量,以便在程序结束时恢复。
8.2 错误处理
在使用中断功能时,可能会出现各种错误。例如,在打开文件(INT 21h功能3D)时,如果文件不存在或没有权限,会返回错误代码。开发者需要根据返回的错误代码进行相应的错误处理,以保证程序的健壮性。
8.3 兼容性问题
由于不同版本的MS - DOS和硬件环境可能存在差异,某些中断功能在不同的系统上可能会有不同的表现。在开发程序时,需要考虑兼容性问题,尽量进行充分的测试。
9. 总结
本文详细介绍了BIOS和MS - DOS中断的相关知识,包括PC中断、INT 21h、INT 10h、INT 16h和INT 33h等中断的功能及描述。通过表格和流程图的形式,清晰地展示了各个中断的功能和调用流程。同时,还给出了一些实际应用示例,帮助开发者更好地理解和使用这些中断功能。
在实际编程中,中断是一种强大的机制,可以让程序与硬件设备进行交互,实现各种复杂的功能。开发者需要深入理解中断的原理和使用方法,合理运用中断功能,才能开发出高效、稳定的程序。
希望本文能为对计算机中断感兴趣的开发者提供有价值的参考,让大家在开发过程中能够更加得心应手地使用这些中断功能。
以下是一个总结性的表格,对比各个中断的主要用途:
| 中断号 | 主要用途 |
| ---- | ---- |
| INT 21h | 提供MS - DOS的各种服务,如文件操作、输入输出、内存管理等 |
| INT 10h | 用于操作视频显示,如设置视频模式、控制光标、写入字符串等 |
| INT 16h | 处理键盘相关的操作,如读取按键、设置键盘重复率等 |
| INT 33h | 用于跟踪和控制鼠标,如重置鼠标、获取鼠标位置等 |
graph LR
A[PC系统] --> B[BIOS和MS - DOS中断]
B --> C[INT 21h]
B --> D[INT 10h]
B --> E[INT 16h]
B --> F[INT 33h]
C --> G[文件操作]
C --> H[输入输出]
C --> I[内存管理]
D --> J[视频显示操作]
E --> K[键盘操作]
F --> L[鼠标控制]
这个流程图展示了PC系统中BIOS和MS - DOS中断的主要分类及其对应的主要用途,帮助大家从整体上把握各个中断的作用。
超级会员免费看
83

被折叠的 条评论
为什么被折叠?



