Как установить 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
проверьте следующие ссылки для получения более подробной информации
ожидает заданное количество микросекунд, прежде чем вернуть управление вызывающему
вы можете использовать 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
Я с мобильного. Извините за мои входы;)