Hallo, Ich muss im Zuge eines Projektes mit 16 Bit großen Ganzzahlen umgehen. Das Programm ist für einen 8051 bestimmt. Mein Problem damit ist relativ einfach zu beschreiben. Angenommen ich habe die Zahl 3572, dann liegt mir diese in zwei Registern mit den Inhalten 0x0D und 0xF4 vor. Wie komme ich nun einzeln an die Tausender-, Hunderter-, Zehener- und Einserstelle um diese auf einem Display darstellen zu können? Bei lediglich 8 Bit großen Ganzzahlen erledige ich dies durch einfaches Teilen durch 100 und nochmaliges Teilen des Rests durch 10. Da der 8051 allerdings keine 16 Bit-Division besitzt, suche ich nach einer möglichst einfachen Methode, um dies realisieren zu können. (Ja, ich weiß, dass es im Internet beispiele für eine 16 Bit-Division gibt, aber diese halte ich für zu umständlich, da es hier um eine relativ einfache Aufgabe geht.) Kennt jemand von euch eine Möglichkeit, wie ich dies realisieren könnte? Gruß, Lars
Lars R. wrote: > Bei lediglich 8 Bit großen Ganzzahlen erledige ich dies durch einfaches > Teilen durch 100 und nochmaliges Teilen des Rests durch 10. Da der 8051 > allerdings keine 16 Bit-Division besitzt, suche ich nach einer möglichst > einfachen Methode, um dies realisieren zu können. In dem Fall ist die einfachste Variante: In einer Schleife 10000 subtrahieren und mitzählen wie oft das ging ehe ein Unterlauf auftrat. Mit dem Rest dann, 1000 subtrahieren etc. Die Division wird also durch eine Folge von Subtraktionen ersetzt und mitgezählt wie oft dies möglich ist, ehe ein Unterlauf eintritt. Für allgemeine Divisionen ist das nicht zu gebrauchen, aber für diese Spezialdivisionen durch 10000, 1000, 100 etc. geht das wunderbar, weil ja in einem Schritt nie öfter als 9 mal subtrahiert werden muss.
Hallo, Danke für diesen Vorschlag. Darauf bin ich noch gar nicht gekommen! Irgendwie übersieht man manchmal die einfachsten Möglichkeiten. Ich bin wohl zu sehr PC verwöhnt... Wenn ich so überlege dürfte dies wesentlich einfacher und viel schneller als diese komplizierte Divison sein. Grüße, Lars
Vielleicht ist auch eine Alternative, die entsprechende Zahl anders darzustellen, also z.B. jeweils ein Nibble für die EINER, ZEHNER, HUNDERTER ,... Ist dann natürlich nicht mehr so easy zum Rechnen.
>Vielleicht ist auch eine Alternative, die entsprechende Zahl anders >darzustellen, also z.B. jeweils ein Nibble für die EINER, ZEHNER, >HUNDERTER =>BCD-Zahlen Der 8051 besitzt extra Befehle und Flags zum Rechnen mit BCD-Zahlen.
Hi, habe eigentlich genau das gleiche Problem wie Lars. Habe mir dazu auch schon die Antwort von Karlheinz angeschaut und in der Theorie klingt für mich das alles ganz logisch. Da ich aber leider erst ne gute Woche mit Assembler was am Hut hab, weiß ich nicht ganz wie ich das dann in der Praxisumsetzen soll. Wie kann man bei 8Bit 10000 subtrahieren? Mag für manche jetzt bissel albern klingen, aber ich hab davon nicht wirklich nen Plan, aber brauch das ganze für ne Aufgabe. Wäre nett, wenn mir das ganze mal einer, am besten an nem Beispiel von ner 4 oder 5 stelligen Zahl, erklören könnte. Danke
Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab und vom Low-Byte 232.
>>Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab >>und vom Low-Byte 232. VORSICHT, DAS IST FALSCH UND HILFT ANFÄNGERN N I C H T WEITER! DAS MUSS GANZ DEUTLICH GESAGT WEREN! Was machst Du, wenn das LO-Byte vor dem Subtrahieren schon kleiner als 232 ist?? Nun? Eben! Du musst das Carry-Ergebnis der Subtraktion des LO-Bytes bei der Subtraktion des HI-Bytes berücksichtigen. Jochen Müller
Also...es soll eine Anregung sein, sonst hätte ich den Assembler-Code gleich mitgeliefert. Selbstverständlich muss er das Carry-Bit berücksichtigen. Aber ich dachte, er wisse das dann schon.
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.