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

Jer*_*ngo 8 time assembly 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 
Run Code Online (Sandbox Code Playgroud)

joh*_*ohn 10

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

MOV     CX, 0FH
MOV     DX, 4240H
MOV     AH, 86H
INT     15H
Run Code Online (Sandbox Code Playgroud)

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

查看这些链接了解更多详情

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

INT 15H 86H:等等


Mic*_*ael 8

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

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


Jer*_*ngo 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
Run Code Online (Sandbox Code Playgroud)

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

我在这里使用的是AAAA两者SI and BP,最终每个延迟循环大约有 1 秒。

感谢大家的帮助,是的,我们在这个汇编语言课程中仍然使用 MS DOS :(