Forum: Mikrocontroller und Digitale Elektronik schleife in asm verlassen


von karl-heinz (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

breq?

von Olaf Stieleke (Gast)


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).

von Thomas P. (pototschnig)


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.

von Hannes L. (hannes)


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).

...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.