Forum: Mikrocontroller und Digitale Elektronik 32bit Zahlen multiplizieren mit MSP430 16bit Multiplizierer


von Jakob Broja (Gast)


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!!!

von Tom (Gast)


Lesenswert?

Hi

Schreib's doch in C und schau dir den generierten Assembler-Code an.

Gruss

Tom

von Jakob Broja (Gast)


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....

von Markus (Gast)


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

von Jakob Broja (Gast)


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.... :-)

von Jakob Broja (Gast)


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?

von Chris (Gast)


Lesenswert?

Distributivgesetz? Wäre zumindest der einfachste Ansatz.

von Markus (Gast)


Lesenswert?

Überleg Dir mal, wie man z.B. 57*8 von Hand rechnet und was dabei mit
Überträgen passiert.

von Andi K. (Gast)


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

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.