schleife in asm verlassen

Gast #305328
wie komm ich mit welchen vergleich ans ende:, wenn der wert r19 "0"
ist?

Sub wait_()
$Asm

          lds r19,w
          ....wenn der wert r19 "0" ist dann nach ende gespringen
!!!
WGLOOP3:
          ldi r18,255
WGLOOP1:
    ldi  R17, $01
WGLOOP0:
          Nop
    Nop
    dec  R17
          brne WGLOOP0
          dec  R18
          brne WGLOOP1
          dec  R19
          brne WGLOOP3
ende:
$EndAsm
End Sub
Gast
Ich empfehle das Studium der Befehlsreferenz der Atmel-µC :)

$Asm
   lds r19,w
   tst r19
   breq ende
...

Ansonsten könnte man auch darauf achten, das in R19 keine Null geladen
wird (die Speicherzelle w also nicht auf Null gesetzt werden kann).
Was karl-heinz vielleicht etwas verwirrt hat:
BREQ heißt ja eigentlich "branch if equal" und wird ja eigentlich mit
CMP/CPI verwendet. Dazu müsste man wissen, dass der CMP und CPI Befehl
nichts anderes macht als die Differenz der beiden Operatoren zu bilden
und bei Gleichheit das Zero-Flag setzt. BREQ wertet also eigentlich nur
das Zero-Flag aus. Und das ZF wird auch gesetzt, wenn ein Register
dekrementiert wird und als Resultat den Wert 0 hat.

Beim 8086 sind z.B. die Befehle JE (Jump-Equal) und JZ (Jump-Zero)
identisch.
Falls es dir um die Analyse des Codes ging:


 dec  R17
 brne WGLOOP0
 dec  R18
 brne WGLOOP1
 dec  R19
 brne WGLOOP3
ende:

BRNE springt, wenn Zero-Flag nicht gesetzt ist.
DEC setzt Zeroflag nur, wenn der Wert beim Vermindern 0 wird.

ende: wird also nicht "angesprungen", sondern das Programm landet bei
ende, wenn alle Rücksprünge wegen gelöschtem Zero-Flag (BRNE)
ausfallen.

In einer Hochsprache vereint ein Befehl die Bedingungsprüfung mit der
Verzweigung.

In ASM ist das getrennt. Bestimmte Operationen (add, sub, and, or...,
aber nicht mov, lds...) beeinflussen die Flags im SREG. Das passiert
auch, wenn dich die Flags nicht weiter interessieren, also wenn wenn du
nur rechnest, ohne eine Verzweigung im Sinn zu haben.
Willst du eine Verzweigung (bedingter Sprung) machen, dann achte auf
den Befehl, der zuletzt die Flags im SREG verändert hat und springe
anhand der Flagzustände.

Anhand von "$Asm" sehe ich, dass du vermutlich nicht mit AVR-Studio
arbeitest. Wenn dich AVR-ASM wirklich interessiert, dann solltest du
AVR-Studio benutzen, denn damit hast du neben dem Simulator auch noch
eine Online-Befehlsreferenz (F1-Taste, wenn Cursor auf einem ASM-Befehl
steht).

...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 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.