INT 10h 中断提供了一系列服务,通过设置不同的功能号(放在AH寄存器中)来实现各种视频操作。每个功能号对应一组特定的操作,下面将详细介绍这些服务及其使用方法。
1. 设置显示模式(AH = 00h)
功能:设置显示模式,即调整显示器的分辨率、颜色深度等。
输入:
- AH = 00h
- AL = 显示模式编号
示例:
mov ah, 00h ; 功能号 00h
mov al, 03h ; 显示模式 03h (80x25 文本模式)
int 10h ; 调用视频服务
常见的显示模式编号:
- 00h = 40x25 文本模式,16色
- 01h = 40x25 文本模式,黑白
- 02h = 80x25 文本模式,16色
- 03h = 80x25 文本模式,黑白
- 13h = 320x200 图形模式,256色
2. 设置光标位置(AH = 02h)
功能:设置光标的位置。
输入:
- AH = 02h
- BH = 页面号(通常为0)
- DH = 行号(0-24)
- DL = 列号(0-79)
示例:
mov ah, 02h ; 功能号 02h
mov bh, 00h ; 页面号 0
mov dh, 10h ; 行号 16
mov dl, 20h ; 列号 32
int 10h ; 调用视频服务
3. 读取光标位置和形状(AH = 03h)
功能:读取当前光标的位置和形状。
输入:
- AH = 03h
- BH = 页面号
输出:
- CH = 光标起始扫描线
- CL = 光标结束扫描线
- DH = 行号
- DL = 列号
示例:
mov ah, 03h ; 功能号 03h
mov bh, 00h ; 页面号 0
int 10h ; 调用视频服务
; 光标位置现在在 DH 和 DL 中
4. 读取光标位置(AH = 03h)
功能:读取当前光标的位置。
输入:
- AH = 03h
- BH = 页面号
输出:
- DH = 行号
- DL = 列号
示例:
mov ah, 03h ; 功能号 03h
mov bh, 00h ; 页面号 0
int 10h ; 调用视频服务
; 光标位置现在在 DH 和 DL 中
5. 显示字符(AH = 0Eh)
功能:在当前光标位置显示字符,并向前移动光标。
输入:
- AH = 0Eh
- AL = 要显示的字符
- BH = 页面号
- BL = 字符颜色(文本模式下)
示例:
mov ah, 0Eh ; 功能号 0Eh
mov al, 'A' ; 字符 'A'
mov bh, 00h ; 页面号 0
mov bl, 07h ; 字符颜色(白色)
int 10h ; 调用视频服务
6. 滚动窗口(AH = 06h)
功能:向上或向下滚动窗口中的文本。
输入:
- AH = 06h
- AL = 行数(若为0,则整个窗口清屏)
- BH = 填充属性(颜色)
- CH = 左上角行号
- CL = 左上角列号
- DH = 右下角行号
- DL = 右下角列号
示例:
mov ah, 06h ; 功能号 06h
mov al, 01h ; 向上滚动 1 行
mov bh, 07h ; 填充属性(白色)
mov ch, 00h ; 左上角行号
mov cl, 00h ; 左上角列号
mov dh, 19h ; 右下角行号
mov dl, 4Fh ; 右下角列号
int 10h ; 调用视频服务
7. 读取字符和属性(AH = 08h)
功能:读取当前光标位置的字符和属性。
输入:
- AH = 08h
- BH = 页面号
输出:
- AH = 字符属性
- AL = 字符
示例:
mov ah, 08h ; 功能号 08h
mov bh, 00h ; 页面号 0
int 10h ; 调用视频服务
; 字符和属性现在在 AL 和 AH 中
8. 写入字符和属性(AH = 09h)
功能:在当前光标位置写入字符和属性,并向前移动光标。
输入:
- AH = 09h
- AL = 要显示的字符
- BH = 页面号
- BL = 字符颜色
- CX = 要写入的次数
示例:
mov ah, 09h ; 功能号 09h
mov al, 'B' ; 字符 'B'
mov bh, 00h ; 页面号 0
mov bl, 07h ; 字符颜色(白色)
mov cx, 1 ; 写入次数
int 10h ; 调用视频服务
9. 读取光标形状(AH = 03h)
功能:读取当前光标形状。
输入:
- AH = 03h
- BH = 页面号
输出:
- CH = 光标起始扫描线
- CL = 光标结束扫描线
示例:
mov ah, 03h ; 功能号 03h
mov bh, 00h ; 页面号 0
int 10h ; 调用视频服务
; 光标形状现在在 CH 和 CL 中
10. 设置光标形状(AH = 01h)
功能:设置光标形状。
输入:
- AH = 01h
- CH = 光标起始扫描线
- CL = 光标结束扫描线
示例:
mov ah, 01h ; 功能号 01h
mov ch, 06h ; 光标起始扫描线
mov cl, 07h ; 光标结束扫描线
int 10h ; 调用视频服务
11. 读取显示器模式(AH = 0Fh)
功能:读取当前显示模式。
输入:
- AH = 0Fh
输出:
- AL = 显示模式
- AH = 行数
- BH = 页面号
示例:
mov ah, 0Fh ; 功能号 0Fh
int 10h ; 调用视频服务
; 显示模式现在在 AL 中
12. 写入像素(AH = 0Ch)
功能:在图形模式下写入一个像素。
输入:
- AH = 0Ch
- AL = 颜色
- CX = 列
- DX = 行
示例:
mov ah, 0Ch ; 功能号 0Ch
mov al, 04h ; 颜色 (红色)
mov cx, 100 ; 列
mov dx, 100 ; 行
int 10h ; 调用视频服务
13. 读取像素(AH = 0Dh)
功能:在图形模式下读取一个像素。
输入:
- AH = 0Dh
- CX = 列
- DX = 行
输出:
- AL = 颜色
示例:
mov ah, 0Dh ; 功能号 0Dh
mov cx, 100 ; 列
mov dx, 100 ; 行
int 10h ; 调用视频服务
; 颜色现在在 AL 中
总结
INT 10h中断提供了一系列强大的视频服务,通过设置不同的功能号和参数,可以
实现对显示器的多种操作。虽然在现代系统中这些功能由更高级别的API和驱动程序管理,但理解这些基础服务对于底层系统编程和历史计算机系统的研究仍然非常有价值。