. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课设二动态时钟子程序中不能安装中断的问题,请教了  [已解决] 回复[ 5次 ]   点击[ 478次 ]  
chaplinyip
[帖 主]   [ 发表时间:2011-08-24 23:16 ]   [引用]   [回复]   [ top ] 
荣誉值: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
chaplinyip
[第1楼]   [ 回复时间:2011-08-24 23:17 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58
cli后面的分号用了中文状态
各位高手若要调试,麻烦你们把它改成英文状态
chaplinyip
[第2楼]   [ 回复时间:2011-08-24 23:19 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58
在补充一下:动态时钟部分是没有问题的,加上安装int 9的语句后就出现了问题
chaplinyip
[第3楼]   [ 回复时间:2011-08-25 00:08 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58
啊,原来只要把设置int 9向量的部分放在循环之前(即clock_main之前)就OK啦
可是为什么呢
chaplinyip
[第4楼]   [ 回复时间:2011-08-25 00:09 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58
编了太久,头脑僵硬,这么简单的事现在才想明白。
唉,没事了,我知道原因了
打扰大家了
chaplinyip
[第5楼]   [ 回复时间:2011-08-27 10:59 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:1
注册日期:2011-07-28 10:58
此贴由 贴主 于 [ 2011-08-27 10:59 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved