schleife in asm verlassen

Gast #305328
Lesenswert?
• ▲
▼
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 #305330
Lesenswert?
• ▲
▼
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).
#305331
Lesenswert?
• ▲
▼
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.
#305332
Lesenswert?
• ▲
▼
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

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.