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!!!
Hi Schreib's doch in C und schau dir den generierten Assembler-Code an. Gruss Tom
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....
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
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.... :-)
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?
Distributivgesetz? Wäre zumindest der einfachste Ansatz.
Überleg Dir mal, wie man z.B. 57*8 von Hand rechnet und was dabei mit Überträgen passiert.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.