求一个秒级的延时程序
小弟编程需要一个秒级的延时程序
那位高手能给个~~
或帮忙改改下面的程序
本想实现3S的延时,可是总报错“CPU无效指令”
谢谢~~
stack segment stack 'stack '
dw 100 dup(?)
stack ends
data segment
mes1db '00100100$ '
addr8 dd ? ;存放原8号中断地址
count dw 0 ;时间计数器
data ends
code segment
assume cs:code,ds:data,ss:stack
mainprocfar
pushds
subax,ax
pushax
movax,data
movds,ax
again:mov dl,13
mov ah,02h
int 21h;显示单个字符(CR)输出?
lea dx,mes1
mov ah,9
int 21h ;显示字符串mes1
mov ax,3 ;AX送入延时时间,单位是秒
call delay ;调用延时子程序
ret
mainendp
delayprocnear
pushax
pushbx
push cx
pushdx
push ds
push es
movcx,1000 ;将AX的值转换为毫秒
mul cx
mov cx,55 ;除以8号中断周期
div cx
push ax
mov ax,3508h ;取8号中断地址
int 21h
mov word ptr addr8,bx
mov word ptr addr8+2,es
mov ax,2508h ;给8号中断设新地址
push ds
push cs
pop ds
lea dx,new8
int 21h
pop ds
pop ax
next:cmp count,ax ;比较计数器和AX的值
jb next
mov ax,word ptr addr8+2
mov ds,ax
mov dx,word ptr addr8
mov ax,2508h
int 21h
mov ax,data
mov ds,ax
mov count,0
pop es
pop ds
pop dx
pop cx
pop bx
pop ax
ret
delayendp
new8procfar
inc count ;每55毫秒计数器加一
jmp addr8
iret
new8 endp
code ends
end main
[解决办法]
你这个程序,在NT内核下,不能运行,windows不允许你改中断,
可以调用API函数
[解决办法]
抱歉, 我原来是在 98 的 dos 窗口下看的, 这个功能运作正常. 刚才在 xp 的命令行窗口下, 该功能返回 CF, AH=86h, 说是该功能不被支持. 还是利用 bios 的实时时钟计数器进行判别吧:
DELAY PROCNEAR
push ax
push cx
push dx
push ds
mov cx, 18 ; 18.2 ticks for 1 second
mul cx ; total ticks
mov cx, 40h
mov ds, cx ; ds points to the bios memory area
add ax, ds:[6ch]
adc dx, ds:[6eh]
l_chk:
cmp dx, ds:[6eh]
jb l_ret
ja l_chk
cmp ax, ds:[6ch]
jbe l_ret
jmp l_chk
l_ret:
pop ds
pop dx
pop cx
pop ax
ret
DELAY ENDP
; 不过, 这个子程不能夸午夜操作. 18.2 以 18 计略有误差, 可适当改变算法以增加精度
[解决办法]
40:6c 内存处是实时时钟计数器, dword 类型. 上面的 DX:AX 是需要延时的时钟计数加上当前的时钟计数, 因此它就是延时到点时的时钟计数, 也就是通过它来和 40:6c 处的 dword 进行比较看是否到点的.