. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->汇编语言学习交流区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  8086汇编延时程序  [待解决] 回复[ 3次 ]   点击[ 697次 ]  
inrg
[帖 主]   [ 发表时间:2010-02-08 00:34 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22
方法一:读取0:046ch(55毫秒加1)双字的内容进行比较来延时,发现CPU一下占用50+%,不推荐

方法二:利用 int 08h 和 int 1ch来实现延时,没做,性能不知道怎么样

方法三:我发现循环中用 int 21h 的 2ch 功能,CPU就像没事样的,很好,附上我写的代码:

 

;功能:延时
;参数:bx = 毫秒(带符号,最大取值7fffh)
;说明:延时的时间越长误差越大,最大误差3秒左右
Sleep proc
_Sleep0:
    mov ah, 2ch
    int 21h
    mov cs:[_cmptime], dl
_Sleep1:
    mov ah, 2ch
    int 21h
    cmp cs:[_cmptime], dl
    je _Sleep1
    sub bx, 55
    cmp bx, 0
    jg _Sleep0
    ret
_cmptime:
    db 0
Sleep endp

 

要补充的是:int 21h 的 2ch 功能中的dl资料上写的是1%秒,但是我测试后发现dl是55毫秒加1的。我也不知道对不,反正上面的程序我在XP测试通过了,我的能力有限,不知道有没其他的方法或上面我用的方法有错误,还请指教!
inrg
[第1楼]   [ 回复时间:2010-02-08 00:38 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22
附上测试代码:


assume cs:codesg

codesg segment
start:
    mov al, 0
    out 70h, al
    in al, 71h
    and al, 00001111b
    add al, 30h
    mov ah, 9
    mov bl, 7
    mov bh, 0
    mov cx, 1
    int 10h

    mov bx, 2000
    call Sleep
    
    mov al, 0
    out 70h, al
    in al, 71h
    and al, 00001111b
    add al, 30h
    mov ah, 9
    mov bl, 7
    mov bh, 0
    mov cx, 1
    int 10h
    mov ax, 60
    mov ah, 1
    int 21h
    mov ax, 4c00h
    int 21h
    
;功能:延时
;参数:bx = 毫秒(带符号,最大取值7fffh)
;说明:延时的时间越长误差越大,取最大值误差3秒左右
Sleep proc
_Sleep0:
    mov ah, 2ch
    int 21h
    mov cs:[_cmptime], dl
_Sleep1:
    mov ah, 2ch
    int 21h
    cmp cs:[_cmptime], dl
    je _Sleep1
    sub bx, 55
    cmp bx, 0
    jg _Sleep0
    ret
_cmptime:
    db 0
Sleep endp

codesg ends
end start
inrg
[第2楼]   [ 回复时间:2010-02-08 10:54 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2007-12-08 14:22
基本上没误差!!!
versaariel
[第3楼]   [ 回复时间:2010-02-09 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:62
信誉值:0
注册日期:2009-12-03 13:14
学习学习^-^
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved