addieren von 500 werten in assembler

Gast #199692
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
Gast #199693
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
Gast #199695
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
Angehängte Dateien:
Gast #199697
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.
Gast #199698
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

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