Multiplikation 16x16 bit mit MSP430

Gast #530216
Lesenswert?

Hallo zusammen,

ich benutze einen MSP430F2274, welcher über keinen Hardware-Multiplier 
verfügt. Die Software programmiere ich mit IAR in C.
Nun zu meiner Frage: Die Multiplikation in C ist simpel, auch der 
Assembler-Code erscheint mir logisch. Dort wird nämlich ein eine 
Subroutine zur 16 Bit Multiplikation aufgerufen. Kann mir jemand sagen, 
warum die angesprochene Operation nur ca. 20 Zyklen (mit einem 
Oszilloskop gemessen) dauert? Gemäss Debugging-Vorgang sollten weit mehr 
Zyklen für die Berechnung benötigt werden... Wo liegt mein 
(Überlegungs-) Fehler?

Danke für eure Hilfe!!

Gruss
Fabian
Gast #530624
Lesenswert?

Hallo Fabian,

hier mein Quellcode. Die Taktzyklenanzahl hab ich vom Simulator.

#define     OP1     R4
#define     OP2     R5
#define     OP2H    R6
#define     ACL     R7
#define     ACH     R8

            ASEG    0F000h
RESET       mov.w   #300h,SP                ; Initialize stackpointer

Main        mov     #13,OP1
            mov     #12345,OP2
            call    #MPYU
            jmp     Main
;----------------------------------------------------------------------- 
--
; MSP430 16*16 Bit Multiplikation
; Zyklen abhängig von OP1: (ohne call und ret)
; MPY       17..133
; MAC       15..131
; MPYU      11..123
; MACU       9..121
MPY         clr     ACL           ; ACH,ACL = OP1 * OP2  mit Vorzeichen
            clr     ACH
MAC         tst     OP1           ; ACH,ACL += OP1 * OP2  mit Vorzeichen
            jge     mpy_m1
            sub     OP2,ACH
mpy_m1      tst     OP2
            jge     MACU
            sub     OP1,ACH
            jmp     MACU
MPYU        clr     ACL           ; ACH,ACL = OP1 * OP2  ohne Vorzeichen
            clr     ACH
MACU        clr     OP2H          ; ACH,ACL += OP1 * OP2  ohne 
Vorzeichen
            clrc
            jmp     mpy_m4
mpy_m2      add     OP2,ACL
            addc    OP2H,ACH
mpy_m3      rla     OP2
            rlc     OP2H
mpy_m4      rrc     OP1
            jc      mpy_m2
            jnz     mpy_m3
            ret
;----------------------------------------------------------------------- 
--
            ASEG    0FFFEh
            DW      RESET
            END

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