Schleifen-logik

Gast #572471
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
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
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

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.