Autor Tema: Ayuda multiplicación MPLab  (Leído 217 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Aficionado

  • PIC10
  • *
  • Mensajes: 2
Ayuda multiplicación MPLab
« en: 02 de Abril de 2021, 12:56:11 »
Buenas,

Necesito ayuda implementando el algoritmo de suma desplazamiento en lenguaje ensamblador en MPLAB.

He visto el algoritmo en esta página pero no tengo ni idea de como empezar...

https://www.monografias.com/trabajos104/unidades-aritmetico-logicas/unidades-aritmetico-logicas.shtml

Gracias por la ayuda!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8096
Re:Ayuda multiplicación MPLab
« Respuesta #1 en: 02 de Abril de 2021, 14:00:30 »
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:

Citar
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:

Citar
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.
« Última modificación: 02 de Abril de 2021, 14:04:45 por KILLERJC »

Desconectado Eduardo2

  • PIC18
  • ****
  • Mensajes: 473
Re:Ayuda multiplicación MPLab
« Respuesta #2 en: 02 de Abril de 2021, 14:16:31 »
Explicaciones y ejemplos de rutinas las tenés en la nota de aplicación de Microchip AN617

http://ww1.microchip.com/downloads/en/AppNotes/00617.pdf

También en: http://www.piclist.com/techref/microchip/math/mul/index.htm
« Última modificación: 02 de Abril de 2021, 14:20:00 por Eduardo2 »


 

anything