mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik schleife in asm verlassen


Autor: karl-heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
breq?

Autor: Olaf Stieleke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Thomas Pototschnig (pototschnig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.