本期源码,欢迎star:
https://github.com/ZYKWLJ/assembly4-homework
本系列将讲解《汇编语言》一书,本节讲解**【汇编语言】13-内中断之int中断**。
| 本节速览 |
|---|
| 1.BIOS 是指? |
| 2.BIOS 的功能有那些? |
| 3.给出CPU从加电到整个计算机运行直到被OS接管的全流程?从此,你对计算机的整体理解有了哪些新认识? |
| 4.我们可以编程改变FFFF:O处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。? |
| 5.int19h中断例程,可以由DOS提供吗? |
| 6.使用BIOS和DOS提供的中断例程,可以很方便的进行屏幕输出,请你梳理本节的几个字符打印过程,体会通过内置中断例程进行输出的流程? |
导读:
在 上一章-【汇编语言】13-内中断之int中断 中,我们讲解了int中断指令的运用,并自己动手编写实践。然而,在计算机主板、操作系统自身内部,本身就有提供的一系列优质中断例程,供我们使用。 本节,我们就来详细讲解这些例程。
一、BIOS
1.定义
所谓BIOS,全称为基本输入输出系统,本质是系统ROM主板中的一套固化程序。
2.组成成分
BIOS这套系统程序,包含如下内容:
(1)硬件系统的检测和初始化程序;
(2)外部中断和内部中断的中断例程;
(3)用于对硬件设备进行I/O操作的中断例程;
(4)其他和硬件系统相关的中断例程。
二、DOS内置中断例程
操作系统DOS也提供了中断例程,从操作系统的角度来看,DOS的中断例程就是操作系统 给程序员提供的编程资源。
和硬件设备相关的DOS中断例程中,一般都调用了BIOS的中断例程。
我们可以直接使用
int 中断号来完成BIOS和DOS对应中断的调用,已完成某些工作调用!
三、BIOS和DOS的中断例程安装过程
前面的课程中 ,我们都是自己编写中断例程,将它们放到安装程序中,然后运行安装程序,将它们安装到指定的内存区中。此后,别的应用程序才可以调用。
那么,这里的BIOS和DOS中的中断例程是如何工作的呢?需要我们做什么?
这需要梳理出,计算机CPU从加电到运行的整个过程:
四、CPU从加电到运行的整个过程
(1) 开机后,CPU 一加电,初始化(CS)=0FFFFH,(IP)=0,自动从 FFFF:0 单元开始执行程序。 FFFF:0 处有一条转跳指令,CPU 执行该指令后,转去执行 BIOS 中的硬件系统检测和初始化程序。
(2) 初始化程序将建立 BIOS 所支持的中断向量,即将 BIOS 提供的中断例程的入口地址登记在中断向量表中。
注意,对于 BIOS 所提供的中断例程,只需将入口地址登记在中断向量表中即可,因为它们是固化到 ROM 中的程序,一直在内存中存在。
(3) 硬件系统检测和初始化完成后,调用 int 19h 进行操作系统的引导。从此将计算机交由操作系统控制。
(4) DOS 启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。
以下是全流程图:

FAQ
判断下面说法的正误:
(1)我们可以编程改变FFFF:O处的指令,使得CPU不去执行BIOS中的硬件系统检测和初始化程序。
(2)int19h中断例程,可以由DOS提供。

五、BIOS中断例程实战
1. 中断中的多个子程序
一般来说,一个供程序员调用的中断例程往往包含多个子程序,中断例程内部用传递进来的参数决定执行哪一个子程序。BIOS和DOS提供的中断例程,都用ah传递内部子程序的编号。
2. int 10
int 10是BIOS提供的中断例程,其中包含了多个·屏幕输出相关的子程序。
一、int 10中断例程2号子程序,设置光标位置功能:

其中,(ah)=2表示调用第10h号中断例程的2号子程序,功能为设置光标位置,可以提供光标所在的行号(80* 25字符模式下:024)、`列号`(80*25字符模式下:079),和页号作为参数。
(bh)=0,(dh)=5, (dl)=12,设置光标到第0页,第5行,第12列。
二、int 10中断例程9号子程序,光标位置显示字符功能。

(ah)=9表示调用第10h号中断例程的9号子程序,功能为在光标位置显示字符,可以提供要显示的字符、颜色属性、页号、字符重复个数作为参数。
其中,bl中的颜色属性为:

这和显存中的属性字节一致。
3.bh 中页号的含义:
内存地址空间中,B8000H~BFFFFH共32kB的空间,为80*25彩色字符模式的显示缓冲区。一屏的内容在显示缓冲区中共占4000个字节。
显示缓冲区分为8页,每页4KB(=4000B),显示器可以显示任意一页的内容。一般情况下,显示第0页的内容。也就是说,通常情况下,B8000H~B8F9FH中的4000个字节的内容将出现在显示器上。
4.编程实战
在屏幕的光标下面显示80个红底高亮闪烁绿色的“a”
源码:
assume cs:code
code segment
mov ah,9 ;在光标位置显示字符
mov al,'a' ;字符
mov bl,11001010b ;颜色属性
mov bh,0 ;第0页
mov cx,80 ;字符重复个数
int 10h
mov ax,4c00h
int 21h
code ends
end
结果如下视频:
注意,这里没有设定光标位置,所以默认在现在的输出下面。如果我们想设定光标位置,也可以,使用int 10中断的2号子程序。源码如下:
;使用BIOS的10号中断例程,在屏幕指定位置显示80个红底高亮闪烁绿色的“a”
assume cs:code
code segment
;这里可以选择是否置光标,不置,就是默认下滚。
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,12 ;dh 中放行号
mov dl,0 ;dl 中放列号
int 10h
mov ah,9 ;在光标位置显示字符
mov al,'a' ;字符
mov bl,11001010b ;颜色属性
mov bh,0 ;第0页
mov cx,80 ;字符重复个数
int 10h
mov ax,4c00h
int 21h
code ends
end
结果如下:
六、DOS中断例程实战
int21h中断例程是DOS提供的中断例程,其中包含了DOS提供给程序员在编程时调用的子程序。

最低0.47元/天 解锁文章
3448

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



