;------------------------------------------------------------------------------
;      int WINAPI MulDiv(int Multiplicand, int Multiplier, int Divisor);
;------------------------------------------------------------------------------
                export  MulDiv
MulDiv          proc
                push    {R4-R7,LR}

                ;smull   R0,R1,R1,R0    ;R1|R0=R1*R0 이 명령은 Cortex-M0에는 없음

                movs    R7,#1
                movs    R6,#0           ;결과의 부호
                or      R0,R0
                jns     MulDiv100
                neg32   R0
                mov     R6,R7           ;R6=1
MulDiv100
                or      R1,R1
                jns     MulDiv150
                neg32   R1
                eors    R6,R7

MulDiv150
                uxth    R3,R0           ;R3=R0&0xFFFF
                lsrs    R4,R0,#16       ;R4=R0>>16

                uxth    R5,R1           ;R5=R1&0xFFFF
                lsrs    R7,R1,#16       ;R7=R1>>16

                mov     R0,R3
                Mul16   R0,R5           ;R0<-Low16비트끼리 곱

                mov     R1,R4
                Mul16   R1,R7           ;R1<-High16비트끼리 곱

                Mul16   R3,R7
                lsrs    R7,R3,#16
                shl     R3,16
                adds    R0,R3
                adcs    R1,R7

                Mul16   R4,R5
                lsrs    R5,R4,#16
                shl     R4,16
                adds    R0,R4
                adcs    R1,R5

                or      R2,R2
                jns     MulDiv200
                neg32   R2
                xori    R6,1            ;R7사용
MulDiv200
                movs    R3,#64          ;BitCount
                movs    R5,#0           ;뺄셈장소, 나중에는 나머지가 들어감
MulDiv400
                adds    R0,R0           ;CF<-R0<-0
                adcs    R1,R1           ;CF<-R1<-CF
                adcs    R5,R5

                cmp     R5,R2
                jb      MulDiv600
                subs    R5,R2
                inc     R0
MulDiv600
                dec     R3
                jnz     MulDiv400

                ;반올림처리
                shr     R2,1            ;/2
                cmp     R5,R2
                jb      MulDiv700
                inc     R0
MulDiv700
                or      R6,R6
                jz      MulDivQt
                neg32   R0
MulDivQt
                pop     {R4-R7,PC}
                endp
                align

MulDiv() 함수는 계산과정을 64비트로 처리하기 때문에 단순히 A*B/C 하고는 다릅니다