BIOS和DOS所提供的中断例程
1. BIOS => Basic Input Output System
在系统板的 ROM 中存放着一套程序,称为 BIOS(基本输入输出系统) BIOS 中主要包含以下几部分内容
- 硬件系统的检测和初始化程序
- 外部中断和内部中断的中断例程登记到向量表中
- 用于对硬件设备进行 I/O 操作的中断例程登记到向量表中
- 其他和硬件系统相关的中断例程登记到向量表中
2. BIOS 和 DOS 中断例程的安装过程
BIOS 和 DOS 提供的中断例程是如何安装到内存中的呢?
1、开机后,CPU一加电,初始化(CS)= 0FFFFH,(IP)= 0,自动从FFFF:0单元开始执行程序。
FFFF:0处有一条转跳指令,CPU执行该指令后,转去执行BIOS中的硬件系统检测和初始化程序。
-d FFFF:0
FFFF:0000 EA 5B E0 00 F0 30 31 2F-30 31 2F 39 32 00 FC 55 .[...01/01/92..U
-u FFFF:0
FFFF:0000 EA5BE000F0 JMP F000:E05B
FFFF:0005 3031 XOR [BX+DI],DH
2、初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址(CS:IP)登记在中断向量表中。
注意,对于BIOS所提供的中断例程,只需将入口地址登记在中断向量表中即可,
因为它们是固化到ROM中的程序,一直在内存中存在。
3、硬件系统检测和初始化完成后,调用int 19h进行操作系统的引导。
从此将计算机交由操作系统控制DOS。
4、DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
3. BIOS 中断例程应用
一般来说,一个供程序员调用的中断例程中往往包括多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。 BIOS 和 DOS 提供的中断例程,都用 ah 来传递内部子程序的编号。
编程:在屏幕的 5 行 12 列显示 3 个红底高亮闪烁绿色的"al。
assume cs:code
code segment
; int 10h中断例程的"设置光标位置"功能
mov ah, 2 ; 设置光标调用第10h号中断例程的2号子程序,功能为设置光标位置(可以提供光标所在的行号、列号和页号作为参数)
; 设置光标到第0页,第5行,第12列
mov bh, 0 ; 第0页
mov dh, 5 ; dh中放行号
mov dl, 12 ; dl中放列号
int 10h
; int10h中断例程的"在光标位置显示字符"功能。
mov ah,9 ; 调用第10h号中断例程的9号子程序,功能为在光标位置显示字符
; 提供要显示的字符、颜色属性、页号、字符重复个数作为参数
mov al,'a' ; 字符
mov bl,11001010b ; 颜色属性
mov bh,0 ; 第0页
mov cx,3 ; 字符重复个数
int 10h
code ends
end
bh 中页号的含义:内存地址空间中,B8000HBFFFFH 共 32kB 的空间,为 80*25 彩色字符模式的显示缓冲区。
一屏的内容在显示缓冲区中共占 4000 个字节。显示缓冲区分为 8 页,每页 4KB(约 4000B),显示器可以显示任意一页的内容。
一般情况下,显示第 0 页的内容。也就是说,通常情况下,B8000HB8F9FH 中的 4000 个字节的内容将出现在显示器上。
4. DOS 中断例程应用
int 21h 中断例程是 DOS 提供的中断例程,4ch 号功能,即程序返回功能
mov ah, 4ch ; 调用第21h号中断例程的4ch号子程序,功能为程序返回,可以提供返回值作为参数
mov al, 0 ; 返回值
int 21h
编程:在屏幕的 5 行 12 列显示字符串"Welcome to masm!"。
assume cs:code
data segment
db 'Welcome to masm','#x27; ;"quot;本身并不显示,只起到边界的作用
data ends
code segment
start:
mov ah,2 ; 10号中断设置光标位置功能
mov bh,0 ; 第0页
mov dh,5 ; dh中放行号
mov dl,12 ; dl中放列号
int 10h
mov ax,data
mov ds,ax
mov dx,0 ; ds:dx指向字符串的首地址data:0 (参数)
mov ah,9 ; 调用第21h号中断例程的9号子程序,功能为在光标位置显示字符串,可以提供要显示字符串的地址作为参数
int 21h
mov ax,4c00h ; 21号中断程序返回功能
int 21h
code ends
end start
5. 检测点 13.2
判断下面说法的正误:
(1)我们可以编程改变FFFF:0处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
答:这种说法是错误的。因为该内存单元具有‘只读’属性。
(2)int 19h中断例程,可以由DOS提供。
答:这种说法是错误的。因为int 19h是在DOS启动之前就被执行的中断例程,这里面涉及到一个先后次序的问题,而此次序不能被打乱。