谁有拦截时钟中断的例子?
我想做一个时钟中断的程序,但不知道怎么下手,你们说说看? 问题点数:100、回复次数:5Top
1 楼Areslee(懒虫易水)回复于 2002-09-07 10:10:38 得分 5
调用INT 21H/AH=25H接管中断。
在中断服务程序中注意保护用到的寄存器,然后在处理完中断后调用原来的系统中断服务。Top
2 楼vBin(彬)回复于 2002-09-07 11:46:55 得分 5
我的网站的“源创作品“中有一个名为sample_DOS的,就是这个例子。
站址:www.vbin.org
or
vbin.51.netTop
3 楼Purpleendurer(编程—>任是无情也动人^_^)回复于 2002-09-08 20:52:43 得分 40
正好有个屏幕保护程序源程序(在指定时间内未按钮则黑屏,按任意键恢复),再次运行将从内存中退出。贴上来仅供参考!
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;Name : SafeScr.asm
;Function : Disapears the screen when user doesn't press key
;Author : Purple Endurer
;Reference: Computer paper 1996U243, Software 1993 P114
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
cseg segment
assume cs: cseg, ds: cseg
org 100h
start: jmp @Init
;====================
Old1cAddr label dword
Old1cOff dw ?
Old1cSeg dw ?
Old09Addr label dword
Old09Off dw ?
Old09Seg dw ?
mcb_evb dw ?
mcb_psp dw ?
show dw 1
count dw 0
VarLen equ $ - Old1cAddr
time equ 1000
;///////////////////////////
new1ch proc far
;///////////////////////////
;sti
push ax
push bx
inc cs:[count]
;mov ax, cs: [time]
cmp cs:[count], time
jne @New1chEnd
mov bl, 36h
mov ax, 1201h
int 10h
mov cs:[count], 0
mov cs:[show], 0
@New1chEnd:
pop bx
pop ax
jmp cs:Old1cAddr
new1ch endp
;///////////////////////////
new09h proc far
;sti
push ax
push bx
cmp cs:[show], 1h
je @New09hEnd
mov cs:[show], 0h
mov bl, 36h
mov ax, 1200h
int 10h
@New09hEnd:
mov cs:[count], 0
pop bx
pop ax
jmp cs:Old09Addr
new09h endp
;///////////////////////////
@Init:
mov ax, 3509h
int 21h
cmp bx, offset new09h
jnz @install ;No install
mov dx, offset strMsgUninstall
mov ah, 09h
int 21h
mov bx, 1ch * 04h
xor ax, ax
mov ds, ax
mov ax, es:[Old1cOff]
mov ds:[bx], ax
mov ax, es:[Old1cSeg]
mov ds:[bx+2], ax
mov bx, 09h * 04h
mov ax, es:[Old09Off]
mov ds:[bx], ax ;ds = 0
mov ax, es:[Old09Seg]
mov ds:[bx+2], ax
mov bx, 1
mov ax, es:[mcb_evb] ;Release evirenment parameter block
mov ds, ax
mov word ptr ds:[bx], 0
mov ax, es:[mcb_psp] ;Release TSR
mov ds, ax
mov word ptr ds:[bx], 0
mov ax, 4c00h
int 21h
@install:
;mov ax, 3509h
;int 21h
mov Old09Seg, es
mov Old09Off, bx
mov ax, cs
dec ax
mov [mcb_psp], ax ;mov cs:[mcb_psp], ax
mov bx, 2ch
mov ax, [bx] ;mov ax, cs:[bx]
dec ax
mov [mcb_evb], ax ;Store the address of evirenment parameter block
mov dx, offset new09h
mov ax, 2509h
int 21h
mov ax, 351ch
int 21h
mov Old1cSeg, es
mov Old1cOff, bx
mov dx, offset new1ch
mov ax, 251ch
int 21h
mov dx, offset strMsgInstall
mov ah, 09h
int 21h
mov dx, offset @Init
add dx, VarLen + 2
mov cl, 04h
shr dx, cl
mov ax, 3100h
int 21h
;====================
strMsgInstall db 07h, "Screensafer installed!$"
strMsgUninstall db 07h, "Screensafer uninstalled!$"
cseg ends
end start
Top
4 楼dsangvei(十年一剑)回复于 2002-09-10 09:25:49 得分 50
我这里有一个在DOS下仿WIN98时钟显示的程序,你可以看一下。
.model tiny
.code
start:
jmp install
count db 0
add8 dd ?
flag db 0
hour db 0
minute db 0
second db 0
free db 0
vec8 proc far
cli
jmp next
inc cs:count
cmp cs:count,18
je disp
jmp next
disp:
mov cs:count,0
; inc free
; cmp free,5
; change the time
cmp cs:second,59
je inc_minute
inc cs:second ;second ++
jmp show
inc_minute:
mov cs:second,0
cmp cs:minute,59
je inc_hour
inc cs:minute
jmp show
inc_hour:
;cmp hour,23
inc cs:hour
show:
push ax
push ds
push bx
push cx
mov ax,0b800h
mov ds,ax
mov bx,3980 ;video buffer
mov cs:carry,0
mov ah,0
mov al,cs:hour
mov cl,10
div cl
add al,'0' ;al = ten
mov byte ptr [bx ],al
add ah,'0'
mov byte ptr [bx+2 ],ah ; hour
mov byte ptr [bx+4 ],':'
mov al,cs:minute
mov ah,0
mov cl,10
div cl
add al,'0'
mov byte ptr [bx+6 ],al
add ah,'0'
mov byte ptr [bx+8 ],ah ; minute
mov byte ptr [bx+10],':'
mov al,cs:second
mov ah,0
mov cl,10
div cl
add al,'0'
mov byte ptr [bx+12 ],al
add ah,'0'
mov byte ptr [bx+14 ],ah ; second
;cmp cs:flag,0
;je vec81
;jmp cs:add8
pop cx
pop bx
pop ds
pop ax
next:
sti
jmp cs:add8
iret
; vec81:
vec8 endp
install: ;resident in mem
mov ah,2ch ;get system time
int 21h
mov cs:hour,ch
mov cs:minute,cl
mov cs:second,dh
mov ax,cs
mov ds,ax
mov ax,351Ch ;get vector 8 and save
int 21h
mov word ptr add8,bx
mov word ptr add8+2,es
mov ax,251Ch
mov dx,offset vec8 ;set new vector
int 21h
mov dx,offset install
mov cl,4
shr dx,cl
inc dx
mov ax,3100h ;exit and resident
int 21h
end start
Top
5 楼metero(天不赋我唯有勤)回复于 2002-09-10 19:47:28 得分 0
对vBin(彬)、Purpleendurer(Purplenendurer) 、 dsangvei(#include“C++”) 表示非常感谢!Top




