Moltiplicazione con istruzione nativa su micro AVR
Ciao ragazzi,
nei file d'esempio per i micro avr 8 bit ho trovato questo codice che è possibile usare sui core dotati dell'istruzione 'mul'
Siccome sono molto ignorante in matematica mi piacerebbe sapere qual è il principio che c'è dietro questa implementazione e se è possibile ampliarla anche per moltiplicazioni diverse (tipo un intero 16 bits x un intero 32/24 bits).
Sono sempre rimasto affascinato dai giochini che si riescono a fare in binario...
Grazie,
Valentino
nei file d'esempio per i micro avr 8 bit ho trovato questo codice che è possibile usare sui core dotati dell'istruzione 'mul'
- Codice: Seleziona tutto
;******************************************************************************
;*
;* FUNCTION
;* mul16x16_32
;* DECRIPTION
;* Unsigned multiply of two 16bits numbers with 32bits result.
;* USAGE
;* r19:r18:r17:r16 = r23:r22 * r21:r20
;* STATISTICS
;* Cycles : 17 + ret
;* Words : 13 + ret
;* Register usage: r0 to r2 and r16 to r23 (11 registers)
;* NOTE
;* Full orthogonality i.e. any register pair can be used as long as
;* the 32bit result and the two operands does not share register pairs.
;* The routine is non-destructive to the operands.
;*
;******************************************************************************
mul16x16_32:
clr r2
mul r23, r21 ; ah * bh
movw r19:r18, r1:r0
mul r22, r20 ; al * bl
movw r17:r16, r1:r0
mul r23, r20 ; ah * bl
add r17, r0
adc r18, r1
adc r19, r2
mul r21, r22 ; bh * al
add r17, r0
adc r18, r1
adc r19, r2
ret
Siccome sono molto ignorante in matematica mi piacerebbe sapere qual è il principio che c'è dietro questa implementazione e se è possibile ampliarla anche per moltiplicazioni diverse (tipo un intero 16 bits x un intero 32/24 bits).
Sono sempre rimasto affascinato dai giochini che si riescono a fare in binario...
Grazie,
Valentino
