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.
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.
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.
Falscher Ansatz. Solange die Zahlen nicht korrekt binär in obere/untere Hälfte aufgetrennt werden, solange wird diese Rechnung nicht aufgehen.
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.
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.
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
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.
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)
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 !
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.