5.4.2 BIOS系统调用

5.4.2 BIOS系统调用

BIOS是BasicInput/OutputSystem的缩写,即基本输入/输出系统,指固化在ROM中的一组程序,又称ROMBIOS。BIOS提供了最低级、最直接的硬件控制,是硬件与软件之间的接口。BIOS主要包括以下一些功能:系统自检及初始化。例如,系统加电启动时对硬件进行检测,对外部设备进行初始化,设置中断向量,引导操作系统等。系统服务。为操作系统和应用程序提供系统服务,这些服务主要与I/O设备有关,如读取键盘输入等。为了完成这些操作,BIOS必须直接与I/O设备打交道,它通过端口与I/O设备之间传送数据,使应用程序脱离具体的硬件操作。

硬件中断处理,提供硬件中断服务程序。

当用户程序请求I/O操作时,DOS系统将要传送请求给BIOS,在BIOS的控制下访问所需要的设备,有时程序会直接向BIOS放出请求,例如对键盘和屏幕的服务,我们不提倡程序绕过DOS操作系统和BIOS直接访问设备。图5-6表明用户程序可以选择的通道。

img103

图5-6 输入/输出接口

DOS操作系统扩充了BIOS的某些功能,提供了更高级的I/O接口。例如,使用BIOS访问文件时,必须给出具体的磁盘地址。若调用DOS服务,则只要给出文件名即可,由DOS根据文件在磁盘上的存放地址调用BIOS来实现,因而更容易使用。

BIOS与DOS的服务功能是以中断服务程序的形式存在的,每类服务对应一个中断号。因此,在设计应用程序时,可以通过INT指令调用DOS或BIOS提供的服务来实现I/ O操作,以减少对硬件环境的依赖。这样不仅可大大简化程序设计,而且使程序简洁、明了且通用性强。

对于学习汇编语言的读者来说,BIOS与DOS是必须要掌握的。由于BIOS和DOS的调用形式是一样的,下面简要介绍一些较常用的键盘输入和显示器输出文本的BIOS服务。

1.键盘BIOS中断调用(16H)

当在IBMPC机的键盘上按下(接通)或放开(断开)一个键时,键盘内部的单片微处理器及相应逻辑会产生一个接通或断开的扫描码,并把扫描码传送给主机CPU。断开扫描码是在接通扫描码上加80H形成的(即两种码仅最高位不同)。系统通过键盘硬件中断把扫描码翻译成ASCII码并与扫描码一起放入键盘缓冲区,每个字符占用两个字节,一个放它的ASCII码,另一个放扫描码。用户可以通过系统提供的键盘中断调用16H从键盘缓冲区中得到字符的ASCII码及其相应的扫描码,以供程序使用。通常程序设计人员没有必要关心扫描码是如何被翻译的,只需从键盘缓冲区中取出自己输入的键值即可。因此在这里只介绍16H中断调用。

16H中断服务子程序提供了多个功能,每个功能对应一个功能号。调用它们的方法是:

(1)功能号→AH。

(2)INT16H。

INT16H的常用功能简述如表5-2所示。

表5-2 INT16H的常用功能

img104

说明:

(1)以上功能及相应的功能号适用于83键、101键等键盘,对于101键键盘的0号功能号还可以是10H,1号还可以是11H。

(2)对于2号功能,AL中返回的键盘状态字节各位含义如图5-7所示。

img105

图5-7 键盘状态字节

【例5-11】从键盘接收一个字符,并送入CHAR变量。

CHARDB?

MOVAH,0

INT16H;等待从键盘接收一个字符

MOVCHAR,AL;接收到的字符保存

也可以用1号功能完成上述功能,但由于1号功能只是从键盘缓冲区中取字符,并不等待,所以要确保得到一个字符,需要编写一个循环程序,如下所示:

CHARDB?

LOP:MOVAH,1

INT16H;读键盘缓冲区

JZLOP;若缓冲区中无字符可取则循环等待

MOVCHAR,AL;接收到的字符保存

【例5-12】设启动时初始化键盘为改写状态。编写能够实现以下要求的程序段:若按了Insert键,则转入插入处理,否则继续处于改写状态。

