assume cs:code
code segment
start:
mov ax , 0
mov es , ax
mov word ptr es:[7ch*4] , offset setscreen //不复制程序,只是将中断向量表中7ch号中断的地址改为我的处理程序的地址,即setscreen函数的地址
mov word ptr es:[7ch*4+2] , cs
mov ax , 0b800h //为了测试我加了这么一段,在屏幕中间显示一个'T' ,其实完全可以不需要这段,也可以观察到程序的效果
mov es , ax
mov bx , 160*12+40*2
mov byte ptr es:[bx] , 'T'
inc bx
mov al , 4 //要观察到不同的效果,需要在ah ,al中传递不同参数,我这里传的是1 和 4,代表将屏幕前景色调整为4对于的颜色
int 7ch
mov ax , 4c00h
int 21h
sub1: //清屏函数
push bx
push cx
push es
mov bx , 0b800h
mov es , bx
mov bx , 0
mov cx , 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
sub2s:
and byte ptr es:[bx] , 11111000b
or es:[bx] , al
add bx , 2
loop sub2s
pop es
pop cx
pop bx
ret
sub3: //调整屏幕背景色函数
push bx
push cx
push es
mov cl , 4
shl al , cl
mov bx , 0b800h
mov es , bx
mov bx , 1
mov cx , 2000
sub3s:
and byte ptr es:[bx] , 10001111b
or es:[bx] , al
add bx , 2
loop sub3s
pop es
pop cx
pop bx
ret
sub4: //向上滚动一行的函数,实现方式:将下一行复制到当前行,然后将最后一行(第24行)全部设置为空格
push cx
push si
push di
push es
push ds
mov si , 0b800h
mov es , si
mov ds , si
mov si , 160
mov di , 0
cld
mov cx , 24
sub4s:
push cx
mov cx , 160
rep movsb
pop cx
loop sub4s
mov cx , 80
mov si , 0
sub4s1:
mov byte ptr [160*24+si] , ' '
add si , 2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
setscreen: //中断程序直接调用的函数
jmp short set
table dw sub1 , sub2, sub3, sub4 //这里保存各个具体功能函数的偏移地址
set:
push bx
cmp ah , 3 //是否是有效参数,ah的范围在 0-3才会处理
ja sret
mov bl , ah
mov bh , 0
add bx , bx
call word ptr table[bx] //根据ah的值确定函数的地址,然后调用的函数,有点函数指针的意思
sret:
pop bx
ret
code ends
code segment
start:
mov ax , 0
mov es , ax
mov word ptr es:[7ch*4] , offset setscreen //不复制程序,只是将中断向量表中7ch号中断的地址改为我的处理程序的地址,即setscreen函数的地址
mov word ptr es:[7ch*4+2] , cs
mov ax , 0b800h //为了测试我加了这么一段,在屏幕中间显示一个'T' ,其实完全可以不需要这段,也可以观察到程序的效果
mov es , ax
mov bx , 160*12+40*2
mov byte ptr es:[bx] , 'T'
inc bx
mov byte ptr es:[bx] , 2
mov al , 4 //要观察到不同的效果,需要在ah ,al中传递不同参数,我这里传的是1 和 4,代表将屏幕前景色调整为4对于的颜色
int 7ch
mov ax , 4c00h
int 21h
sub1: //清屏函数
push bx
push cx
push es
mov bx , 0b800h
mov es , bx
mov bx , 0
mov cx , 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
sub2s:
and byte ptr es:[bx] , 11111000b
or es:[bx] , al
add bx , 2
loop sub2s
pop es
pop cx
pop bx
ret
sub3: //调整屏幕背景色函数
push bx
push cx
push es
mov cl , 4
shl al , cl
mov bx , 0b800h
mov es , bx
mov bx , 1
mov cx , 2000
sub3s:
and byte ptr es:[bx] , 10001111b
or es:[bx] , al
add bx , 2
loop sub3s
pop es
pop cx
pop bx
ret
sub4: //向上滚动一行的函数,实现方式:将下一行复制到当前行,然后将最后一行(第24行)全部设置为空格
push cx
push si
push di
push es
push ds
mov si , 0b800h
mov es , si
mov ds , si
mov si , 160
mov di , 0
cld
mov cx , 24
sub4s:
push cx
mov cx , 160
rep movsb
pop cx
loop sub4s
mov cx , 80
mov si , 0
sub4s1:
mov byte ptr [160*24+si] , ' '
add si , 2
loop sub4s1
pop ds
pop es
pop di
pop si
pop cx
ret
setscreen: //中断程序直接调用的函数
jmp short set
table dw sub1 , sub2, sub3, sub4 //这里保存各个具体功能函数的偏移地址
set:
push bx
cmp ah , 3 //是否是有效参数,ah的范围在 0-3才会处理
ja sret
mov bl , ah
mov bh , 0
add bx , bx
call word ptr table[bx] //根据ah的值确定函数的地址,然后调用的函数,有点函数指针的意思
sret:
pop bx
ret
code ends
end start
效果(1) ah=0 ,实现清屏
效果(2) ah=1 , al=4 ,设置前景色为4对于的色彩
效果(3) ah=2 , al=6 ,将背景色设置为6对于的色彩
效果(4) : 实现上滚一行