如何在汇编语言8086中设置1秒的时间延迟

时间:2013-03-04 12:47:11

标签: assembly time delay x86-16

我的问题是我编写了一个代码,该代码应该将结果输出到连接到并行端口的一组LED中。当我运行代码时它几乎没有做任何事情。我的导师告诉我,代码运行得太快,我的眼睛看不到发生了什么。

我发现有几种方法可以延迟时间,我试图循环NOP,但我想我无法确定发生了什么。有没有更好的方法?

我在这里有一部分代码,我必须在其中添加时间延迟:

org 100h

mov ax, 0
mov dx, 378
out dx, ax
mov ax, 1  

; 1st

mov cx, 1ah
start1st:
mov ax, 1
left:
out dx, ax 
; --------------------------------> how to loop?
mov bx, 2
mul bx
cmp ax, 80h
jl left
dec cx
cmp cx,0
jg start1st
; end 1st 

7 个答案:

答案 0 :(得分:10)

设置100万微秒间隔(1秒)  使用以下说明。

MOV     CX, 0FH
MOV     DX, 4240H
MOV     AH, 86H
INT     15H

您可以使用86H和INT 15H

设置多个秒延迟

查看这些链接以获取更多详细信息

Waits a specified number of microseconds before returning control to the caller

INT 15H 86H: Wait

答案 1 :(得分:8)

您可以使用中断1Ah /功能00hGET SYSTEM TIME)来获取CX:DX午夜以来的时钟周期数(18.2 / s)。

因此,使用此方法等待大约1秒钟,您将执行此中断函数一次,将CX:DX保存在变量中,然后在循环中执行相同的中断,直到CX:DX - firstCX:DX的绝对值大于18。

答案 2 :(得分:2)

我最终使用的是nop循环

; start delay

mov bp, 43690
mov si, 43690
delay2:
dec bp
nop
jnz delay2
dec si
cmp si,0    
jnz delay2
; end delay

我使用了两个寄存器,我将它们设置为任何高值 它会继续循环,直到两个值都变为零

我在这里使用的是AAAA SI and BP,我为每个延迟循环结束大约1秒钟。

感谢帮助人员,是的,我们仍然使用MS DOS进行汇编语言课程:(

答案 3 :(得分:0)

或者,您可以创建一个进程,并在每次只想使用计数器寄存器和堆栈实现时调用它。

以下示例大约每秒延迟1/4。

delay       proc
            mov     cx, 003H
    delRep: push    cx
            mov     cx, 0D090H
    delDec: dec     cx
            jnz     delDec
            pop     cx
            dec     cx
            jnz     delRep
            ret
delay       endp

答案 4 :(得分:-1)

.DATA TIK DW ?
...
MOV AX,00H
INT 1AH

MOV TIK,DX
ADD TIK, 12H

DELAY:
MOV AX,00H
INT 1AH
CMP TIK, DX
JGE DELAY

我来自移动设备。抱歉我输入;)

答案 5 :(得分:-1)

delay proc near 
push bx
puch cx
mov bx,2
n1:mov cx,0
loop $
dec bx
jnz n1
pop bx
ret
delay endp

答案 6 :(得分:-2)

DELAY_1SEC: MOV R3,#0AH;10D
LOOP1:      MOV R2,#64H;100D
LOOP2:      MOV R1,#0FAH;250D
LOOP3:      NOP
            NOP
            DJNZ R1,LOOP3;4x250Dx1,085us=1,085ms (0s.001ms010)/cycle
            DJNZ R2,LOOP2;3x100Dx1,085ms=325,5ms (0s.100ms309)/cycle
            DJNZ R3,LOOP1;3x10Dx325,5us=976,5ms (1s.604ms856)/cycle
            RET