MOV AH,2

INT16H

TESTAL,80H

JNZINSERT

INSERT:;插入处理

2.显示器BIOS中断调用(10H)

ROMBIOS的10H中断服务子程序提供了多种功能以支持屏幕处理及显示。

计算机的显示器有单色和彩色之分,它们可以工作于文本方式和图形方式。本节只介绍与文本方式有关的部分功能,以便为后面的程序设计提供必要的手段。

显示器在文本方式下可以工作于40×25、80×25等显示方式,下面以普通使用的80×25彩色文本方式为例说明。80×25显示方式是指一屏可以显示25行,每行80列字符。以坐标表示80×25文本方式的显示位置是:屏幕左上角的位置是0行0列,简记为(0,0),屏幕右上角是(0,79),左下角是(24,0),右下角是(24,79)。屏幕上的每个字符在显示RAM中都有两个存储单元相对应,一个存放该字符的ASCII值,一个存放它的属性,所以一屏共需4000个单元。这就是显示器一页的内容,实际上分配给一页是4KB。许多彩色显示卡都支持0~7页,0页为缺省值。

字符的属性确定了每个要显示的字符的特性,例如字符是否闪烁、彩色字符的颜色等。图5-8是彩色文本显示的属性字节,背景可以选择8种颜色,由位6~4组合。前景可以选择16种颜色,由位3~0组合。RGB分别表示红、绿、蓝。BL为闪烁位,BL=1为字符闪烁。I为亮度位,I=1为高亮度,亮度和闪烁只用于前景。表5-3给出了16种字符颜色的组合,它也适用于图形方式。可以看出后8种颜色的I位为1,表示高亮度,因此它是在前8种颜色的基础上加亮的结果。当前景和背景选择相同的颜色组合时,字符便无法看见了。

img106

图5-8 彩色文本属性字节

表5-3 彩色文本显示方式的属性字节

img107

10H中断提供了多种功能,调用的方法是把功能号送入AH,其他调用参数按要求放在适当的寄存器中,然后发INT10H中断调用即可。下面按照通常使用的顺序介绍几个与文本方式有关的功能。

(1)设置显示模式。

功能号:00H

调用参数:AL=显示模式

说明:部分显示模式列于表5-4中。可设置的显示模式与显示卡有关。

表5-4 常用显示模式

img108

【例5-13】设置显示器为80×25彩色文本模式。

MOVAH,00H

MOVAL,03H

INT10H

(2)设置光标位置。

功能号:02H

调用参数:BH=页号,DH=光标行号,DL=光标列号

【例5-14】设置光标在10行20列。

MOVAH,02H;设置光标

MOVBH,00H

MOVDH,10

MOVDL,20

INT10H

(3)读光标位置。

功能号:03H

调用参数:BH=页号

返回参数:CH=光标开始行,CL=光标结束行

DH=光标所在行号,DL=光标所在列号

【例5-15】取光标当前位置

MOVAH,03H

MOVBH,00H

INT10H

(4)初始化窗口或窗口内容向上卷动。

功能号:06H

调用参数:AL=上卷行数,BH=空白区属性(使用属性字节),

CH=窗口左上角行号,CL=窗口左上角列号,

DH=窗口右下角行号,DL=窗口右下角列号

说明:若AL=0,整个窗口为空白,通过它可以实现清屏(初始化窗口)功能。也可以使用本功能在屏幕上开多个窗口,这些窗口都可以独立使用。这些卷动只对窗口内的行有效。如果上卷超过指定窗口的顶部,卷走行的内容就看不见了,出现在窗口底部的新行被填为空格,其属性由BH寄存器决定。与6号功能类似的是7号,但它实现窗口内容向下卷动或初始化窗口的功能,除了功能号不同外,其他调用参数的设置与6号相同。

【例5-16】清屏,并设置为蓝底白字属性。

MOVAH,06H

MOVAL,0

MOVBH,1FH;蓝底白字属性

MOVCX,0

MOVDH,24

MOVDL,4FH

INT10H

