El PIC 16F690 no incorpora instruccions de multiplicació o divisió. Aquí veurem com podem fer algunes multiplicacions senzilles i com fem divisions per nombres que siguin potències de dos.
Multiplicar un valor per 2 és equivalent a fer girar els seus bits cap a l'esquerra entrant zeros per la dreta.
Resul EQU 0x20 ; Variable en la que guardem el resultat
... bcf CARRY ; Volem entrar un zero rlf Resul,f ; Girem a l'esquerra ...
Quan els resultats puguin ser més grans que 255 caldrà fer operacions de més d'un byte. A continuació veurem com fer-ho quan el valor ocupa dos bytes. Guardem el resultat en dues posicions de memòria consecutives seguint l'estructura següent:

Resul EQU 0x20 ; Variable en la que guardem el resultat (2 bytes)
...
bcf CARRY ; Volem entrar un zero
rlf Resul,f ; Girem a l'esquerra el byte de menys pes
rlf Resul+1,f ; Ara girem a l'esquerra el byte de més pes
; El bit que a sortit per l'esquerra del primer ha entrat
; per la dreta del segon
...
Si en lloc de multiplicar per dos volem fer-ho per quatre només caldrà fer les rotacions corresponents dues vegades tot posant a zero el bit C cada vegada. El mateix per qualsevol altra potència de dos. Quan ho fem, hem de preveure quants bits pot arribar a ocupar el resultat per assegurar que cap en l'espai que hem reservat. Si la multiplicació implica més de tres o quatre rotacions és preferible fer-ho iterativament.
De manera semblant, per dividir per dos només caldrà fer rodar els bits cap a la dreta entrant zeros per l'esquerra.
Resul EQU 0x20 ; Variable en la que guardem el resultat
... bcf CARRY ; Volem entrar un zero rrf Resul,f ; Girem a la dreta ...
Si el valor ocupa dos byte serà:

Resul EQU 0x20 ; Variable en la que guardem el resultat (2 bytes)
...
bcf CARRY ; Volem entrar un zero
rrf Resul+1,f ; Girem a la dreta el byte de més pes
rrf Resul,f ; Ara girem a la dreta el byte de menys pes
; El bit que a sortit per la dreta del primer ha entrat
; per l'esquerra del segon
...
Si en lloc de multiplicar per dos volem fer-ho per quatre només caldrà fer les rotacions corresponents dues vegades tot posant a zero el bit C cada vegada. El mateix per qualsevol altra potència de dos. Si la multiplicació implica més de tres o quatre rotacions és preferible fer-ho iterativament.
Per multiplicar, en principi, hem de sumar el mateix valor diverses vegades. Per exemple, si volem multiplicar el valor de la variable Val per 47 guardant el resultat a Valor i Valor+1 podríem fer:
Valor EQU 0x20 ; Variable en la que guardem el resultat (2 bytes) Val EQU 0x22 ; Variable que conté el valor inicial Comptador EQU 0x23 ; Variable que emprarem per comptar
... clrf Valor clrf Valor+1 movlw 47 movwf Comptador BucleSum: movf Val,w addwf Valor,f btfsc CARRY incf Valor+1,f decfsz Comptador,f goto BucleSum ; A Valor+1,Valor tenim el numero multiplicat per 47 ...
Una alternativa més eficient seria tenir present que 47 és 32 més 15 i que 32 és una potència de dos. Podríem fer cinc rotacions per multiplicar per 32 i després sumar-hi el valor només 15 cops. Per optimitzar el càlcul, podríem descompondre 47 en suma de potències de dos:
32 8 4 2 1 47
Una manera, doncs, seria agafar quatre còpies del valor, rodar la primera cinc cops (multiplica per 32), la segona tres cops (multiplica per 8), la tercera dos cops (multiplica per 4) i la quarta un cop (multiplica per 2); obtindríem el resultat final sumant aquests quatre valors i afegint-hi el valor inicial. En aquest cas aquest mètode no és molt òptim perquè sumar 15 cops són poques operacions però pot ser molt eficient quan cal multiplicar per valors grans.

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.