8086汇编语言:BIOS中断调用在屏幕上输出图案

一、题目说明:

——在屏幕的第2行、第3列处显示四个红色的‘ *

——在屏幕上输出一个图案,图案内容自行设计

二、实验原理:

用户在汇编语言程序中可使用软中断指令——INT n;调用BIOS程序,其中 n 是中断类型码

常用的BIOS程序的功能与其中断类型码对应关系如下表:

BIOS程序功能与其中断类型码对应关系
中断类型码 BIOS中断调用功能
10H 显示器驱动程序
16H 键盘驱动程序
17H 打印机驱动程序
13H 磁盘驱动程序
14H 通信驱动程序

三、代码求解:

——在屏幕的第2行、第3列处显示四个红色的‘ * ’

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
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    ;此处输入代码段代码
   
    ;初始点初始化
    mov ah,2
    mov dh,1;表示行
    mov dl,2;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,4;重复次数
    int 10h
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

运行结果:

相关解释:

1
2
3
4
    mov ah,2
    mov dh,1;表示行
    mov dl,2;表示列
    int 10h
  • mov ah,2 int 10h具有移动光标的功能

  • dh,dl 进行赋值,可以进一步控制光标移动到具体的哪一行哪一列

注意一点:行列的数据是从0开始算的

1
2
3
4
5
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,4;重复次数
    int 10h
  • mov ah,9 int 10h具有在光标处显示指定字符的功能

  • al 进行赋值指定显示的字符。

  • bl 进行赋值设置相关的颜色,其中前四位表示图案底色后四位表示字体颜色;不信你可以试试(*^_^*)!

  • cx 赋值设置循环输出的次数

——在屏幕上输出一个图案,图案内容自行设计(譬如输出一个 ‘王’ 字)

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
74
75
76
77
78
79
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
    ;初始点初始化
    mov ah,2
    mov dh,0;表示行
    mov dl,0;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,7;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,1;表示行
    mov dl,3;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
   
    ;初始点初始化
    mov ah,2
    mov dh,2;表示行
    mov dl,0;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,7;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,3;表示行
    mov dl,3;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,4;表示行
    mov dl,0;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,7;重复次数
    int 10h
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

运行结果:

又或者输出一个沙漏形状!

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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
   
    ;初始点初始化
    mov ah,2
    mov dh,2;表示行
    mov dl,0;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,9;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,3;表示行
    mov dl,1;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
 
    ;初始点初始化
    mov ah,2
    mov dh,4;表示行
    mov dl,2;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,5;表示行
    mov dl,3;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
   
    ;初始点初始化
    mov ah,2
    mov dh,5;表示行
    mov dl,5;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,4;表示行
    mov dl,6;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,3;表示行
    mov dl,7;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,6;表示行
    mov dl,2;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
     ;初始点初始化
    mov ah,2
    mov dh,6;表示行
    mov dl,6;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,7;表示行
    mov dl,1;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,7;表示行
    mov dl,7;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,1;重复次数
    int 10h
   
    ;初始点初始化
    mov ah,2
    mov dh,8;表示行
    mov dl,0;表示列
    int 10h
   
    mov ah,9
    mov al,'*'
    mov bl,11111100b;底色和字体色
    mov cx,9;重复次数
    int 10h
   
    MOV AH,4CH
    INT 21H
CODES ENDS
    END START

运行结果:

看着这么多的重复代码,本想着是否可以使用函数提升效率,转念一想声明了函数后,初始化参数还不是要写这些代码吗?函数里面就没啥可写了,就得不偿失了!/(ㄒoㄒ)/~~

Ending... ...