Forum: Mikrocontroller und Digitale Elektronik avrasm - cpi mit unsigned


von Lasse S. (cowz) Benutzerseite


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

von Falk B. (falk)


Lesenswert?

@ Lasse S. (cowz)

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

Nein.

MFG
Falk

von Tobi (Gast)


Lesenswert?

Assembler kennt kein signed oder unsigned.

Tobi

von Falk B. (falk)


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

von Lasse S. (cowz) Benutzerseite


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

von Spess53 (Gast)


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

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

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

Vielen Dank für die Antworten :)

lg, Lasse

von eProfi (Gast)


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

von Lasse S. (cowz) Benutzerseite


Lesenswert?

Hi,

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

Gruß, Lasse

von Johannes M. (johnny-m)


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.

von Kernighan (Gast)


Lesenswert?

Zum glück gibts C Compiler :-)

von spess53 (Gast)


Lesenswert?

Hi

>Zum glück gibts C Compiler :-)

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

MfG Spess

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.