Bueno: la rutina que expusiste es bastante avanzada para quien no está ágil con el assembler.
1) La rutina se basa en el principio matemático:
Una multiplicación puede descomponerse en sumas finitas del multiplicando * 2^X
Ej:
100 * 254 = 100 * 2^7 + 100 * 2^6 + 100 * 2^5 + 100 * 2^4 + 100 * 2^3 + 100 * 2^2 + 100 * 2^1
= 100 * 128 + 100 * 64 + 100 * 32 + 100 * 16 + 100 * 8 + 100 * 4 + 100 * 2
Las rotaciones son perfectas para llevar a la práctica este principio.
2) Rotar a la izquierda un registro es multiplicarlo por dos.
Rotarlo a la derecha un registro es dividirlo por dos.
Acá puede que les surja la primer aparente incongruencia entre lo que digo y lo que hace la rutina porque si bien la rutina es de multiplicación, la rutina rota los registros hacia la derecha( lo que implicaria división y no multiplicación). Pero si observan bien, verán que las sumas (addwf H_byte,Same) se realizan sobre el byte alto del resultado(H_byte), lo que produce una multiplicación tácita inicialmente por 256, pero que se irá dividiendo por dos a medida que se roten a la derecha los registros. Entonces:
Descompongamos las 8 pasadas del algorítmo:
1era pasada: se comprueba el bit0 del multiplicador. Si es un 1 se procede a realizar la suma:
la suma se acumula en H_byte.
Pausa aquí:
Ejemplo:
1 * 1
Durante la primera pasada:
H_byte = .1
L_byte = .0
Entonces, el resultado es .256 si consideramos ambos registros como uno solo de 16 bits.
Resumiendo: el bit0 del multiplicador(que es factor x1) en realidad produjo un factor x256.
Pero no olvidemos que todos los registros se van rotando a la derecha, hasta un total de ocho veces entonces:
En la primer pasada del algoritmo:
H_byte L_byte
Res= b'00000001 00000000'
Pero luego de la octava pasada, se rotaron ocho veces a la derecha los registros, entonces queda:
Res= b'00000000 00000001'
Bueno, sólo resta hacer esto 8 veces, y las rotaciones son las que van acomodando por si solas el factor de multiplicación adecuado.
¿Logré explicarlo, al menos medianamente?