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
>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
ein zweites register nehmen und mit carry(overlow?) dazuaddieren Gruss
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
Ach nochwas: die größte mit 8 Bit darstellbare Zahl ist 255 und nicht 256.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.