***汇编语言 实验16 编写包含多个功能子程序的中断例程

时间:2021-03-05 01:15:14

汇编语言 实验16 编写包含多个功能子程序的中断例程


实验要求

安装一个新的int7ch中断例程,为显示输出提供如下功能子程序。
(1)清屏;
(2)设置前置色;
(3)设置背景色;
(4)向上滚动一行。
入口参数说明如下。
(1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示想上滚动一行
(2)对于1、2号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。

参考程序

;安装一个新的int7ch终端例程,为显示输出提供如下功能子程序
;入口参数:
;ah传递功能号
;al传递颜色值
assume cs:code
code segment
start:
mov bx,cs
mov ds,bx
mov si,offset int7ch
mov bx,0
mov es,bx
mov di,200h
mov cx,offset int7ch_end-offset int7ch
cld
rep movsb
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti

mov ah,2
mov al,2
int 7ch

mov ax,4c00h
int 21h
ORG 200H
;中断例程
int7ch:
push ax
push bx
jmp begin
table dw sub0,sub1,sub2,sub3
begin:
cmp ah,3
ja sret
add bl,ah
mov bh,0
add bx,bx
call word ptr table[bx]
sret:
pop ax
pop bx
iret

;清屏
sub0:
push bx
push es
push ds
push di
push si
push cx
mov bx,0b800h
mov es,bx
mov ds,bx
mov si,160
mov di,0
mov cx,24
cld
sub0s:
push cx
mov cx,160
movsb
mov cx,80
mov si,0
pop cx ;
loop sub0s ;
sub0ss:
mov word ptr es:[si][160*24],' '
add si,2
loop sub0ss
pop cx
pop si
pop di
pop ds
pop es
pop bx
ret
;改变前景色
sub1:
push ax
push bx
push es
push cx
push di
mov bx,0b800h
mov es,bx
mov di,1
mov cx,2000
sub1s:
and byte ptr es:[di],11111000b
or es:[di],al
add di,2
loop sub1s
pop di
pop cx
pop es
pop bx
pop ax
ret
;改变背景色
sub2:
push bx
push es
push cx
mov cl,4 ;al的取值范围是0-7,只占前4个字节
shl al,cl ;但是背景色是第4-6位,所以无法重合,需要左移4位
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
sub2s:
and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub2s
pop cx
pop es
pop bx
ret
;向上滚动一行
sub3:
push bx
push es
push ds
push di
push si
push cx
mov bx,0b800h
mov es,bx
mov ds,bx
mov di,0
mov si,160
cld
mov cx,24
sub3s:
push cx
mov di,0
mov si,160
mov cx,160
rep movsb
pop cx
loop sub3s
sub3ss:
mov byte ptr [160*24+si],' ' ;
add si,2
loop sub3ss;最后一行清空
pop cx
pop si
pop di
pop ds
pop es
pop bx
ret

int7ch_end:
nop
code ends
end start

中间又断了那么多天,今天是七月十号,就当做暑假第一天吧。
2017年7月10日17:26:42