1、题目
2、个人代码
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start:
mov ax,offset sub1;可以把标号直接当做数据定义的是数据标号
mov ax,offset sub2
mov ax,offset sub3
mov ax,offset sub4
mov ax,stack
mov ss,ax
mov sp,128
;do0安装程序
mov ax,0
mov es,ax
mov di,200h;设置es:di指向目的地址
mov ax,cs
mov ds,ax
mov si,offset setscreen;设置ds:si指向源地址
mov cx,offset setscreenend-offset setscreen;设置cx为传输长度
cld;设置传输方向为正
rep movsb
;设置中端向量表
mov ax,0
mov es,ax
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti
;--------测试新的int7c中断例程----------
;设置前景色为红色
mov ah,1;
mov al,4;传递颜色值
int 7ch
call delay
;设置背景色为绿色
mov ah,2;
mov al,2;
int 7ch
call delay
;向上滚动一行
mov ah,3;
int 7ch
call delay
;清屏
mov ah,0;传递功能号
int 7ch
call delay
mov ah,0;传递功能号
int 7ch
call delay
;---------------------------------------
mov ax,4c00h
int 21h
;延时子程序
delay:
push ax
push dx
mov dx,10h
mov ax,0
s1:
sub ax,1
sbb dx,0
cmp ax,0
jne s1
cmp dx,0
jne s1
pop dx
pop ax
ret
;安装新的int7c中断处理程序
setscreen:
jmp short set
table dw offset sub1-offset setscreen+200h;sub1相对于段地址0的偏移地址
dw offset sub2-offset setscreen+200h
dw offset sub3-offset setscreen+200h
dw offset sub4-offset setscreen+200h
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];调用对应的功能子程序
call word ptr cs:[bx+202h]
sret:
pop bx
iret
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:
push cx
push si
push di
push es
push ds
mov si,0b800h
mov es,si
mov ds,si
mov si,160;ds:si指向第n+1行
mov di,0;es:di指向第n行
cld
mov cx,24;共复制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
setscreenend:
nop
code ends
end start
3、结果
设置前景色为红色
设置背景色为绿色
向上滚动一行
清屏