Forum: Mikrocontroller und Digitale Elektronik (8051) Fragen zum Umgang mit 16 Bit Ganzzahlen


von Lars R. (larsr)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Lars R. (larsr)


Lesenswert?

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

von Der S. (derschelm)


Lesenswert?

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.

von MC (Gast)


Lesenswert?

>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.

von Toaster (Gast)


Lesenswert?

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

von SamS (Gast)


Lesenswert?

Du hast zwei Bytes. 1000 sind ja 3*256+232. Zieh also vom High-Byte 3 ab 
und vom Low-Byte 232.

von Jochen M. (taschenbuch)


Lesenswert?

>>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

von SamS (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.