Как установить 1 вторую задержку времени на языке ассемблера 8086

моя проблема в том, что я написал код, который должен выводить результат в набор светодиодов, подключенных к параллельному порту. Когда я запустил код, он почти ничего не сделал. Мой инструктор сказал мне, что код работает слишком быстро, чтобы мои глаза не видели, что произошло.

Я обнаружил, что есть несколько способов сделать временную задержку, я попытался зациклить 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 

6 ответов


установить интервал в 1 миллион микросекунд (1 секунда) С помощью инструкции ниже .

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

вы можете установить несколько секунд задержки с помощью 86H и INT 15H

проверьте следующие ссылки для получения более подробной информации

ожидает заданное количество микросекунд, прежде чем вернуть управление вызывающему

INT 15H 86H: подождите


вы можете использовать interrupt 1Ah / (ПОЛУЧИТЬ СИСТЕМНОЕ ВРЕМЯ) чтобы получить количество тиков часов (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

я использовал два регистра, которые я установил для них обоих любое высокое значение и он будет продолжать цикл, пока оба значения не достигнут нуля

то, что я использовал здесь, было AAAA для SI and BP, Я закончил примерно с 1 секундой для каждого цикла задержки.

Спасибо за помощь, ребята, и да, мы все еще используем MS DOS для этого курса ассемблера: (


кроме того, вы можете создать процесс и вызывать его каждый раз, когда вы хотите отложить, используя только регистр счетчика и реализацию стека.

пример ниже задержки примерно 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

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

.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

Я с мобильного. Извините за мои входы;)