0%

第五章_BIOS和DOS中断调用

BIOS

键盘输入功能调用(INT 16H)

举例:从键盘读入0~9中任一数,根据不同数显示不同的字符串。要求用BIOS中断来接收键盘输入。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
	STACK SEGMENT PARA STACK                         ;堆栈段定义
DB 256 DUP(?)
STACK ENDS

DATA SEGMENT PARA PUBLIC'DATA' ;数据段定义
THIRTY DB 30 ;设每字符串长30
PARM DB 128 DUP(0)
MSG0 DB 'I LIKE IBM PC…'
MSG1 DB '8080 PROGRAMMING IS RUN…'
MSG2 DB 'TIME TO BUY MANY DISKETTES…'
MSG3 DB 'THIS PROGRAM WORKS…'
' MSG4 DB 'TURN OFF THAT PRINTER!…'
MSG5 DB 'I HAVE MANY…'
MSG6 DB 'THE PSP CAN BE USEFUL…'
MSG7 DB 'BASIC WAS EASIER THEN THIS…'
MSG8 DB 'DOS IS INDISPESABLE…‘
MSG9 DB 'LAST MESSAGE OF THE DAY..'
ERRMSG DB 'ERROR! INVALID PARAMETER!'
DATA ENDS

CODE SEGMENT PARA PUBLIC 'CODE ;代码段
START PROC FAR
ASSUME CS: CODE, DS:DATA
PUSH DS ;采用段前缀方式返回DOS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV ES,AX
ASSUME ES:DATA
MOV DX,AX
ASSUME DS:DATA
MOV AH,0 ;功能号为0
INT 16H ;键盘输入,字符在AL中
SUB AL,'0' ;减去字符‘0’的ASCII码
JC ERROR ;键入字符编码小于30H转
CMP AL,9 ;是9吗
JA ERROR ;大于9转,否则顺序执行
MOV BX,OFFSET MSG0 ;MSG0位移送BX
MUL THIRTY ;(AL)×30
ADD BX,AX ;计算输入信息在信息表中的位移
CALL DISPLAY ;转子显示信息
RET ;返回

ERROR:
MOV BX, OFFSET ERRMSG ;出错显示信息位移送BX
CALL DISPLAY ;转子显示信息
RET ;返回
DISPLAY PROC NEAR
MOV CX,30 ;显示字符个数
DISP1:
MOV AL,[BX]
CALL DISPCHAR ;转显示字符子程序
INC BX

LOOP DISP1
MOV DL,0DH ;显示回车符
CALL DISPCHAR
MOV DL,0AH ;显示换行符
CALL DISPCHAR
RET
DISPLAY ENDP


DISPCHAR RPOC NEAR ;显示AL中字符号程序
PUSH BX
MOV BX,0
MOV AH,14 ;14号功能调用为BIOS输出字符
INT 10H
POP BX
RET
DISPCHAR ENDP
CODE ENDS
END START

BIOS显示功能调用(INT 10H)

光标的设置

INT 10H的1号功能是设置光标的大小和状态

  1. 光标起始行值放在CH的低4位,结束行值放在CL的低4位。

  2. CH的D4位为光标禁止位,用来表示光标的状态。当该位为1时,光标不显示。

  3. 单色显示器的光标大小的范围从0~13。光标的默认方式是宽度为2列的闪烁的下划线。

INT 10H的2号功能是设置光标位置

  1. 光标位置的行号设在DH寄存器中,列号设在DL中。

  2. 在25×80的显示方式中,坐标设在(0,0)是屏幕的左上角,(24,79)是屏幕的右下角。

  3. BH中必须包含被输出的页号,对单色显示器来说,页号总是0。

所以设置光标一半就是设置行(DH),列(DL),页(BH)

举例:置光标开始行为5,,并把它设置到第5行第6列

1
2
3
4
5
6
7
8
9
10
11
; 设置光标的大小
MOV CH,5 ;开始行为5
MOV CL,7 ;结束行为7
MOV AH,1 ;设置光标大小
INT 10H ;调用BIOS
; 设置光标的位置
MOV DH,4 ;第5行
MOV DL,5 ;第6列
MOV BH,0 ;0页
MOV AH,2 ;设置光标位置
INT 10H ;调用BIOS

读光标位置,INT 10H的3号功能

  1. 页号必须在BH中指定。

  2. 此功能把光标位置的行号回送给DH,列号回送给DL。光标大小的参数填入CH和CL中,也就是说,在CH和CL中回送的是用功能1设置的光标参数。

举例 读0页的当前光标位置。

1
2
3
MOV	AH,3
MOV BH,0
INT 10H

选择显示页,INT 10H的5号功能

