Problem bei Registeraddition

Gast #152082
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.
Gast #152083
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.
Gast #152084
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.
Gast #152087
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.
Gast #152088
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
Gast #152089
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.
Angehängte Dateien:
Gast #152090
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)
Gast #152091
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 !
Gast #152092
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.
Gast #152093
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
Gast #152094
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.