我的问题是我编写了一个代码,该代码应该将结果输出到连接到并行端口的一组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
答案 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
答案 1 :(得分:8)
您可以使用中断1Ah
/功能00h
(GET 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