INT 10H的功能5可由程序确定显存中的显示区域。

ROM BIOS将CGA的显存分为4页,每页25×80个字符,或分为8页,每页25×40个字符。每一页的起始地址在

1 KB的边界。这4页的起始地址分别为B800:0000、B800:1000、B800:2000和B800:3000

1
2
3
MOV	AL,VPAGE		;AL=显示页数
MOV AH,5 ;AH=功能号
INT 10H

卷屏,INT 10H的6号和7号功能

清屏

举例1:清除整个屏幕,设置AH为6,AL为0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
CLEAR	PROC
PUSH AX
PUSH BX
PUSH CX
PUSH DX

MOV AH,6 ;屏幕上卷功能号
MOV AL,0 ;AL=0时,为清屏
MOV CH,0 ;CH:屏幕左上角坐标的行号
MOV CL,0 ;CL:屏幕左上角坐标的列号
MOV DH,24 ;DH:屏幕右下角坐标的行号
MOV DL,79 ;DL:屏幕右下角坐标的列号
MOV BH,7 ;上卷行属性正常(即黑底白字)
INT 10H

POP DX
POP CX
POP BX
POP AX
RET
CLEAR ENDP

举例2:将一半的屏幕从黑底白字改为白底黑子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
DATA SEGMENT
STR DB 'Hello world', '$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

START:
MOV AX, DATA
MOV DS, AX

; 设置屏幕显示属性和区域
MOV AH, 07h ; 功能号为07h,选择屏幕下卷功能
MOV AL, 0 ; AL = 0,表示向下滚动0行

MOV BH, 70h ; 设置显示属性,BH = 70h(白色文本,黑色背景)
MOV CH, 0 ; 设置左上角行值,CH = 0
MOV CL, 0 ; 设置左上角列值,CL = 0
MOV DH, 24 ; 设置右下角行值,DH = 24
MOV DL, 39 ; 设置右下角列值,DL = 39
INT 10h ; 调用BIOS中断,功能号由AH寄存器指定,这里为07h

; 打印字符串
MOV SI, OFFSET STR ; SI 指向字符串 STR
MOV AH, 0Eh ; BIOS功能号:显示字符,AL为字符,BH为页号(颜色)
MOV BL, 07h ; 文本颜色,白色文本,黑色背景
PRINT_LOOP:
LODSB ; 加载SI指向的字节到AL,同时SI递增
CMP AL, '$' ; 判断是否字符串结束标志
JE PRINT_DONE ; 如果是结束标志,退出循环
INT 10h ; 调用BIOS中断显示字符
JMP PRINT_LOOP ; 继续循环打印下一个字符

PRINT_DONE:

; 退出程序
MOV AH, 4CH
INT 21H

CODE ENDS
END START

效果如下所示

举例3:在屏幕中心的小窗口显示字符

举例4:编写一个完整的程序(例5-11)在PC机上运行。此程序在屏幕的中间建立一个20列宽和9行高的窗口,

然后把键盘输入的内容在这个窗口上显示出来。键入的字符将被显示在窗口的最下面一行,每当输入20个字

符,该行就向上卷动,9行字符输入完后,顶端行的内容消失。

字符的显示:9号和10号功能

使用INT 10H的9、10两功能,这两个功能的共同点是:都能在光标处显示一个字符,且显示后,光标不动

这就是说,当显示下一个字符前,一定要用2号功能将光标移至下一个字符位置。这两种功能的区别在于用9

号功能显示的字符的属性是用户规定的,用10号功能显示的字符的属性是该位置上已有的属性(以前规定的)。

单色字符显示

举例:从屏幕(40,15)位置开始,用反显示法连续显示5个闪烁的“*”

解释:什么叫反显:正常终端背景是黑色,字体是白色,现在调整终端背景白色,字体是黑色。设置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
DATA SEGMENT
; 无需数据段定义
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX

; 设置光标位置到 (15, 40)
MOV AH, 02H ; AH = 02H,设置光标位置
MOV BH, 0 ; 单色显示器,显示页永远为0
MOV DH, 15 ; 行号
MOV DL, 40 ; 列号
INT 10H ; 将光标设置在 (15, 40) 处

; 显示反显和闪烁的 '*' 字符
MOV AH, 09H ; 显示字符及属性功能
MOV AL, '*' ; 欲显示 '*'
MOV BL, 11110000B ; 属性 1111 0000 (反显和闪烁)
MOV CX, 5 ; 重复显示字符的个数
INT 10H

; 退出程序
MOV AH, 4CH
INT 21H
CODE ENDS
END START

彩色字符显示

修改BL为 MOV BL, 0DAH 即可

彩色文本方式下外框颜色的设置

DOS

磁盘管理