Forum: Mikrocontroller und Digitale Elektronik 32Bit / 16Bit = 32Bit Divisions Routine gesucht


von Gee (Gast)


Lesenswert?

Ich benötige für den dsPIC eine Divisons Routine.. mit dem div Befehl 
ist nur eine 32Bit / 16Bit = 16Bit Rechnung machbar

In Assembler. Ich benötige aber auch ein 32Bit Ergebniss

von THOR (Gast)


Lesenswert?

In nen 32 Bit Wert casten?

von Klaus (Gast)


Lesenswert?

Gee schrieb:
> Ich benötige für den dsPIC eine Divisons Routine

Schau doch mal, wie der XC16 das macht. Der kann das.

MfG Klaus

von fop (Gast)


Lesenswert?

THOR schrieb:
> In nen 32 Bit Wert casten?

Was erstmal gut fort ist kommt nicht mehr schlecht wieder.
LOL, ne, das geht nicht.
sorry couldn't resist

von Der Andere (Gast)


Lesenswert?

Gee schrieb:
> Ich benötige aber auch ein 32Bit Ergebniss

Und die 16 Einser (signed) oder Nullen davorzusetzen kannst du nicht 
selbst?
Oder verstehe ich die Frage zu einfach?

von Der Andere (Gast)


Lesenswert?

Der Andere schrieb:
> Und die 16 Einser (signed) oder Nullen davorzusetzen kannst du nicht
> selbst?
> Oder verstehe ich die Frage zu einfach?

Sorry, ich war gerade ein bischen doof.
Wenn der 32 Bit Wert z.B. nur z.B. durch 2 geteilt wird, kann das 
Ergebnis ja noch 31 Bit breit sein.
Also bitte vergesst meinen Beitrag.

von Chrud (ruder)


Angehängte Dateien:

Lesenswert?

Hab vor ein paar Jahren mal so etwas gemacht. Allerdings auf einem 
anderen Prozessor. Vielleicht hilft es trotzdem.

Gruess

: Bearbeitet durch User
von Georg (Gast)


Lesenswert?

Der Andere schrieb:
> Sorry, ich war gerade ein bischen doof.
> Wenn der 32 Bit Wert z.B. nur z.B. durch 2 geteilt wird, kann das
> Ergebnis ja noch 31 Bit breit sein

Nein, so doof auch wieder nicht, der TO wollte ja ein 32bit-Ergebnis. 
Ich gehe mal davon aus, dass Integer gemeint sind, auch wenn das bisher 
keiner erwähnt hat.

Georg

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ich kann dir keinen fertigen Assemblercode bieten, da ich mich mit dem
dsPIC nicht auskenne. Ich sehe aber, dass es mit DIV.U[D] und DIV.S[D]
eine hardwareunterstützte Divsion mit jeweils 16 Bit breitem Divisor,
Ergebnis und Rest gibt. Der Dividend darf dabei wahlweise 16 oder 32 Bit
breit sein.

Du möchtest

  XH:XL / Y -> ZH:ZL Rest R

rechnen. Sind die Operanden vorzeichenlos, kannst du diese Divsion mit
32-Bit-Ergebnis folgendermassen aus zwei Einzeldivisionen mit jeweils
16-Bit-Ergebnis zusammensetzen:

  XH   / Y -> ZH Rest T   (mit DIV.U)
  T:XL / Y -> ZL Rest R   (mit DIV.UD)

Für XH, XL, Y, ZL, ZH, R und T musst du jeweils ein passendes 16-Bit-
Prozessorregister auswählen. Wahrscheinlich brauchst du keine sieben
verschiedene Register, sondern kannst ein paar davon mehrfach benutzen.

Das ist derselbe Ablauf, wie wenn du eine zweistellige durch eine
einstellige Zahl auf dem Papier dividierst, nur dass die Ziffern hier
nicht von 0 bis 9, sondern von 0 bis 65535 gehen.

Ob man für vorzeichenbehaftete Operanden einfach nur DIV.U durch DIV.S
ersetzen muss, kann ich auf die Schnelle nicht sagen.

von Jens G. (jensig)


Lesenswert?

In der Microchip AN526 gab es mal eine schöne Div 32/16=32 mit 
16bit-Rest

von W.S. (Gast)


Lesenswert?

THOR schrieb:
> In nen 32 Bit Wert casten?

Jawoll, die Welt besteht aus C. Da schreibt einer ausdrücklich ASSEMBLER 
und so ne Antwort kommt. O je.

Die Sache ist aber ein bissel schwieriger: normalerweise benutzt man für 
digitale Signalverarbeitung ohne Gleitkomma ein eher spezielles Format: 
alles in gebrochenen Zahlen mit 1..2 Bit für Ganzzahl-Teil und 
Vorzeichen. Also grob gesagt sowas ähnliches wie die Mantisse bei 
Gleitkomma und mit sättigendem Verhalten.

Die Annahme, daß es sich ja nur um Integer handeln könnte, ist also 
nicht wirklich haltbar. Also: erstmal austesten, ob sich der 32/16 
Div-Befehl als Quasi-Vorbrenner benutzen läßt und dann ist Grübeln in 
Assembler angesagt.

W.S.

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.