;实验16
;功能:安装中断例程,并调用;(调用程序独立)
;功能1.清屏;功能2.改变前景色;3.改变背景色;4.向上滚动一行.
;条件:当ah=0时,清屏;当ah=1,al={0~7},改变前景色;当ah=2,al={0~7},改变背景色;当al=3,向上滚动一行
assume cs:code
code segment
;****************中断主程序开始****************;
setscreen: jmp short set
table dw sub1,sub2,sub3,sub4 ;功能号偏移地址表
set: push bx
cmp ah,3 ;判断功能号是否大于3
ja sret
mov bl,ah
mov bh,0
add bx,bx ;判断ah中的功能号计算对于的子程序在table表中的偏移
call word ptr table[bx] ;cs的值是:0020h,table的偏移地址是:2h,因为,jmp short set 占了两个字节;
sret: pop bx
iret
;****************中断主程序结束****************;
;****************中断子程序开始****************;
;清屏
sub1: push bx
push cx
push es
mov bx,0b800h ;显示缓冲区
mov es,bx
mov bx,0 ;字符位
mov cx,2000 ;每页2000个显示位
sub1s: mov byte ptr es:[bx],' '
add bx,2
loop sub1s
pop es
pop cx
pop bx
ret
;设置前景色
sub2: push bx
push cx
push es
mov bx,0b800h ;显示缓冲区
mov es,bx
mov bx,1 ;属性位
mov cx,2000 ;每页2000个显示位
sub2s: mov byte ptr es:[bx],al ;前景色代码为0-7
add bx,2
loop sub2s
pop es
pop cx
pop bx
ret
;设置背景色
sub3: push ax
push bx
push cx
push es
mov bx,0b800h ;显示缓冲区
mov es,bx
mov bx,1 ;属性位
mov cl,4
shl al,cl ;相当于al*10h,前景色代码为0-10h-70h
mov cx,2000 ;每页2000个显示位
sub3s: mov byte ptr es:[bx],al
add bx,2
loop sub3s
pop es
pop cx
pop bx
pop ax
ret
;向上滚动一行
sub4: push cx
push ds
push si
push es
push di
mov cx,0b800h
mov es,cx
mov di,0 ;es:di指向N行
mov ds,cx
mov si,160 ;ds:si指向N+1行
cld ;正向复制
mov cx,24 ;复制24行
sub4a: push cx
mov cx,160 ;每行复制160个字符
rep movsb ;si和di会自动递增160
pop cx
loop sub4a
;此时ds:si指向第24行,第0个字节。
mov cx,80 ;处理80个字符
sub4b: mov byte ptr [si],' ' ;最后一行清空
add si,2
loop sub4b
pop di
pop es
pop si
pop ds
pop cx
ret
;****************中断子程序结束****************;
send: nop
;**********************************************;
start: ;中断安装程序开始
mov ax,cs
mov ds,ax
mov si,offset setscreen ;设置ds:si指向源地址
mov ax,0
mov es,ax
mov di,200h ;设置es:di指目标地址
mov cx,offset send - offset setscreen ;设置cx为传输长度
cld ;设置方向为正
rep movsb
;中断安装程序结束
;!!!!!!!!!!!!!!!!!!!!!!!!!注册7号中断向量表开始,重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
mov word ptr es:[7ch*4],0 ;这里的地址以20位的方式去理解.
mov word ptr es:[7ch*4+2],20h ;这样安装完中断向量后,CS段的值就是0020h,偏移地址从0开始。20h*10h+0=200h。
;就不会出现转移定位不准确的问题,因为转移是根据自身偏移地址进行位移的。切记!
;!!!!!!!!!!!!!!!!!!!!!!!!!注册7号中断向量表结束,重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
mov ax,4c00h
int 21h
;**********************************************;
code ends
end start