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设置多个秒延迟
查看这些链接了解更多详情
您可以使用中断1Ah/功能00h(GET SYSTEM TIME)来获取自午夜起的时钟周期数(18.2/s)CX:DX.
因此,使用此方法等待大约1秒钟,您将执行此中断函数一次,将CX:DX保存在变量中,然后在循环中执行相同的中断,直到绝对值CX:DX - firstCX:DX大于18.
我最终使用的是 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 :(