|
主题 : : 课设二动态时钟子程序中不能安装中断的问题,请教了 [已解决] |
回复[ 5次 ]
点击[ 478次 ] | |
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58 |
下面是课设二动态时钟的测试程序,在VMware的纯dos下运行会引起cpu错误,导致系统重启,经过debug测试,发现是在设置新int 9中段地址时出错,请教一下是什么问题??
assume cs:code
code segment
;时钟显示
;-----------------------------------------------------------------
clock:
jmp short clock_main
cmos:db 32h,9,8,7,4,2,0
form:db "ffff/ff/ff ff:ff:ff","$"
old:dd 0
clock_main:
;配置int 9中断
;--------------------------------------- mov ax,0
mov es,ax
mov ax,es:[9*4] ;保存int 9中断在0:200处
mov es:[200h],ax
mov ax,es:[9*4+2]
mov es:[202h],ax
cli ;&……&%&%……%……¥%……¥&%&%%……%¥……%*&……*(*……就是在这一段出现问题
mov word ptr es:[9*4],offset int9 ;安装新int 9中断
mov word ptr es:[9*4+2],0
sti
;----------------------------------------
;时钟
push cs
pop ds
mov di,offset form
mov bx,offset cmos
;---------------------------judge
store_time:
cmp byte ptr [di],'$'
je show_time
cmp byte ptr [di],' '
je inc_di
cmp byte ptr [di],':'
je inc_di
cmp byte ptr [di],'/'
jne get_time
;#########################
inc_di:
inc di
jmp short store_time
;##########################
get_time:
mov al,[bx]
inc bx
;--------------
out 70h,al
in al,71h
mov ah,al
and ah,00001111b
add ah,30h
mov cl,4
shr al,cl
add al,30h
;---------------
mov [di],ax
;*****************************
loo:
add di,2
jmp short store_time
;-----------------------------
show_time:
mov dh,11
mov dl,32
mov di,offset form
call show_str
;-----------------------------
jmp short clock_main ;动态显示
;-----------------------------
;新int 9中断例程
;------------------------------
int9:
push ax
push bx
push cx
push es
in al,60h
pushf
xor bx,bx
mov es,bx
call dword ptr cs:[bp]
f1:
cmp al,3bh
jne esc1
cli
mov bx,0b800h
mov es,bx
mov cx,19
mov bx, 11*160+32*2+1
color_change: ;变色
inc byte ptr es:[bx]
add bx,2
loop color_change
sti
jmp short int9ret
esc1:
cmp al,1
jne int9ret
cli
push cs:[bp]
pop es:[36]
push cs:[bp+2]
pop es:[38]
sti ;恢复原int 9
exit:
jmp near ptr clock ;退回主界面
int9ret:
pop es
pop cx
pop bx
pop ax
iret
;------------------------------
;字符串显示功能,代替int 21h,dh:行,dl:列,ds:di字串
;-------------------------------------------------
show_str:
push es
push ax
push di
push si
push dx
;------------
e_s:
mov ax,0b800h
mov es,ax
;------------
pointer:
mov ah,0
mov al,0a0h
mul dh
mov dh,0
add dl,dl
add ax,dx
mov si,ax
pop dx
;------------
show_c:
cmp byte ptr [di],'$'
je stop_show
mov ah,[di]
mov es:[si],ah
inc di
add si,2
inc dx
jmp short show_c
;-------------
stop_show:
pop si
pop di
pop ax
pop es
ret
;-------------------------------------------------
;-----------------------------------------------------------
code ends
end clock | | |