21,459
社区成员
发帖
与我相关
我的任务
分享
assume cs:code
code segment
int9: ;自定义的int9中断例程
jmp short init
table_index db 2,3,4,5
table dw sub3 ;226h,0 1,清空,2,设置前景,3,设置背景,4,屏幕向上滚动
init:
push ax
push bx
push cx
push es
push ds
in al,60h
pushf
call dword ptr cs:[200h]
mov bx,20h
mov ds,bx
mov bx,table[4]
add bx,204h
call sub3
;---------------------------------------------------------------------------
;jmp bx 需要用注释的这两个方式来运行程序,任意一种均可
;call table[0]
;---------------------------------------------------------------------------
jmp int9ret
sub3:
mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000
shl al,1
shl al,1
shl al,1
shl al,1
sub3s:
and byte ptr es:[bx],10001111b
or es:[bx],al
add bx,2
loop sub3s
ret
int9ret:
pop ds
pop es
pop cx
pop bx
pop ax
iret
int9end:
nop
start:
mov ax,cs
mov ds,ax
mov ax,0
mov es,ax
mov si,offset int9
mov di,204h
mov cx,offset int9end-offset int9
cld
rep movsb ;安装自定义的int9中断例程
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;保存原中断向量
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0h ;设置自定义的中断向量
sti
mov ax,0b800h
mov es,ax
mov bx,0
mov cx,2000
s: mov byte ptr es:[bx],'A'
add bx,2
loop s
mov cx,120
lp: mov ah,0 ;进行120次读取BIOS键盘缓冲区的操作,
int 16h
loop lp
mov ax,4c00h
int 21h
code ends
end start