注册 登录
编程论坛 汇编论坛

汇编语言求解,这个延时函数的分析

nihaoburen 发布于 2018-05-25 15:52, 3775 次点击
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并不冲突,是不是就是和进栈和出栈有关?求讲解,不太明白
2 回复
#2
Valenciax2018-05-25 20:37
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编辑过]

#3
wmf20142018-05-29 11:01
mov ah,2c
int 21
执行后dh:dl=秒:1/100秒,也可以做到毫秒级的延时
1