【例5-17】开一个窗口,并设置属性为白色背景黑色前景。

MOVAH,06H

MOVAL,0

MOVBH,70H;白色背景黑色前景

MOVCH,10;左上角行号

MOVCL,20;左上角列号

MOVDH,20;右下角行号

MOVDL,60;右下角列号

INT10H

(5)在当前光标位置显示属性和字符。

功能号:09H

调用参数:AL=字符的ASCII码,BL=字符的属性

BH=页号,CX=字符重复个数

说明:该功能不处理光标操作,例如不处理移动光标、不回行、不卷屏等。因此当用此功能显示完字符后还需处理光标。与9号功能类似的是0AH号功能,其调用参数除不用设置BL外,其他同9号。正因为这个区别,所以0AH功能只能在当前光标位置显示字符,而不能改变属性。

【例5-18】在当前光标位置显示一个黑底黄*。

MOVAH,09H;在当前光标位置显示一个黑底黄*

MOVAL,'*'

MOVBH,07H

MOVBL,0EH

MOVCX,1

INT10H

(6)以TTY(电传打字机)方式显示字符。

功能号:0EH

调用参数:BH=页号,AL=字符的ASCII码

说明:该功能较强,它在显示字符后可以对光标做必要的处理,例如可以自动移动光标、自动回行、自动卷屏等。另外它可以处理特殊的控制符,例如换行符(0AH)、Backspace(08H)、响铃符(07H)等。但它不能设置字符的属性。

【例5-19】当出现错误需要发声警告时,可以输出响铃字符。

MOVAH,0EH

MOVAL,07H;响铃字符的ASCII值

INT10H

(7)显示字符串及属性。

功能号:13H

调用参数:ES:BP=串首地址,CX=串长度,BH=页号,BL=属性(AL=2或3有效)

DH=起始行号,DL=起始列号

AL=写字符方式,只有低两位有意义

AL0=0,表示光标返回起始位置;AL0=1,表示光标跟随移动

AL1=0,表示串中只有字符;AL1=1,表示串由字符和属性交替组成

AL1=1,表示串的组成是字符,属性,字符,属性……显然,写字符方式有以下4种组合。

AL=0,显示字符串,且光标返回起始位置。

AL=1,显示字符串,光标跟随移动。

AL=2,显示字符串和属性,且光标返回起始位置。

AL=3,显示字符串和属性,光标跟随移动。

说明:此功能对8086/8088无效。

【例5-20】在屏幕右上角显示字符“$”,并保持原光标的位置不变。

MOVAH,03H;功能3,取光标位置

MOVBH,00H;第0页

INT10H

PUSH DX;保持当前光标位置

MOVAH,02H;功能2,置光标位置

MOVDX,79D;定位(0,79)

INT10H

MOVAH,0EH;功能0EH,TTY方式显示

MOVAL,'$';显示字符“$”

INT10H

MOVAH,02H;功能2,置光标

POPDX;原来光标位置

INT10H

3.时间中断调用(1AH)

(1)读取时间计数器当前值。

功能号:00H

调用参数:CX=时间计数器的高位字,DX=时间计数器的低位字

AL=0,未计满24小时;AL=1,已计满24小时

时间计数器约54.926ms计数一次,可按下面的公式计算当前的时间:

①时计数器的值为:(CX,DX)/65543,余数=时间计数器的值MOD65543。

②分计数器的值为:时的余数/1092,分的余数=时的余数MOD1092。

③秒计数器的值为:分的余数/18.21。

(2)设置时间计数器的当前值。

功能号:01H

调用参数:CX=时间计数器当前值的高位字,DX=时间计数器当前值的低位字可按下列公式推算出当前时间计数器的值:

(CX,DX)=(时*65543)+(分*1092)+(秒*18.21)

【例5-21】编写一个子程序,产生0~50之间的随机整数。

RNDPROCNEAR

PUSHCX

PUSHDX

PUSHAX;保护寄存器内容

STI;开中断

MOVAH,00H

INT1AH

MOVAX,DX

ANDAH,03H;避免溢出,AH高6位清0

MOVDL,51

DIVDL

