Schleifen-logik

Gast #572471
Lesenswert?
• ▲
▼
Moin

ich habe eine frage:

mainloop:
getKey:  wdr
         in r24, PIND
         sbrc r24, 2
         rjmp getKey

         inc r16
         brne warte
         inc r17
         brne warte

         rol 18

         out PORTB, r18
         rjmp mainloop

warte:   rjmp mainloop


Ich hab zwei Verständisprobleme:

         rjmp getKey
-> wann werden die nächsten folgenden Befehle ausgeführt? weil durch 
rjmp springt man doch einfach zu getKey wieder zurück.

und die nächste Frage:

        brne warte;
-> wenn diese Routine beim ersten mal ausgeführt wird, wird brne warte; 
ausgeführt --> dann wird das prog wieder am anfang gestartet bei 
mainloop --> dann ist man doch wieder in der getKey Schleife?

Irgendwie hab ich noch Schwierigkeiten bei den "Schleifen" wie diese 
durchlaufen werden.

Bernd


Gast #572537
Lesenswert?
• ▲
▼
Schau mal in der Befehltabelle, was der Befehl 'sbrc' macht.
In diesem konkreten Fall sagt der nämlich: Überspringe den nächsten 
Befehl, wenn Bit 2 in r24 nicht gesetzt (soll heissen 0) ist. Die getKey 
Schleife wird also genau dann nicht mehr ausgeführt, wenn der Taster 
(oder eine sonstige Signalquelle), der am PinD2 hängt, nach Masse zieht 
bzw. der anliegende Pegel als low angesehen wird.
#572644
Lesenswert?
• ▲
▼
Bernd wrote:
> aber wie funktionier es bei brne?

Der Knackpunkt ist der, dass die bedingten Sprungbefehle
sich auf die momentane Flagzustände stützen. Diese wiederrum
hängen von der letzten Instruktion vor dem bedingten Sprung ab,
welche die Flags verändert hat.

Hier hast du also den Fall, wo mehrere Instruktionen
zusammenspielen um das gewünschte zu erreichen.

Ein BRNE macht seinen Sprung genau dann, wenn das Zero Flag
nicht gesetzt ist. Der vorhergehende INC beeinflusst aber
das Zero Flag. Ist durch die Erhöhung im Register die Zahl
0 entstanden, dann wird das Zero Flag gesetzt. Ist die Zahl
ungleich 0 wird das Zero Flag gelöscht.

Der nachfolgende BRNE wertet das Zero Flag aus, so dass
die Kombination aus beiden Befehlen ergibt:
Ergab die Erhöhung des Registers eine Zahl ungleich 0, dann
wird gesprungen. War die Zahl aber 0, dann wird nicht gesprungen.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.