TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: summer en 09 de Diciembre de 2006, 14:35:21

Título: producto de dos numeros
Publicado por: summer en 09 de Diciembre de 2006, 14:35:21
Hola!Soy nueva por aqui.Tb soy nueva programando en ensamblador, anteriormente lo habia hecho en C,y será por eso que no lo termino de entender, yo todo lo haria d otras formas! :lol:
Necesito que alguien me explique como se multiplican dos numeros de 8 bits en ensamblador, usaria el pic16f877, y el mplab para hacerlo.No entiendo bien por qué se rotan los numeros...si alguien tiene un programita de multiplicacion hecho se lo agradeceria, ya que busque por aqui pero no hay nada.Saludos! :P
Título: Re: producto de dos numeros
Publicado por: PalitroqueZ en 09 de Diciembre de 2006, 18:48:19
Hola summer. El método básico para multiplicar en ensamblador es mediante la suma sucesiva, es decir, si tenemos por ej: 4x3 se puede interpretar sumar el numero cuatro, tres veces: 4+4+4

en terminos generales, sería la suma del operando1, tantas veces operando2.

llevandolo al switcheo de transistores de los pic (en asm, ;-))

- el primer paso es ir sumando el operando1 y guardarla en un registro (GPR), llamemoslo resultado_lsb, recuerden que si el producto es con 8 bits, el resultado podria pasar de 8 bits, bueno el asunto es que mientras se va haciendo una suma en resultado_lsb. Por otro lado se va decrementando operando2 y éste actuará como un contador, el contador de las veces que sumara operando1 y cuando operando2 llegue a cero se habrá completado la suma y por tanto, la multiplicación.

- para saber si el resultado de la multiplicación es mayor de 8 bits, está el bit Carry y cada vez que acuse un desbordamiento se incrementará resultado_msb

movlw   4
movwf   operando1
movlw   3
movwf   operando2

movlw   0
bcf   STATUS,C                   ; limpia el acarreo

sumar:
addwf   operando1,w   ; operando1 + w -> w
movwf   resultado_lsb   ; w -> resultado_lsb
btfss   STATUS,C                   ; si hay acarreo hacer resultado_msb + 1 --> resultado_msb
goto   pabajo      ; continua la suma
bcf   STATUS,C   ; limpia el acarreo
incf   resultado_msb,1   ; el resultado es mayor de 255
pabajo:
decfsz   operando2,1   ; decrementar operando2 si es 0 salir
goto   sumar
nop         ; termina la suma sucesiva

nota: para la división es de una manera similar, solo que en vez de sumar, se usa la resta

salu2
Pedro
Título: Re: producto de dos numeros
Publicado por: summer en 10 de Diciembre de 2006, 12:48:39
Hola Palitroquez, muchas gracias.Aunque no era eso exactamente lo que preguntaba ya que si el nuemero está em hexadecimal, no es exactamente "sumar el numero 4 tres veces", si por ej se tiene F8 x D1 , se que sería un resultado de mas de 8 bits, asi que no se muy bien como tendria que ir desplazando los numeros, ya que por ej en una multiplicacion normal se va haciendo asi, hasta llegar a unos bits que serian los bits altos del resultado...bueno que estoy hecha un lio!gracias igualmen
te!!
Título: Re: producto de dos numeros
Publicado por: ESTECA55 en 10 de Diciembre de 2006, 14:18:22
Hola, acá dejo un programita para multiplicar dos números, y el resultado lo deja en dos registros, en uno la parte alta y en otro la parte baja.

Esta hecho para otro pic, pero fácilmente podrás adaptarlo a tu pic. Ya se simplemente trabaja con registros.

Saludos y cualquier cosa pregunta.
Título: Re: producto de dos numeros
Publicado por: summer en 10 de Diciembre de 2006, 15:40:36
gracias a ver si con esto me aclaro  :P
Título: Re: producto de dos numeros
Publicado por: PalitroqueZ en 12 de Diciembre de 2006, 11:26:55
... no es exactamente "sumar el numero 4 tres veces", si por ej se tiene F8 x D1 , se que sería un resultado de mas de 8 bits, ...

no habría problema alguno, acuerdate que el pic no ve el sistema de numeración (octal, hexa, dec) él lo que ve son unos y ceros. Con la rutina que expuse se puede multiplicar dos números hasta 255x255, esto es 0xFF(hexa) ó 377(octal), también existen otras tecnicas para multiplicar, como la del código que expuso ESTECA55.

Salu2
Pedro
Título: Re:producto de dos numeros
Publicado por: ScorpionCFG en 12 de Marzo de 2018, 14:47:51
Hola quisiera que me ayudaran porque estuve haciendo un ejercicio y no le podido dar solucion. Me pedia un fragmento de codigo para multiplicar un numero de 16bit por uno de 8bit. saludos
Título: Re:producto de dos numeros
Publicado por: KILLERJC en 12 de Marzo de 2018, 20:54:11
Suma el numero de 16 bits, la cantidad de veces que tenes en el numero de 8 bits.

Ejemplo suponete que tenes el numero 4 en los 16 bits, y tenes el numero 3 en el de 8.

Te reservas al menos 24 bits que es lo que vas a necesitar y empezas a sumar.. en este caso la operacion es 4 * 3, O que es lo mismos que sumar 3 veces 4.

3 * 4 = 4 + 4 + 4

el pseudo codigo seria:


Loop:
   var24bits = var24bits + var16bits
   var8bits = var8bits - 1
   var8bits igual a 0 ?
   No..  voy a loop
   Si, multiplicacion terminada.
Título: Re:producto de dos numeros
Publicado por: Picuino en 13 de Marzo de 2018, 10:46:23
Ese método funciona pero es muy lento.

Este es el método correcto:

Código: [Seleccionar]
   a = 25     (primer número guardado en 8 bit)
   b = 86     (segundo número guardado en 8 bit)
   suma = 0    (resultado de 16 bit)

   repite 8 veces:
       desplaza suma a la izquierda (es igual a multiplicarlo por 2)
       si bit7 de b vale 1:
           suma = suma + a
       desplaza b a la izquierda (es igual a multiplicarlo por 2)

Y ya está. Con 8 desplazamientos y 8 sumas lo tienes. Mucho más rápido.
Título: Re:producto de dos numeros
Publicado por: Picuino en 13 de Marzo de 2018, 10:51:48
En c:
Código: C
  1. main() {
  2.    unsigned char a = 25;
  3.    unsigned char b = 86;
  4.    unsigned int suma = 0;
  5.  
  6.    unsigned char i = 8;
  7.    do {
  8.        suma = (suma << 1);
  9.        if (b & 0x80)
  10.            suma = suma + a;
  11.        b = (b << 1);
  12.        i = i - 1;
  13.    } while(i != 0);
Título: Re:producto de dos numeros
Publicado por: KILLERJC en 13 de Marzo de 2018, 12:59:56
Ese método funciona pero es muy lento.

Si lo se, pero es el metodo mas simple de entender, siendo que no le sale mutiplicar 2 numeros. Y requiere un conocimiento basico de la matematica para entenderle.
Título: Re:producto de dos numeros
Publicado por: Picuino en 13 de Marzo de 2018, 19:06:11
Hola!Soy nueva por aqui.Tb soy nueva programando en ensamblador, anteriormente lo habia hecho en C,y será por eso que no lo termino de entender, yo todo lo haria d otras formas! :lol:

También puedes programar en c, compilar y mirar después el código ensamblador generado. Los compiladores normales generan código assembler un poco complejo así que te recomiendo este otro compilador que es muy bueno para ese propósito:
http://www.bknd.com/cc5x/