avrasm - cpi mit unsigned

OP Persönliche Seite #978710
Lesenswert?

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
Lesenswert?

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
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
Gast #980394
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren