2016-11-30 5 views
-2

Ich bin in einem Kampf Timing 3 Schleifen in der Montage.
Die erste Schleife soll 10 Sek. Lang arbeiten und dann in die zweite Schleife springen, die für 2 Sekunden ausgeführt werden soll. Der dritte soll 10 weitere Sekunden arbeiten.Wie man Verzögerungsschleifen in der Baugruppe steuert

Die Grundidee ist, eine Ampel zu bauen. Jede LED, die an den Parallelanschluss angeschlossen ist, sollte mit TASM eine andere Zeit einschalten.
Rot: 10 sek.
Red & orange: 2 sec
Grün: 10 sec
und dann wieder auf rot zurück .. und so weiter

Jede Hilfe bitte? Ich versuchte mit INT 21h, Funktion 2Ch, um jede Schleife Zeit.

Mein Lehrer sagte mir, es würde auf diese Weise gut funktionieren. noch keine der LEDs eingeschaltet, als ich versuchte, den Code auszuführen.

mein Code:

.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

Also was Sie eigentlich wollen, ist eine Verzögerung-Schleife oder gleichwertiges, keine Zeitmessung eines einzelnen Befehls oder Messung der Leistung. –

+0

Ja! genau . Irgendwelche Hilfe dabei? Mein Code hatte keine Fehler, aber noch nicht funktioniert lol! –

+0

Wir können Ihnen nicht mit Code helfen, den Sie nicht posten. Ein [mcve] zu zeigen, was du versuchst zu tun, würde dies zu einer besseren Frage machen. –

Antwort

0

hallo die Schleife:

.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 

für andere Schleife $ müssen Sie nur diese Schleife ändern.

+2

Dies wäre eine viel bessere Antwort, wenn Sie darauf hingewiesen, was Sie geändert haben, und warum erklärt. SO geht es um Fragen und Antworten, die zukünftigen Lesern mit ähnlichen Problemen helfen können, weshalb Erklärungen mindestens genauso wichtig sind wie der Code. Code-Dump-Fragen und Antworten sind beide schlecht. –

+0

können Sie Ihre Antwort bearbeiten, anstatt eine neue zu schreiben. Aber da du das schon getan hast, solltest du das vielleicht löschen. –

0

guter Punkt für eine Schleife müssen Sie Anfangspunkt und Endpunkt haben. für dieses i eine Variable innen versetzt sind (endloop), die mit Endpunkt Linie mov ah, 2CH int 21h inizialized sind; Laden eines Zeitsystem mov endloop, DH-, speichern der zweiten in variabel. add endloop, 0ah, Berechnung Endwert für die Schleife. kann nun der Wert von endloop sein ist mehr als 60 Sekunden (0..59)

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

so $ i

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

$ normalisiert endloop müssen, da wir die Endschleife Punkt, um die Sekunden Betten berechnet haben werden die ersten sein. so können wir mit unserer Schleife wir tun, was wir tun müssen (Label loop_red) am Ende ich überprüfe, ob die Schleife beendet ist. dies tue ich so:

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) 

i $ hoffen, dass jetzt mehr klar ist, dann vor.

+0

das ist eine tolle Info! .. Wirklich zu schätzen, ich werde es versuchen und Ihnen sagen, was passiert. –

+0

Ich habe meinen Code auf das aktualisiert, was ich seit gestern erreicht habe. Welche Probleme hat es? –

Verwandte Themen