dseg segment
count dw 0
sec dw 0
min dw 0
hours dw 0
dseg ends
cseg segment
main proc far
assume cs:cseg,ds:dseg,es:dseg
start: push ds
sub ax,ax
push ax
mov ax,dseg
mov ds,ax
mov al,1ch;Save old interrupt;
mov ah,35h;取中断向量把AL指定的中断类型的中断向量从中断向量表中取到ES:BX中;
int 21h
push es
push bx
push ds
mov dx,offset clint
mov ax,seg clint
mov ds,ax
mov al,1ch;中断类型号1CH;
mov ah,25h;设置中断向量,把AL指定的中断类型的中断向量DS:DX放在中断向量表中;
int 21h
pop ds
in al,21h;中断屏蔽寄存器21H;
and al,0feh
out 21h,al ;设置中断屏蔽位;
sti ;设置中断使能位;
mov cx,60000
mainp: mov ax,60000
again: dec ax
jne again
loop mainp
pop dx;将es:bx值弹出到ds:dx中,恢复1CH中断;
pop ds
mov al,1ch
mov ah,25h
int 21h
ret
main endp
clint proc near
push ds
push bx
mov bx,seg count
mov ds,bx
lea bx,count
inc word ptr [bx] ;把位移量为bx的直接寻址方式,把存储器中的一个字加1;
mov ax,word ptr [bx]
cmp word ptr [bx],18;每秒18.2次;大概1s;
jne exit
call inctest
adj: cmp hours,12
jle timeok;小于或等于转移;
sub hours,12
timeok: mov ax,sec
and ax,0007h;0007&5;0007&15;每隔10s响铃一次;
cmp ax,5;每隔
jne exit
mov dl,07h;the bell ring;响铃;
mov ah,2
int 21h
exit: mov al,20h;EOI送中断结束命令给中断命令寄存器;
out 20h,al
pop bx
pop ds
iret
clint endp
inctest proc near
mov word ptr[bx], 0
add bx,2;时分秒都是字为单位,所以加2个偏移地址;
inc word ptr [bx];让秒分时个单元加一;
cmp word ptr [bx],60;如果秒分时等于60时,高位加一;如果为60s,那么min加一;
jne return
call inctest
return: ret
inctest endp
cseg ends
end start
;IRET 中断返回1,IP,CS和FLAGS出栈;2,返回断点继续执行下一条指令;
;INT 3 程序debug调试指令;