mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik avrasm - cpi mit unsigned


Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

Sehe ich das richtig, dass der cpi Befehl beim avrasm signed arbeitet?

Dass also
ldi r16, 128
cpi r16, 127
brlt sprungmarke

nicht springt, weil 128 als -1 intepretiert wird? Wie kann ich das 
umgehen, bzw. ein cpi als unsigned laufen lassen?

Gruß, CowZ

PS: Ich hoffe, ich hab keine Infos vergessen ;)

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lasse S. (cowz)

>Sehe ich das richtig, dass der cpi Befehl beim avrasm signed arbeitet?

Nein.

MFG
Falk

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Assembler kennt kein signed oder unsigned.

Tobi

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tobi (Gast)

>Assembler kennt kein signed oder unsigned.

Auch falsch. Die Unterscheidung erfolgt durch richtige Wahl des 
Sprungbefehls, siehe AVR-Tutorial: Vergleiche.

MFg
Falk

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich habe folgende zwei Codestücke auf meinem Avr laufen lassen:
ldi rt, 127
cpi rt, 128
brlt main_loop
ldi menu_state, MENU_CLOCK
hier wird menu_state gesetzt.
ldi rt, 128
cpi rt, 129
brlt main_loop
ldi menu_state, MENU_CLOCK
hier wird menu_state nicht gesetzt.

Ich hoffe, ihr könnt mir den Effekt erklären ;)

Gruß, Lasse

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

'Tests the Signed flag (S) and branches relatively to PC if S is set.'

BRLT wertet das S-Flag mit aus. Da bei 128 Bit 7 gesetzt ist wird das 
von BRLT als negative Zahl bewertet und gesprungen. 'BRLT' ist für den 
Zweck ungeeignet. Besser 'BRCS' oder 'BRCC'.

MfG Spess

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ok, dann war meine Vermutung mit dem Signed also doch nicht ganz falsch 
;)

Vielen Dank für die Antworten :)

lg, Lasse

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"weil 128 als -1 intepretiert wird?"

128 ist 0x80 und damit -128.
-1 ist 0xff

Nicht der CMP, sondern der anschließende Branch entscheidet, ob signed 
oder unsigned interpretiert wird.

Ein Vergleich ist wie eine Subtraktion ohne Abspeicherung des 
Ergebnisses.
Die Flags werden je nach Ergebnis der Subtraktion gesetzt.

ldi r16, 128       -128   80
cpi r16, 127     -(+127)  7f
brlt sprungmarke ---------------
                   -255   01



ldi rt, 128        -128   80
cpi rt, 129      -(+129)  81
brlt main_loop  --------------
                   -257   ff

ff wird bei den unsigned-branches als 255 interpretiert
bei den signed-branches als -1

Autor: Lasse S. (cowz) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

vielen Dank für diese ausführliche Antwort :) So macht lernen Spaß :)

Gruß, Lasse

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn Du den Befehlssatz mal durchgehst, findest Du direkt über brlt 
den Befehl brlo (branch if lower), der genau das macht, was Du 
brauchst, nämlich den Vergleich von unsigned -Werten. brlo ist aber 
auch nur ein anderes Mnemonic für den Befehl brcs.

Autor: Kernighan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum glück gibts C Compiler :-)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Zum glück gibts C Compiler :-)

Ach. Da braucht man wohl nicht zu wissen, was man macht?

MfG Spess

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.