2016-11-30 1 views
-2

Я нахожусь в борьбе 3 петли в сборке.
Первый цикл должен работать в течение 10 секунд, затем переходить во второй цикл, который должен выполняться в течение 2 секунд. Третий должен работать еще 10 секунд.Как контролировать петли задержки в сборе

Основная идея - создать светофор. Каждый светодиод, подключенный к параллельному порту, должен включать другой период времени с помощью TASM.
Красный: 10 сек.
Красный & оранжевый: 2 сек
Зеленый: 10 сек
, а затем вернуться к красному снова .. и так далее

Любая помощь, пожалуйста? Я пробовал использовать INT 21h, функцию 2Ch ко времени каждого цикла.

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

мой код:

.model small 
.stack 100 
.code 

Loop_time : 
mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add bx,cx 
mov dl,dh 
mov dh,0 
add bx,dx 
push bx 

loop_red : 

mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,0ah 
pop bx 
cmp ax,bx 
jg loop_redorange 
mov DX, 378h 
mov AL, 1 
out DX,AL 


loop_redorange: 
mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,0ch 
pop bx 
cmp ax,bx 
jg loop_green 
mov DX, 378h 
mov AL,3 
out DX,AL 


loop_green : 

mov ah,2ch 
int 21h 
mov ax,003ch 
mul cl 
mov ch,0000h 
add ax,cx 
mov dl,dh 
mov dh,0 
add ax,dx 
add ax,20h 
pop bx 
cmp ax,bx 
jg loop_red 
mov DX, 378h 
mov AL, 4 
out DX,AL 


mov ah,4ch 
int 21h 
end 
+0

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

+0

Да! в точку . Любая помощь в этом? У моего кода не было ошибок, но он не работал. –

+0

Мы не можем помочь вам с кодом, который вы не публикуете. [Mcve], чтобы показать, что вы пытаетесь сделать, сделало бы этот вопрос лучше. –

ответ

0

привет петля:

.model small 
.data 
    endloop db ? 
.stack 100 
.code 
    mov dx,378h 
    mov ah,2ch 
    int 21h 
    mov endloop,dh 
    add endloop,0ah ; for 10 second 
    cmp endloop,59 ; if endloop <= 60 then ok 
    jle loop_red 
    sub endloop,60 ; convert virtual second in real second 
loop_red: mov ax,003ch 
    mul cl 
    add dx, cl 
    mov bx,dx 
    add bx,000Ah 
    cmp dx,bx 
    jg loop_redorange 
    mov AL, 0001h 
    out DX,AL 
    xor ax,ax 
    mov ah,2ch 
    int 21h 
    cmp endloop,dh ; if current second == (begin second + 10) exit 
    jl loop_red 

$ для другого цикла необходимо изменить только этот цикл.

+2

Это был бы лучший ответ, если бы вы указали, что изменили, и объяснили, почему. SO - это вопросы и ответы, которые могут помочь будущим читателям с подобными проблемами, поэтому объяснения, по крайней мере, так же важны, как и код. вопросы и ответы на код-дамп плохое. –

+0

вы можете отредактировать свой ответ, а не публиковать новый. Но так как вы сделали это уже, возможно, вам следует удалить этот. –

0

хорошая точка Для выполнения цикла вы должны иметь начальную точку и конечную точку. для этого я вставка переменной (ENDLOOP), которые inizialized с конечной точкой линии мов ах, 2ch INT 21h; загрузить системное время мов ENDLOOP Д.Х., сохранить вторую в переменную. add endloop, 0ah; конечное значение вычисления для цикла. теперь может быть то, что стоимость ENDLOOP составляет более 60 секунд (0..59)

cmp endloop,59 ; if endloop <= 60 then ok 
jle loop_red ;not need normalized go to loop 

$ так, я должен нормировать ENDLOOP

Sub endloop,60 ; normalize endloop new range (0..59) 

$, так как мы рассчитали точки конца цикла на кровати секунд будут начальными. , чтобы мы могли начать с нашей петли мы делаем то, что мы должны сделать (метка loop_red) при завершении i проверить, закончен ли цикл. это я делаю так:

xor ax,ax ; clear ax because is needed for system call 
mov ah,2ch ; now read how many time is passed. 
int 21h 
cmp endloop,dh ; the time is ending ? 
jl loop_red ; no repeat a loop 
;yes i can take dh (second for next loop) 

$ я надеюсь, что теперь более ясно, чем раньше.

+0

это отличная информация! Поймите это, я попробую и расскажу вам, что происходит. –

+0

Я обновил свой код до того, с чем я закончил со вчерашнего дня. какие проблемы у него есть? –

Смежные вопросы