32bit Zahlen multiplizieren mit MSP430 16bit Multiplizierer

Gast #207006
Hallo zusammen. Ein wichtige Frage, da sehr, SEHR bald Klausuren
anstehen.

Ich hab einen MSP430F449 und möchte mit diesem in Assembler 2 Zahlen
multiplizieren.
2 x 16bit Zahlen sind absolut kein Problem, da der eingebaute Hardware
Multiplizierer ja 16x16 bit beherrscht.

Aber was mach ich bei 2 x 32 bit Zahlen??  Diese stehen im RAM an einer
beliebigen Adresse. Ich kann sie ohne weiteres auf je 2 Register
verteilen. Und dann? Mir persönlich fällt nichts mehr ein was ich noch
probieren könnte.

Was wäre zudem noch der Unterschied wenn diese Zahlen
vorzeichenbehaftet sind ?
Was mach ich bei „32bit x 16bit“?

Vielen Dank schon mal für die Mühe. Ihr tut mir ein GROßEN Gefallen!!!
Gast #207008
Ja, das wär ne Sache, aber ich soll den 16bit Hardware Multiplizierer
benutzen. Ich kann also auch in C nicht die Zahlen in die
entsprechenden Register reinkopieren. Ich hab die leise Ahnung, dass
ich mit dem SUM EXTENSION REGISTER arbeiten muß......aber ne ganz leise
nur....
Gast #207009
So eine Multiplikation funktioniert wie eine schriftliche
Multiplikation, bloß daß Du statt Ziffern eben 16Bit-Werte hast.

AB*CD
-----
 EFG
  HIJ
-----
 KLMN

AB*C=EFG
AB*D=HIJ
und dann das Ganze halt passend zusammenzählen.

Markus
Gast #207010
Danke, ich weiß jetzt wo mein Fehler lag.
Ich hatt das auch schon ausprobiert, mehrmals, und es schließlich
aufgegeben... Ich dachte schon, dass das so nicht klappt...
Vielen Dank.... :-)
Gast #207011
Aber noch eins....

Hier darauf zurück:

AB*C=EFG
AB*D=HIJ

"AB" ist dennoch eine 32 Bit Zahl, die ich nicht so ohne weiteres in
den OP2,MPY... schieben kann. Gibts da auch noch einen Kniff?
Gast #207014
Hier mal ein Auszug einer umgewandelten Atmel-Apnote für die Mega-AVR´s
für 16 x 16 = 32 Bit:

.def MulWLAL=r16
.def MulWLAH=r17
.def MulWLBL=r18
.def MulWLBH=r19
.def MulWLResA=r12
.def MulWLResB=r13
.def MulWLResC=r14
.def MulWLResD=r15

MulWL:  mul  MulWLAH,MulWLBH    ; ah * bh
  movw  MulWLResC,r0
  mul  MulWLAL,MulWLBL    ; al * bl
  movw  MulWLResA,r0
  mul  MulWLAH,MulWLBL    ; ah * bl
  add  MulWLResB,r0
  adc  MulWLResC,r1
  adc  MulWLResD,null
  mul  MulWLBH,MulWLAL    ; bh * al
  add  MulWLResB,r0
  adc  MulWLResC,r1
  adc  MulWLResD,null
  ret

Mußt Dir nur vorstellen, dass das nicht 8-Bit-Register sind, sondern
16-Bit.
mul, add und adc dürften klar sein, movw transferriert 2 8-Bit-Register
in 2 andere, dafür gibs vielleicht movl beim MSP430 oder eben 2 mal
mov.
Ist ohne Vorzeichen da ich es nicht benötigt habe, es geht natürlich
auch mit Vorzeichen wenn man es anpasst.

Vielleicht hilft es Dir weiter.

MfG
Andi

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.