Autor Tema: producto de dos numeros  (Leído 20486 veces)

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

Desconectado summer

  • PIC10
  • *
  • Mensajes: 3
producto de dos numeros
« 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

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: producto de dos numeros
« Respuesta #1 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
« Última modificación: 09 de Diciembre de 2006, 18:50:22 por PalitroqueZ »
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado summer

  • PIC10
  • *
  • Mensajes: 3
Re: producto de dos numeros
« Respuesta #2 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!!

Desconectado ESTECA55

  • PIC24H
  • ******
  • Mensajes: 1404
Re: producto de dos numeros
« Respuesta #3 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.
Hay que esforzarse por ser el mejor, no creerse el mejor

Desconectado summer

  • PIC10
  • *
  • Mensajes: 3
Re: producto de dos numeros
« Respuesta #4 en: 10 de Diciembre de 2006, 15:40:36 »
gracias a ver si con esto me aclaro  :P

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5490
    • Electrónica Didacta
Re: producto de dos numeros
« Respuesta #5 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
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado ScorpionCFG

  • PIC10
  • *
  • Mensajes: 2
Re:producto de dos numeros
« Respuesta #6 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:producto de dos numeros
« Respuesta #7 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:producto de dos numeros
« Respuesta #8 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.
« Última modificación: 13 de Marzo de 2018, 10:52:05 por Picuino »

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:producto de dos numeros
« Respuesta #9 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);

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:producto de dos numeros
« Respuesta #10 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.

Desconectado Picuino

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:producto de dos numeros
« Respuesta #11 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/


 

anything