32bit Zahlen multiplizieren mit MSP430 16bit Multiplizierer

Gast #207006
Lesenswert?

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

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

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

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

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

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

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