8

我的问题是我编写了一个代码,该代码应该将结果输出到一组连接到并行端口的 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 
4

6 回答 6

11

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

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

您可以使用 86H 和 INT 15H 设置多秒延迟

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

在将控制权返回给调用者之前等待指定的微秒数

INT 15H 86H:等待

于 2014-03-04T18:20:05.453 回答
8

您可以使用中断1Ah/函数00hGET SYSTEM TIME)获取自午夜以来的时钟滴答数(18.2/s)CX:DX

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

于 2013-03-04T13:28:52.707 回答
3

我最终使用的是 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 来学习这门汇编语言课程 :(

于 2013-03-06T15:43:59.757 回答
1

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

下面的示例延迟大约 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
于 2015-09-17T15:27:15.073 回答
-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

我是手机的。对不起我的输入;)

于 2013-09-23T17:10:49.150 回答
-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
于 2016-03-05T13:11:11.287 回答