问一下关于定时中断的问题?

任务:利用定时器8253,其中断类型号为1CH,每隔55ms发一次中断请求信号,CPU响应中断后转入执行TIMERINTS中断服务程序,并在CRT上显示某字符或某个图形。
我的程序如下:
data segment
old_cs dw ?
old_ip dw ?
num db 0
buffer db "Got it!",0dh,0ah,'$'
data ends

code segment
assume cs:code,ds:data
start: mov ax,data
mov ds,ax
;save 1ch interrupt vector.
mov al,1ch
mov ah,35h
int 21h
mov ax,es
mov old_cs,ax
mov old_ip,bx
;end save.
;modefy 1ch interrupt vector.
cli
push ds
mov dx,offset timeints
mov ax,seg timeints
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
pop ds
;end modefy.
sti
mov num,0
mainp: cmp num,10h
jnz mainp
;restore 1ch interrupt vector.
push ds
mov dx,old_ip
mov ax,old_cs
mov ds,ax
mov al,1ch
mov ah,25h
int 21h
pop ds
mov ah,4ch
int 21h
timeints proc

push ax
push dx
sti
inc num
lea dx,buffer
mov ah,09h
int 21h
pop dx
pop ax
iret

timeints endp
code ends
end start
运行结果:乱码,而且停不了,除非Ctrl+C.
搞了好久不明白。
[1226 byte] By [seu2002-国立东南大学] at [2008-2-18]
# 1
请各位帮忙,弄不出来啊。
# 2
在中断服务程序中不能保证所有的寄存器(尤其是段寄存器)都没有被修改,因此,需要在中断服务程序中重新设置需要的寄存器的值
Areslee-懒虫易水 at 2007-10-23 > top of Msdn China Tech,其他开发语言,汇编语言...
# 3
timeints proc
sti
push ds
push ax

mov ax, data
mov ds, ax
inc num

;
; 不要调用Int21h显示字符,因为一般情况下Dos不可重入
; 如果要重入,需要特别复杂的处理,参考<未公开的dos秘密>
;
; 可以用Int10h或者直接写显示缓冲区输出信息

pop ax
pop ds
iret

timeints endp
sunrui-sunrui at 2007-10-23 > top of Msdn China Tech,其他开发语言,汇编语言...
# 4
To:sunrui(sunrui)
我试过了,程序跳不出去。死循环了,Ctrl+C也没用了。
是不是还有什么别的问题啊?