Forum: Mikrocontroller und Digitale Elektronik Problem bei Registeraddition


von Reiner (Gast)


Lesenswert?

Ich lese 2 5-stellige Zahlen ein, die ich in 4 Registern ablege, d. h.
die letzten drei Ziffern in ein Register und die ersten 2 Ziffern in
ein Register. Genau so verfahre ich mit der 2. Zahl. Beim addieren
verwende ich folgenden Code:

mov   a, R2 ;letzte 3 Stellen der Zahl 1 in Akku
add  a, R4 ;letzte 3 Stellen der Zahl 2 zu Akku addieren
mov  R5, a ;Ergebnis in Register 5 ablegen
mov  a, R1 ;ersten 2 Stellen Zahl 1 in Akku
addc  a, R3 ;ersten 2 Stellen Zahl 2 dazu addieren
mov  R6, a ;Ergebnis in Register 6 ablegen

Leider funktioniert die Addition mit dem Highbyte irgendwie nicht und
das ergebnis wird total verfälscht.

von Rufus T. Firefly (Gast)


Lesenswert?

Wie legst Du drei Ziffern in einem Register ab?

Mit drei Ziffern kann ein Wert zwischen 0 und 999 dargestellt werden,
der passt nicht in ein Register (das ist nämlich nur 8 Bit breit und
kann also keine Werte größer 255 aufnehmen).

Du solltest Dich mal mit der binären Repräsentation von Zahlen
beschäftigen.

von Reiner (Gast)


Lesenswert?

Das ist ja auch eines der Probleme. Ich habe bis jetzt nur Zahlen der
Form 11111 oder 22222 verwendet so das diese Problem nicht auftaucht,
um erst einmal das Problem des Übertrags in den Griff zu bekommen.

von A.K. (Gast)


Lesenswert?

Falscher Ansatz. Solange die Zahlen nicht korrekt binär in obere/untere
Hälfte aufgetrennt werden, solange wird diese Rechnung nicht aufgehen.

von A.K. (Gast)


Lesenswert?

Am obigen Beispiel:

222 + 111 = 333 => 77 im Register (modulo 256), plus Übertrag
22 + 11 + Übertrag = 34.
Ergebis: oben 34, unten 77.
=> so wird das nichts.

von Reiner (Gast)


Lesenswert?

Das das so nichts wird ist mir auch klar geworden. Ich gebe die 5
Ziffern nacheinander mit der Tastatur des Controllers ein. Mir ist aber
noch nicht klar geworden wie ich diese Zahl korrekt auftrenne bzw.
richtig in ablege.

von Ralf (Gast)


Lesenswert?

Hi Reiner,

warum machst du es nicht so:

1. Die erste Zahl, die du eingibst, multiplizierst du mit 10000, die
zweite mit 1000, die dritte mit 100, usw.

2. Nach dem Multiplizieren addierst du die Ergebnisse jeweils in eine
_3-Byte-Variable (3-Byte, weil 5 Stellen = 99999 und in 2 Byte passen
nur 65536 Werte).

Das heisst, du hast die 3-Byte Variable, die die endgültige Zahl
enthält, und eine weitere 3-Byte Variable, in der du die Berechnung
(Multiplikation) durchführst.

Nur so als Lösungsansatz, vielleicht gibt es auch was
Besseres/einfacheres/schnelleres.

Gruß Ralf

von Reiner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute!

Habe inzwischen eine Lösung gefunden um die 16bit Zahl einzulesen und
auf zwei Register zu verteilen. Zuerst lege ich alle 5 Ziffern in 5
Register(jede ziffer eines). Danach multipliziere ich die vorletzte
Ziffer(10er) Stelle mit 10 und addiere sie zur letzten Stelle(1er)
hinzu. Das Ergebnis kommt ins Lowbyteregister des gesamten Ergebnisses.
Danach reduziere ich die 100er Stelle um 1 und addiere 100 auf das
Ergebnis(Lowbyte), gibt es einen Übertrag so addiere ich ihn zum
Highbyte. Ist die hunderter Stelle abgearbeitet, reduziere ich die
1000er Stelle um 1 und addiere bei der 100er stelle 9 dazu. Danach baue
ich wider die 100er Stelle ab. Das ganze mache ich so lange bis die
100er, die 1000er und die 10000er nur noch 0 betragen.

Im Anhang befindet sich der Code. Mein Problem ist nun, das irgendwo
noch ein Fehler ist, ich ihn aber momentan nicht sehe.

von A.K. (Gast)


Lesenswert?

Der übliche Weg, V ist hier ein 16-bit Registerpaar:

  V auf 0 setzen
nun für jede Ziffer, von links nach rechts:
  V mit 10 multiplizieren
    [Anmerkung: 10=2*(2^2+1), also 10x=2*(2*2*x+x)]
  auf V die Ziffer draufaddieren (mit Übertrag)

von Martin S. (Gast)


Lesenswert?

Es ist schon erstaunlich, wie groß man einfachen unformatierten Text
"aufblasen" kann. Dein hübsches Assemblerprogramm besteht aus ca 3000
Zeichen und frisst als Word-Dokument locker mal 26 KB. Wenn du es als
Postscript ausgibst, kannst du es auch auf 47 KByte expandieren !

von Rufus T. Firefly (Gast)


Lesenswert?

Och, man kann sicherlich auch 'ne TrueColor-Bitmap davon erzeugen ...
die kann dann ruhig noch größer werden :-)


Martin S. hat recht: Word-Dateien sind für Quelltexte hier zu recht
äußerst ungern gesehen.
Quelltexte kann man auch ganz wunderbar in *.txt - Dateien
unterbringen.

von Reiner (Gast)


Lesenswert?

Hallo,

Habe das Problem gelöst, die Zahlen werden korrekt eingelesen und auf
zwei 8 bit Register verteilt. Auch die 16 bit Addition und die
Subtraktion gehen ohne Probleme.
Jetzt stehe ich vor dem Problem das mein Ergebnis über drei Register
verteilt ist, ich aber eine einzige Dezimalzahl ausgeben möchte. Wie
kann ich das machen?

mfg Reiner

von A.K. (Gast)


Lesenswert?

Das gleiche rückwärts. Division durch 10, Rest ist letzte Ziffer. Mit
dem Quotienten wiederum das gleiche. Solang wiederholen bis er 0 ist.
So kriegt man die Ziffern von rechts nach links.

Dumm ist nur, dass es für die Division keine Abkürzung gibt, wie bei
der Multiplikation.

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.