Autor Tema: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?  (Leído 14971 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Tengo que multiplicar dos registros de 8 bits y el resultado me tiene que quedar en 8 bits

para luego sacar por un DAC de 8 bit.

Martín me dijo que si tengo dos registros A y B.
La multiplicacion seria sumar A asi mismo B veces = AxB

Aguien alguna vez lo hizo???


Ayuda por favor :-/
"Prenden fuego y no queman nada"

Desconectado Veguepic

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2119
Dale una mirada a estos dos links:

http://www.todopic.com.ar/asm/varios/arith.txt

http://www.physics.brocku.ca/courses/2p31/References/datasheets/00526e.html

espero nos cuentes que tal te fue y mejor aun si pegas tus resultados.

Suerte.
“Si la gente es buena sólo porque temen al castigo y porque esperan una recompensa, entonces verdaderamente somos un grupo lastimoso." Albert Einstein.

Saludos desde Lima , Peru    -    Hugo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #2 en: 06 de Enero de 2007, 11:13:41 »
Franc749 te dejo el link directo a notas de aplicación de Microchip que justamente tratan este tema.

AN526: Math Routines

Ahí tienes el pdf y el código fuente

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Mira este link a ver si te sirve.

Salu2
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Muchas gracias a todos. :)

Era justo lo que buscaba. Solo esperemos que la multiplicacion me quede en 8 bit y no se desvorde jeje.


Saludos :mrgreen:
"Prenden fuego y no queman nada"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #5 en: 16 de Enero de 2007, 16:29:50 »
Muchas gracias a todos. :)

Era justo lo que buscaba. Solo esperemos que la multiplicacion me quede en 8 bit y no se desvorde jeje.


Saludos :mrgreen:

Si es así, es porque tienes muuuuuuuuuuuucha suerte.

Una multiplicación de 8 bits x 8 bits, tiene muchas más chances de ser mayor a 255 que menor, ya que el rango es hasta 65536 y para que sea de 8 bits nomas, no debiera superar el valor 255.

Con que ambos sean mayores o iguales a 16, ya te dará un número superior a 256.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado ascii

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 131
Asi es lo mas probable es que el resultado de la multiplicacion supere un registro 8bits, por lo que te recomendaria que guardes la parte baja de tu multiplicacion en un registro de 8 y la parte alta en otro registro de 8.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #7 en: 16 de Enero de 2007, 20:23:53 »
Asi es lo mas probable es que el resultado de la multiplicacion supere un registro 8bits, por lo que te recomendaria que guardes la parte baja de tu multiplicacion en un registro de 8 y la parte alta en otro registro de 8.

Eso es lo que hace precisamente la rutina de 8bits x 8bits de la application note.

   :) :)
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #8 en: 01 de Febrero de 2007, 16:49:49 »
Se podría hacer la multiplicacion en punto flotante en assembler?

Necesito multiplicar a  un valor de 0 a 256 que está en un registro por un nro= 0.00435 que es una contante de una ecuacion de diferencias de un PID.
 
No sé si es punto flotante o no. creo que es "punto flotante" por que el numero esta en decimales.

Ayuda :-/
"Prenden fuego y no queman nada"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #9 en: 01 de Febrero de 2007, 17:27:45 »
Se podría hacer la multiplicacion en punto flotante en assembler?

Necesito multiplicar a  un valor de 0 a 256 que está en un registro por un nro= 0.00435 que es una contante de una ecuacion de diferencias de un PID.
 
No sé si es punto flotante o no. creo que es "punto flotante" por que el numero esta en decimales.

Ayuda :-/

Todo todo todo se puede hacer en assembler, el tema es que es trabajoso.

De hecho un compilador de C , basic, pascal o cualquier otro lenguaje, en definitiva termina pasando el código a assembler.

Hay también un par de application notes de Microchip que tratan el tema.  Te sugiero que te pases una vuelta por su página.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Franc749

  • PIC10
  • *
  • Mensajes: 22
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #10 en: 07 de Febrero de 2007, 20:05:20 »
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.

¿Hay alguna forma de pasar el codigo en C de la multiplicacion a Assembler?
Así tengo todo en assembler o la mayor parte.
Así no cominezo desde el principio todo mi programa en C.

Les pregunto por que capaz que ya habian tratado el tema.

Saludos :)
"Prenden fuego y no queman nada"

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #11 en: 07 de Febrero de 2007, 20:20:32 »
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.

¿Hay alguna forma de pasar el codigo en C de la multiplicacion a Assembler?
Así tengo todo en assembler o la mayor parte.
Así no cominezo desde el principio todo mi programa en C.

Les pregunto por que capaz que ya habian tratado el tema.

Saludos :)

Mirá, podrías analizar el assembler generado aunque también te comento que las rutinas de coma flotante del C18 están completamente escritas en assembler.

El tema es que usan el stack que usa el compilador C18 para paso y devolución de parámetros con lo cual debieras estar muy familiarizado con su uso. 

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado mariano_pic

  • PIC18
  • ****
  • Mensajes: 498
    • Software Electronica Microncontroladores
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #12 en: 04 de Marzo de 2007, 16:01:17 »
Aca lo tengo jeje y lo probe en MPLAB ojala les sirva.  :mrgreen:

Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilisados son byte_H y byte_L almasenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicilisar
           clrf       byte_H                     
           movf    mult1 ,  w          ;cargamos el operando 1
           bcf       status , c           ;borramos c

    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;ahi llevada?
           call       Mult_2              ;si
           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

    Mult_2
           incf       byte_H , f
           return




Luego les pongo mas jeje
Necesitas ayuda para tu proyecto electronico?
buscame, tal ves pueda colaborarte.
Blog: http://electronicosembebidos.blogspot.com.co/
mail: electronicosembebidos@gmail.com
Mi grupo de facebook: https://www.facebook.com/groups/ProgramandoPics/

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #13 en: 04 de Marzo de 2007, 16:45:43 »
Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilisados son byte_H y byte_L almasenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicilisar
           clrf       byte_H                     
           movf    mult1 ,  w          ;cargamos el operando 1
    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;ahi llevada?
           incf       byte_H , f

           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

El programa es un poquito mas corto. Elimine dos lineas. Pero tu algoritmo tiene un error si Mult2 es cero. Multiplica 256 veces incorrectamente.
¿Solucion?:

Código: [Seleccionar]
           CBLOCK
           byte_H, byte_L, Mult1, Mult2
           ENDC
           ;los registros utilizados son byte_H y byte_L almacenan el resultado de la multiplicacion
           ;los registros Mult1, Mult2 los operandos

    Mult
           clrf       byte_L               ; borramos para inicializar
           clrf       byte_H                     
           movf    mult2,f               ; Si es cero...
           btfsc    STATUS,Z
           return                            ; volver con resultado= 0

           movf    mult1 ,  w          ;cargamos el operando 1
    Mult_
           addwf   byte_L , f          ;El valor mult1 nunca se pierde aca
           btfsc    status , c           ;hay llevada?
           incf       byte_H , f

           decfsz   mult2 ,  f          ;no y termino?
           goto      Mult_               ;no
           return                          ;si, regresa

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #14 en: 05 de Marzo de 2007, 15:20:09 »
Si en verdad es todo un tema lo de la multiplicacion en punto flotante. :?

He decidido hacerlo en C pues no es dificil y ya tengo el codigo, pero solo quiero hacer la multiplicacion en C.
...

esa es una de las razones por las que uso el lenguaje C.  8)

Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything