首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 汇编语言 >

秒级的延时程序

2012-03-01 
求一个秒级的延时程序小弟编程需要一个秒级的延时程序那位高手能给个~~或帮忙改改下面的程序本想实现3S的

求一个秒级的延时程序
小弟编程需要一个秒级的延时程序
那位高手能给个~~

或帮忙改改下面的程序
本想实现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 进行比较看是否到点的.

热点排行