www.mikrocontroller.net

Forum: PC-Programmierung addieren von 500 werten in assembler


Autor: freddy0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jochen Pernsteiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: T.Stütz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ein zweites register nehmen und mit carry(overlow?) dazuaddieren

Gruss

Autor: Jens (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Jens (Gast)
Datum:

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

Autor: Olaf Stieleke (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: freddy0815 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.