原理:
系统的8254的0号定时计数器会引发日时钟中断。
0号定时计数器每隔55ms向8259A IR0端提一次日时钟中断请求。
CPU响应之后转入08H中断服务程序,并在其中执行软件中断1CH。
所以,我们可以置换1CH的终端服务子程序,来实现系统每隔55ms执行08H的时候执行我们定义的1CH子程序。
要求:
1.每隔一定时间,显示字符串。书上的是显示黑白字符串,这里用bios调用显示彩色。
重点:
1.掌握中断向量的置换(用前保存、写入、用完恢复)
2.掌握用户中断(service)的设计(怎么样实现固定时间显示 和 彩色显示)
;njupt 3th experiment:show the character string dynamicly
.486
data segment use16
;mesg db 'Hello,njupt!',0DH,0AH,'$'
mesg db 'Hello,njupt!'
ll equ $-mesg
old1c dd ?
icount db 18 ;延迟的时间 18*55 大约是1s
count db 10
data ends
code segment use16
assume cs:code,ds:data
beg:
mov ax,data
mov ds,ax
cli
call read1c
call write1c
sti
scan:
cmp count,0
jnz scan
call reset
mov ah,4ch
int 21h
service proc
pusha
push ds
mov ax,data
;--mov ds,ax
mov es,ax
dec icount
jnz exit
mov icount,5 ;在这里修改每次显示延迟的时间 5*55ms
dec count
;mov ah,9 ;原始的是用9号调用ds:dx指向要显示的字符串
;如果要显示彩色字符串,用bios调用即可 13h显示字符串
;lea dx,mesg
mov ax,1301h
mov bh,0
mov bl,01001111B
mov cx,LL
mov dh,10
sub dh,count; 行数
mov dl,0h
lea bp,mesg
int 10h
;int 21h
exit:
pop ds
popa
iret
service endp
;------------------------
read1c proc
mov ax,351ch
int 21h
mov word ptr old1c,bx
mov word ptr old1c+2,es
ret
read1c endp
;----------------------------
write1c proc
push ds
mov ax,code
mov ds,ax
mov dx,offset service
mov ax,251ch
int 21h
pop ds
ret
write1c endp
;-------------------------
reset proc
mov dx,word ptr old1c
mov ds,word ptr old1c+2
mov ax,251ch
int 21h
ret
reset endp
code ends
end beg
效果: