汇编语言实验 10:BIOS 中断和 DOS 中断

734 阅读4分钟

1. 预备知识

  1. 在系统板的 ROM(Read-Only Memory)存在着一套程序,称为 BIOS(基本输入输出系统),BIOS 中主要包括了以下内容:硬件系统的检测和初始化程序,外部中断和内部中断的中断例程,用于对硬件进行 I/O 操作的中断例程,其他和硬件系统相关的中断例程。

  2. 一般来说,供程序员调用的中断例程中包含多个子程序,中断例程内部通过传入参数决定调用哪个子程序。 BIOS 和 DOS 提供的中断例程,都用 AH 来传递内部子程序的编号。

  3. 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

程序运行结果如下:

  1. 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. 总结

  1. BIOS 和 DOS 包含的中断例程为程序员提供了众多一定功能的子程序,中断例程内部通过外部的 AH 传参确定调用哪个子程序

  2. 10h 和 21h 分别为 BIOS 和 DOS 提供的中断例程,里面包含了与屏幕显式相关的子程序

  3. 参考:汇编语言/王爽著.——北京:清华大学出版社,2003