前言:本实验为王爽老师的《汇编语言》第三版中的实验16(p299)
实验环境:DOSBox 0.74-3
实验任务:
安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序:
(1) 清屏;
(2) 设置前景色;
(3) 设置背景色;
(4) 向上滚动一行。
入口参数说明:
(1) 用 ah 寄存器传递功能号:0 表示清屏,1 表示设置前景色,2 表示设置背景色,3 表示向上滚动一行;
(2) 对于1、2号功能,用 al 传送颜色值,(al) ∈{0,1,2,3,4,5,6,7}
程序代码:
assume cs:code
code segment
start: ;安装新的do7ch中断例程到0:200
mov ax,cs
mov ds,ax
mov si,offset do7ch
mov ax,0
mov es,ax
mov di,200h
mov cx,offset do7chend - offset do7ch
cld
rep movsb
;设置中断向量表
cli
mov word ptr es:[7ch*4],200h ;es=0
mov word ptr es:[7ch*4 + 2],0
;返回
mov ax,4c00h
int 21h
org 200h ;设定程序段的起始地址(从“org 偏移地址”开始,后面指令的偏移地址将按照设定的起始地址(偏移地址)为起点开始递增)
do7ch: jmp short do7chstart
table dw sub1,sub2,sub3,sub4 ;存储子程序的偏移地址(一个地址占2字节)
;0 2 4 6
;ah=0 ah=1 ah=2 ah=3
do7chstart:
push bx
mov bl,ah ;bx存储相应的子程序在table中的偏移
mov bh,0
add bx,bx
call word ptr table[bx]
pop bx
mov ax,4c00h
int 21h
sub1: ;ah = 0 清屏
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,0
mov cx,2000
s1: mov byte ptr es:[bx],' '
add bx,2
loop s1
pop cx
pop es
pop bx
ret
sub2: ;ah = 1
;al = 设置的前景色(0、1、2位)
push bx
push es
push cx
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
s2: and byte ptr es:[bx],11111000b ;将前景色012位清零
or es:[bx],al ;设置前景色
add bx,2
loop s2
pop cx
pop es
pop bx
ret
sub3: ;ah = 2
;al = 设置的背景色(4、5、6位)
push bx
push es
push cx
push ax
mov bx,0b800h
mov es,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,2000
s3: and byte ptr es:[bx],10001111b ;将背景色456位清零
or es:[bx],al
add bx,2
loop s3
pop ax
pop cx
pop es
pop bx
ret
sub4: ;ah = 3 向上滚动一行
push bx
push ds
push si
push es
push di
push cx
mov bx,0b800h
mov ds,bx
mov si,160 ;ds:si指向显示区第2行
mov es,bx
mov di,0 ;es:di指向显示区第1行
mov cx,24 ;需要copy 24行
s4: push cx
mov cx,160 ;一行有160个字节单元
cld
rep movsb ;该指令执行完成后si、di都+160
pop cx
loop s4
pop cx
pop di
pop es
pop si
pop ds
pop bx
ret
do7chend:
nop
code ends
end start
1、清屏 功能测试:
运行以下程序:
assume cs:code
code segment
start: mov ah,0 ;ah=0 清屏
;调用新的 int 7ch 中断例程
int 7ch
mov ax,4c00h
int 21h
code ends
end start
运行结果:
2、设置前景色 功能测试:
运行以下程序:
assume cs:code
code segment
start: mov ah,1 ;ah=1 设置前景色
mov al,2 ;al传递颜色值(绿色)
;调用新的 int 7ch 中断例程
int 7ch
mov ax,4c00h
int 21h
code ends
end start
运行结果:
3、设置背景色 功能测试:
运行以下程序:
assume cs:code
code segment
start: mov ah,2 ;ah=2 设置背景色
mov al,1 ;al传递颜色值(蓝色)
;调用新的 int 7ch 中断例程
int 7ch
mov ax,4c00h
int 21h
code ends
end start
运行结果:
4、向上滚动一行 功能测试:
运行以下程序:
assume cs:code
code segment
start: mov ah,3 ;ah=3 向上滚动一行
;调用新的 int 7ch 中断例程
int 7ch
mov ax,4c00h
int 21h
code ends
end start
运行结果: