现在还有乾隆的后代吗:关于时间中断的问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/27 23:08:13
我写一个时间中断的程序,下面是初始化部分.运行到mov ax,251ch,int 21h偏会出错.在windowsxp下,计算机就提示无效指令.在实模式dos下就死机.请各位帮忙看一下.

begin: push cs
pop ds
mov ax,351ch
int 21h
mov old_int,bx
mov old_int,es
mov dx,offset new08h
mov ax,251ch
int 21h
mov dx,offset begin+15+200
mov cl,4
shr dx,cl
add dx,10h
mov al,0
mov ah,31h
int 21h
code ends
end begin

完整程序:
.386
stack segment use16 stack
db 200 dup(0)
stack ends
code segment use16
assume cs:code,ds:code,ss:stack
count db 18
hour db ?,?,':'
min db ?,?,':'
sec db ?,?
buf_len=$-hour
cursor dw ?
old_int dw ?,?
new08h proc far
pushf
call dword ptr cs:old_int
dec cs:count
jz disp
popf
iret
disp: mov cs:count,18
sti
pusha
push ds
push es
mov ax,cs
mov ds,ax
mov es,ax
call get_time
mov bh,0
mov ah,3
int 10h
mov cursor,dx
mov bp,offset hour
mov bh,0
mov dh,0
mov dl,80-buf_len
mov bl,07h
mov cx,buf_len
mov al,0
mov ah,13h
int 10h
mov bh,0
mov dx,cursor
mov ah,2
int 10h
pop es
pop ds
popa
popf
iret
new08h endp

get_time proc
mov al,4
out 70h,al
jmp $+2
in al,71h
mov ah,al
and al,0fh
shr ah,4
add ax,3030h
xchg ah,al
mov word ptr hour,ax
mov al,2
out 70h,al
jmp $+2
in al,71h
mov ah,al
and al,0fh
shr ah,4
add ax,3030h
xchg ah,al
mov word ptr min,ax
mov al,0
out 70h,al
jmp $+2
in al,71h
mov ah,al
and al,0fh
shr ah,4
add ax,3030h
xchg ah,al
mov word ptr sec,ax
ret
get_time endp

begin: push cs
pop ds
mov ax,351ch
int 21h
mov old_int,bx
mov old_int,es
mov dx,offset new08h
mov ax,251ch
int 21h
mov dx,offset begin+15+200
mov cl,4
shr dx,cl
add dx,10h
mov al,0
mov ah,31h
int 21h
code ends
end begin

你oldint里面本来应该存放的是旧的中断入口地址和段首址但是mov old_int,bx
mov old_int,es
你这样一写 oldint里面就只有es段地址了,建议用位操作改一下