32Bit / 16Bit = 32Bit Divisions Routine gesucht

Gast #4827308
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.
Gast #4827380
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
Moderator #4827455
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.
Gast #4828739
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren