webentwicklung-frage-antwort-db.com.de

Festlegen einer Zeitverzögerung von 1 Sekunde bei der Assemblersprache 8086

Mein Problem ist, dass ich einen Code geschrieben habe, der ein Ergebnis in einem Satz von LEDs ausgeben soll, die an den parallelen Port angeschlossen sind. Als ich den Code lief, tat es so ziemlich nichts. Mein Lehrer sagte mir, dass der Code zu schnell lief, dass meine Augen nicht sehen, was passiert ist. 

Ich habe herausgefunden, dass es eine Reihe von Möglichkeiten gibt, um eine Zeitverzögerung auszuführen, ich habe versucht, das NOP zu schleifen, aber ich denke, ich kann nicht wirklich bestimmen, was los ist. Gibt es einen besseren Weg? 

Ich habe hier einen Teil des Codes, in den ich eine Zeitverzögerung einfügen muss: 

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
Jer Yango

Was ich letztendlich verwendete, war die Nop-Schleife

; start delay

mov bp, 43690
mov si, 43690
delay2:
dec bp
nop
jnz delay2
dec si
cmp si,0    
jnz delay2
; end delay

Ich habe zwei Register verwendet, bei denen ich beide auf einen hohen Wert Gesetzt habe, und die Schleife wird fortgesetzt, bis beide Werte auf Null gehen 

Was ich hier verwendet habe, war AAAA für beide SI and BP, ich endete mit ungefähr 1 Sekunde für jede Verzögerungsschleife. 

Vielen Dank für die Hilfe, und ja, wir verwenden immer noch MS DOS für diesen Assembler-Sprachkurs :(

1
Jer Yango

Stellen Sie ein Intervall von 1 Million Mikrosekunden (1 Sekunde) ein . Verwenden Sie den folgenden Befehl.

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

Sie können eine Verzögerung von mehreren Sekunden einstellen, indem Sie 86H und INT 15H verwenden 

Überprüfen Sie diese Links für weitere Details

Wartet eine angegebene Anzahl von Mikrosekunden, bevor die Kontrolle an den Aufrufer zurückgegeben wird

INT 15H 86H: Warten

9
john

Sie können den Interrupt 1Ah/function 00h ( GET SYSTEM TIME) verwenden, um die Anzahl der Clock-Ticks (18,2/s) seit Mitternacht in CX:DX abzurufen.

Um mit dieser Methode etwa 1 Sekunde zu warten, würden Sie diese Interruptfunktion einmal ausführen. Speichern Sie CX: DX in einer Variablen und führen Sie dann denselben Interrupt in einer Schleife aus, bis der absolute Wert von CX:DX - firstCX:DX größer als 18 ist.

8
Michael

Alternativ können Sie einen Prozess erstellen und ihn jedes Mal aufrufen, wenn Sie nur das Zählerregister und die Stackimplementierung verwenden möchten.

Beispiel unten verzögert sich um 1/4 a sec.

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
0
Alfred Benigno
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
0
kinAfro