Forum: PC-Programmierung addieren von 500 werten in assembler


von freddy0815 (Gast)


Lesenswert?

hallo!

programmiere in avr studios.
habe schon ein paar kleine codes gefunden um zwei 16bit zahlen zu
addieren. aber ich versuche 500 8bit werte zu addieren. maximal kann
dabei eine 24bit zahl rauskommen.
sprich: 500*256 = 128000 entspricht 1 F4 00

die 500 werte stehen im daten register. mit dem zeiger (x) gehe ich
alle werte nacheinander durch. dabei will ich sie addieren.

ld temp, x+
add r1, temp

aber was wenn r1 nun überläuft??

addieren in assembler ist ja schwerer als in der grundschule....

danke im voraus
freddy0815

von Jochen Pernsteiner (Gast)


Lesenswert?

>aber was wenn r1 nun überläuft??

Schon mal was von Carryflag gehört?

Wenn das maximale Ergebnis 24 Bit breit ist, dann folgt logischerweise,
daß Du für Dein Ergebnis 3 (8-Bit-)Register brauchst, nicht wahr?

Schau Dir halt mal die Application Note AVR202 von Atmel an, vielleicht
geht Dir dann ein Licht auf.

>addieren in assembler ist ja schwerer als in der grundschule....

Ach wirklich?


Jochen

von T.Stütz (Gast)


Lesenswert?

ein zweites register nehmen und mit carry(overlow?) dazuaddieren

Gruss

von Jens (Gast)


Angehängte Dateien:

Lesenswert?

Im Anhang eine Variante, wie es gehen könnte. Das Programm addiert 500
mal den Wert 255. Der Einfachheit halber habe ich das in zwei Blöcken
zu je 250 Additionen gemacht. Nach Ablauf des Programms sieht der
Registerinhalt wie folgt aus:

low:  0x0C
mid:  0xF2
high: 0x01

Also ist das Ergebnis 0x1F20C = 127500 = 500*255, scheint also zu
funktionieren. Jetzt mußt du es nur noch deinen Vorstellungen
anpassen.

Gruß
Jens

von Jens (Gast)


Lesenswert?

Ach nochwas: die größte mit 8 Bit darstellbare Zahl ist 255 und nicht
256.

von Olaf Stieleke (Gast)


Lesenswert?

Da gibts doch so einen kleinen Winkelzug namens Carry-Flag. Nehmen wir
mal an, dein End-Ergebnis steht in r3/r2/r1. r4 setzen wir auf null,
das brauchen wir noch. Dann könnte man das in etwa so machen:

CLR r1
CLR r2
CLR r3
CLR r4

LDS r16,X+
ADD r1,r16
ADC r2,r4
ADC r3,r4

;Loop aufs nächste Byte

In den ADC-Befehlen addieren wir immer r4 drauf - r4 ist aber Null. Was
sich wie Bullshit liest, funktioniert doch prima, denn das Carry-Flag
wird bei ADC auch dazuaddiert.

Tritt also beim ADD r1,r16 ein Überlauf auf, wird das Carry gesetzt.
Das nachfolgende ADC addiert die Null aus f4 UND die 1 aus dem Carry.
Gleiches passiert das auch beim zweiten ADC, wenn beim ersten ADC ein
Überlauf passiert ist.

Ohne Überlauf wird tatsächlich nur ne Null addiert, es passiert also
gar nichts.

Dein Maximalwert von 01F400 würde dann so aussehen:
r3=01
r2=F4
r1=00

Haut mich, wenn ich Blödsinn erzähle.

von freddy0815 (Gast)


Lesenswert?

danke für eure reichlichen antworten! habs gerade ausprobiert und so:

ld temp, x+
add r1,temp
adc r2,r4
adc r3,r4

funktionierts einwandfrei. mit dem carrybit hab ich gestern auch
rumprobiert, aber dass ich da noch n 4. register zuziehen muss hab ich
nicht gesehen.

jetzt kanns endlich weitergehen...

freddy0815

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.