Forum: Mikrocontroller und Digitale Elektronik [AVR] 32-Bit + 8-Bit Problem mit negativen Zahlen


von Marius O. (marius_o)


Lesenswert?

Hallo,
Ich versuche mir im Moment auf einem ATMega32 32-Bit Rechenoperationen 
zusammenzuschustern. Während die Addition von 2 32-Bit-Zahlen aber kein 
Problem ist, weiß ich nicht genau, wie ich eine 8-Bit Zahl zu einer mit 
32 Bit dazurechnen kann. Mein erster Gedanke war folgender:
1
;Temp1 ist niedrigstes Byte, Temp4 ist höchstes Byte der 32-Bit-Zahl
2
;Dazugerechnet werden soll r16
3
4
add    Temp1, r16
5
ldi    r16, 0
6
adc    Temp2, r16
7
adc    Temp3, r16
8
adc    Temp4, r16
Also nach dem Beispiel der 32-Bit-Arithmetik aus dem Tutorial.
Wenn es sich bei r16 aber um eine negative Zahl handelt (z.B. 0xFF)
sieht das doch so aus:
1
;Temp1-Temp4 sind 0
2
;r16 = 0xFF
3
4
add    Temp1, r16    ;Temp1 ist 0xFF
5
ldi    r16, 0
6
adc    Temp2, r16    ;alle anderen Register bleiben 0
7
adc    Temp3, r16    ;ganze Zahl also:
8
adc    Temp4, r16    ; 0x000000FF   -> Positive Zahl 255!

Wie sorge ich jetzt dafür, dass die Berechnung zum richtigen Ergebnis 
0xFFFFFFFF führt?

von Martin (Gast)


Lesenswert?

Du musst das Vorzeichen erweitern (hier 32 Bit).

Aus 0xFF (-1) 8 BIT wird 0xFFFFFFFF (-1) 32 Bit.

von Marius O. (marius_o)


Lesenswert?

Genau das hab ich mir gerade auch gedacht, nur konnte ich meinen Beitrag 
schon nicht mehr bearbeiten :D

Wie krieg ich das denn möglichst sauber gebacken? Über einen bedingten 
Sprung (sozusagen if-then-else in Assembler)? Oder gibt es schönere 
Lösungen für das ganze?

von (prx) A. K. (prx)


Lesenswert?

Der bedingte Sprung ist natürlich ein Weg, aber es gibt auch Befehle, 
die abhängig von einem Einzelbit-Test den nächsten Befehö überspringen.

von Marius O. (marius_o)


Lesenswert?

Ok dann werd ich das wohl so machen! Vielen Dank für die Hilfe :D

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.