MOVBL,AH;BL存随机数

POPAX

POPDX

POPCX

RET

RNDENDP

习题5

一、单项选择题(只有一个正确答案)

1.CPU在执行完当前的一条指令后,能响应外部传来的可屏蔽中断请求的条件取决于()。

A.IF=0   B.IF=1   C.TF=0   D.TF=1

2.8086/8088的中断系统,可以处理()种不同类型的中断。

A.64    B.128    C.256   D.1024

3.在DOS系统功能调用中,执行0AH功能调用后,缓冲区第三个字节开始存放的是()。

A.实际输入的字符个数   B.指定接收的字符个数

C.从键盘输入的字符    D.接收的字符$

4.在汇编语言编程中,结束用户程序返回操作系统应使用的中断指令是()。

A.INT10H   B.INT20H  C.RET  D.RET2

5.在进行DOS功能子程序的调用中,功能号应送往()寄存器中。

A.DL     B.DH    C.AL   D.AH

6.执行DOS子功能00H,它所完成的操作与下列()操作等价。

A.INT10HB.INT20HC.INT16HD.INT1AH

7.下列()不是I/O指令的形式。

A.INAL,23H   B.INAX,DX   C.INBL,34H     D.INAL,DX

8.8086/8088的I/O端口地址空间是()。

A.16K      B.32K      C.64K     D.128K

9.在DOS系统功能调用中,执行01H功能调用后,从键盘输入的字符的ASCII码在()。

A.AH中      B.AL中     C.BH中     D.BL中

10.在DOS系统功能调用中,执行02H功能调用前,应将字符的ASCII码放在()。

A.DH中      B.DL中     C.AH中     D.AL中

二、填空题

1.8086/8088寻址I/O端口时,使用条地址总线,可寻址个端口,或个字节端口。

2.中断处理子程序的入口地址存储在内存区域的处。

3.如果CPU不是禁止中断状态,那么可以立即接受中断请求,当CPU接受中断后就会立即进行,防止再次接受中断;为了返回到主程序,现有内容存储到内,中断服务程序结束后,为了正确地继续执行主程序需要寄存器,而且必须是

4.DOS系统中设置了两层内部子程序可供用户使用,即调用和功能的调用。

5.在DOS系统功能调用中,01H号功能调用表示,02H号功能调用表示

6.在DOS系统功能调用中,若实现字符串输出显示应使用功能调用,若实现字符串输入应使用功能调用。

7.在DOS系统功能调用中,退出应用程序返回DOS的功能调用是

三、简答题

1.什么是接口?什么是端口?

2.输入/输出指令有几种形式?什么是长指令和短指令形式?

3.I/O数据传送的控制方法有几种?

3.简述DOS系统功能调用的使用方法。

4.简述BIOS功能调用的使用方法。

5.自己编写一个中断子程序,需要哪些步骤?

6.试述中断返回指令IRET与RET指令的区别。

7.为了保证用户程序执行完后能正常返回DOS,应采取了什么措施?

四、设计题

1.编写一个程序轮流测试两个设备的状态,如果第一个状态寄存器的第一位为1,则与其对应的设备输入一个字符,如果其中任意一个状态寄存器的第三位为1,则输入过程结束。两个状态寄存器端口地址为0024H和0036H,与其对应的数据输入寄存器的端口地址为0026H和0038H,输入的数据分别存放在BUF1和BUF2为首地址的存储区中。

2.设置一个类型号为65H的中断,其功能是将AX中的16位无符号数以4位十六进制数形式在显示器上输出。

3.利用DOS系统功能调用,将键盘输入的小写字母转换为大写字母并输出显示,直到输入“$”字符时停止输出。

4.利用DOS系统功能调用,从键盘输入一串字符,分别统计字母、数字和其他字符的个数。

5.从键盘上输入一串字符,当输入字符是回车符时,输入结束,并把光标置在24行0列上。

6.在品红背景下,显示5个浅绿色闪烁的星号。

7.编写程序,利用21H和1AH中断调用,在屏幕上显示1~9之间的随机数。

8.利用1AH中断调用,编写延时5s的程序。