;------------------------------------------------------------------------------
; 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 하고는 다릅니다