Es simple.. primero necesitas saber que multiplicando 2 números de 8 bits, podes tener un resultado de 16 bits. Así que el resultado siempre va a estar en 2 registros.
Segundo la multiplicación funciona de la siguiente forma. Supongamos que tenes dos números, el numero 10 y el 11. Y Queremos hacer 10x11 (o 11x10 que es lo mismo)
10d = 1010b
11d = 1011b
Observa que los 1 en el 10, están en la posición 1 y 3. Es decir vamos a tener que sumar el 1011 desplazado 1 y 3 veces:
10110 + 1011000 = 0110 1110
Sabiendo que lo que tenemos que desplazar para la izquierda tantas veces como las posiciones de los 1 que encontremos, es ahí donde tenemos que poner el foco de atención.
Podemos hacer lo siguiente:
Bit 0, del primer numero esta en 1 ?
SI -> Sumo el numero 11.
NO -> No sumo nada
Bit 1, del primer numero esta en 1 ?
SI -> Sumo el numero 11 desplazado 1 vez a la izquierda.
NO -> No sumo nada
Bit 2, del primer numero esta en 1 ?
SI -> Sumo el numero 11 desplazado 2 veces a la izquierda.
NO -> No sumo nada
.... Y asi hasta el bit 7....
Pero podemos incorporarlo en un loop fácilmente. Siempre atendiendo al bit 0, si esta en 1 o no.
Observa que entre en el primer numero quiero ver los bits 0,1,2,3,4 en ese orden. Y el segundo numero necesito que este desplazado 1 vez mas de la anterior.
Entonces puedo hacer esto:
Bit 0, del primer numero esta en 1?
SI-> Sumo el segundo numero a los registros donde va a estar el resultado.
NO-> No hago nada, este punto ni tenerlo en cuenta.
Desplazo a la derecha el primer numero, aprovecho la actualización de banderas y observo si la bandera Z esta activa.
Si esta activa Z, implica que no hay mas 1 en el registro, por lo tanto no tiene sentido seguir desplazando los valores.
En el caso de que NO sea cero, desplazo a la izquierda el segundo numero (para prepararlo para la próxima vuelta)
Repito lo de arriba 7 veces mas.
De esa forma ahora los bits 0,1,2,3,....,7 siempre los voy a estar viendo en el bit 0, y el segundo numero ya va a estar desplazado para su suma correctamente.
Cosas a tener en cuenta:
- Siempre comenzar en 0, los dos registros donde vamos guardando las sumas
- Para desplazar a la izquierda le segundo numero, necesitamos de al menos 16 bits, por lo tanto necesitarías de algunos registros mas para poner ese numero y poder rotarlo tranquilamente.
- La cantidad de registros "extras" va a depender exclusivamente de si queres que sobrevivan o no los valores iniciales.
- Ojo con las instrucciones, ya que dependiendo del PIC, algunos tienen instrucciones para incluir el carry en la rotacion y otros no. Si lo incluyen al carry, entonces recordar ponerlo en 0.