avrasm - cpi mit unsigned

OP Persönliche Seite #978710
Hi,

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

Dass also
1
ldi r16, 128
2
cpi r16, 127
3
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 ;)
OP Persönliche Seite #978764
Also, ich habe folgende zwei Codestücke auf meinem Avr laufen lassen:
1
ldi rt, 127
2
cpi rt, 128
3
brlt main_loop
4
ldi menu_state, MENU_CLOCK
hier wird menu_state gesetzt.
1
ldi rt, 128
2
cpi rt, 129
3
brlt main_loop
4
ldi menu_state, MENU_CLOCK
hier wird menu_state nicht gesetzt.

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

Gruß, Lasse
Gast #978800
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
Gast #980394
"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
#981233
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.

Antwort schreiben

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