1. 预备知识
-
在系统板的 ROM(Read-Only Memory)存在着一套程序,称为 BIOS(基本输入输出系统),BIOS 中主要包括了以下内容:硬件系统的检测和初始化程序,外部中断和内部中断的中断例程,用于对硬件进行 I/O 操作的中断例程,其他和硬件系统相关的中断例程。
-
一般来说,供程序员调用的中断例程中包含多个子程序,中断例程内部通过传入参数决定调用哪个子程序。 BIOS 和 DOS 提供的中断例程,都用 AH 来传递内部子程序的编号。
-
10h 是 BIOS 提供的中断例程,其中包含了许多与屏幕输出相关的子程序。如 10h 中断例程设置光标位置,并在光标位置处显示字符:
;置光标
mov ah,2 ;调用10h的2号子程序设置光标
mov bh,0 ;设置缓冲区页码
mov dh,5 ;行号
mov dl,12 ;列号
int 10h ;调用10h中断例程
;在光标处显示字符
mov ah,9 ;调用10h的9号子程序在光标位置处显示字符
mov al,'a';字符
mov bl,7 ;字符属性
mov bh,0 ;设置缓冲区页码
mov cx,2 ;字符重复次数
int 10h ;调用10h中断例程
通过以上内容,在当前屏幕的第 5 行、12 列显示 3 个红底闪烁绿色的字符 a。整体代码为:
assume cs:code
code segment
start:
;置光标
mov ah,2
mov bh,0
mov dh,5
mov dl,12
int 10h
;在光标处显示字符
mov ah,9
mov al,'a'
mov bl,11001010b
mov bh,0
mov cx,3
int 10h
mov ax,4c00h
int 21h
code ends
end start
程序运行结果如下:
- 21h 是 DOS 提供的中断例程,其中包含了提供给程序员在编程时调用的子程序。从前一直使用的是其 4ch 号子程序,用于程序返回;使用 21h 中断例程在光标位置显示字符串:
;ds:dx 指向字符串,且待显示字符串需用$作为结束符
mov ah,9
int 21h
通过以上内容,在当前屏幕的第 5 行、12 列显示字符串 Welcome to masm!。整体代码为:
assume cs:code
data segment
db 'Welcome to masm!','$'
data ends
code segment
start:
;置光标
mov ah,2
mov bh,0
mov dh,5
mov dl,12
int 10h
;在光标处显示字符串
mov ax,data
mov ds,ax
mov dx,0 ;ds:dx指向字符串
mov ah,9
int 21h
mov ax,4c00h
int 21h
code ends
end start
程序运行结果如下:
2. 实验任务:显示英文诗
下面的程序,分别在第 2、4、6、8 行显示四句英文诗,补全程序。
assume cs:code
code segment
s1:
db 'Good,better,best,','$'
s2:
db 'Never let it rest,','$'
s3:
db 'Till good is better,','$'
s4:
db 'And better,best.','$'
s:
dw offset s1,offset s2,offset s3,offset s4
row:
db 2,4,6,8
start:
mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok:
;待完成部分
code ends
end start
2.1 实验分析
标号 s1、s2、s3 和 s4 分别存放了四句英文诗的内容,均以 $ 结尾;标号 s 存放上述四个标号的偏移地址;标号 row 存放各句英文诗显示的行索引。
21h 中断例程提供的 9 号子程序便于显示以 $ 结尾的字符串,且使用 ds:dx 指向字符串的首地址。则可以通过四次循环每次取得字符串的地址,并配合 int 21h 完成显式。整体代码为:
assume cs:code
code segment
s1:
db 'Good,better,best,','$'
s2:
db 'Never let it rest,','$'
s3:
db 'Till good is better,','$'
s4:
db 'And better,best.','$'
s:
dw offset s1,offset s2,offset s3,offset s4
row:
db 2,4,6,8
start:
mov ax,cs
mov ds,ax
mov bx,offset s
mov si,offset row
mov cx,4
ok:
mov ah,2 ;置光标
mov bh,0 ;第0页
mov dh,[si] ;行号
mov dl,0 ;列号
int 10h
mov dx,[bx] ;ds:dx指向字符串
mov ah,9 ;调用21h的9号功能
int 21h
inc si ;si偏移1个字节,长度为db
add bx,2 ;bx偏移2个字节,长度为dw
loop ok
mov ax,4c00h
int 21h
code ends
end start
2.2 实验结果
3. 总结
-
BIOS 和 DOS 包含的中断例程为程序员提供了众多一定功能的子程序,中断例程内部通过外部的 AH 传参确定调用哪个子程序
-
10h 和 21h 分别为 BIOS 和 DOS 提供的中断例程,里面包含了与屏幕显式相关的子程序
-
参考:汇编语言/王爽著.——北京:清华大学出版社,2003