| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 编程论坛
大量收QQ微信精准粉/交友粉,非诚勿扰千里之行 始于足下
共有 499 人关注过本帖
标题:汇编语言求解,这个延时函数的分析
只看楼主 加入收藏
nihaoburen
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2018-5-14
结帖率:75%
  已结贴   问题点数:20  回复次数:2   
汇编语言求解,这个延时函数的分析
DELAY PROC     ;
    PUSH CX
    PUSH BX
    MOV BX,0FFH
D1:     MOV CX,0FFFFH
D2:    LOOP D2
    DEC BX
    JNZ D1
    POP BX
    POP CX
    RET
DELAY ENDP

这个延时函数延时多长时间从哪里看出来?
用PUSH CX ,和POP CX,进栈和出栈的作用是为了干什么?
在主程序里有LOOP循环的话,LOOP的CX和这里的CX并不冲突,是不是就是和进栈和出栈有关?求讲解,不太明白
2018-05-25 15:52
Valenciax
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:10
帖 子:203
专家分:1332
注 册:2016-5-15
  得分:20 
push bx ;保存
push cx ;保存
..
..
pop cx ;回复
pop bx ;回复

加了push和pop是保证父程序的bx,cx不会被破坏.

至于延时效果,看什么cpu速度和场合吧.
延时多久 = 指令数 = 也就是cx loop的次数和bx递减的次数 = 0ffh x 0ffffh  = 16,711,425次(10进制)
运行 一千六百多万次指令,在我的老旧机器仍是一闪而过,根本不知道是几多分之一秒.
然后开了dosbox虚拟机(模拟极早期dos的运行方式和速度),这个程序运行了五至六秒.

利用运行多次指令来达到延时效果已经不合时宜,同一部电脑,场合不同已有极大的差异.
可知这种老旧程序根本不行(起码三四十年前的思路),丢之不可惜.

下面是另一个延时子程序.
这是个不需用cpu时脉(指令速度)作准的迟延程序,任何系统和cpu迟延时间一致.
呼叫 delay_proc 子程序即可, 用法

mov ax, 直接值  ;  
call delay_proc ;子程序可以迟延ax/18秒,若ax=36,则迟延约2秒(不管是i7还是10年前的电脑都是2秒)

delay_proc:
 push es
 push dx
 mov dx,40h
 mov es,dx
 mov dx,es:[006ch]
 add dx,ax
delay10:
 cmp es:[006ch],dx
 jbe delay10
 pop dx
 pop es
 ret


[此贴子已经被作者于2018-5-25 20:44编辑过]

2018-05-25 20:37
wmf2014
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:153
帖 子:1706
专家分:9520
注 册:2014-12-6
  得分:0 
mov ah,2c
int 21
执行后dh:dl=秒:1/100秒,也可以做到毫秒级的延时

能编个毛线衣吗?
2018-05-29 11:01







关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022588 second(s), 9 queries.
Copyright©2004-2018, BCCN.NET, All Rights Reserved