assume cs:code,ss:stack
stack segment
db 128 dup (0)
stack ends
code segment
int7c: jmp short set
table dw sub1,sub2,sub3,sub4 ;入口地址直接定址表
set: push bx
cmp ah,3
ja sret ;判断输入值ah是否有效,无效直接推出循环
mov bl,ah
mov bh,0
add bx,bx ;根据ah中的功能号计算对应子程序在table表中的偏移
call word ptr table[bx] ;调用对应的功能子程序
sret: pop bx
iret
sub1: push ax
push ds
push bx
push cx
mov ax,0b800h
mov ds,ax
mov bx,0
mov cx,2000
sub11: mov byte ptr [bx],0 ;将空字符填入屏幕
add bx,2
loop sub11
pop cx
pop bx
pop ds
pop ax
ret
sub2: push ax
push ds
push bx
push cx
mov bx,0b800h
mov ds,bx
mov bx,1
mov cx,2000
sub21: and byte ptr [bx],11111000b
add [bx],al ;将前景色(al值)填入屏幕
add bx,2
loop sub21
pop cx
pop bx
pop ds
pop ax
ret
sub3: push ds
push bx
push cx
mov bx,0b800h
mov ds,bx
mov bx,1
mov cl,4
shl al,cl
mov cx,2000
sub31: and byte ptr [bx],10001111b
add [bx],al ;将背景色(al值)填入屏幕
add bx,2
loop sub31
pop cx
pop bx
pop ds
ret
sub4: push es
push ds
push bx
push cx
mov bx,0b800h
mov es,bx
mov ds,bx
mov di,0 ;第N行(目标地址)
mov si,160 ;第N+1行(源地址)
cld
mov cx,24
sub41: push cx
mov cx,160
rep movsb ;上移一行
pop cx
loop sub41
mov cx,80
sub42: mov byte ptr [bx],0
add bx,2
loop sub42 ;最后一行为空字符
pop cx
pop bx
pop ds
pop es
ret
int7cend: nop
start: mov ax,stack
mov ss,ax
mov sp,128 ;设置栈段
push cs
pop ds
mov si,offset int7c ;ds:[si]为中断例程源地址
mov ax,0
mov es,ax
mov di,200h ;es:[bi]为中断例程目标地址
mov cx,offset int7cend-offset int7c ;中断例程长度
cld
rep movsb ;传递中断例程
cli
mov word ptr es:[7ch*4],0
mov word ptr es:[7ch*4+2],020h
sti ;设置新中断例程的入口地址;考虑到call word ptr取得的是绝对的偏移地址,故入口ip需设置为0
mov ax,4c00h
int 21h
code ends
end start