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
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
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
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?
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.
Hab vor ein paar Jahren mal so etwas gemacht. Allerdings auf einem anderen Prozessor. Vielleicht hilft es trotzdem. Gruess
:
Bearbeitet durch User
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
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.
In der Microchip AN526 gab es mal eine schöne Div 32/16=32 mit 16bit-Rest
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.