Autor Tema: Multiplicación y División en Assembler  (Leído 18595 veces)

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

Desconectado SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 910
Multiplicación y División en Assembler
« en: 30 de Mayo de 2007, 14:40:31 »
Dado que este es un almacén de assembler, he querido aportar un granito de arena.
He visto que se pregunta repetidamente por esto y si bien hay algunas respuestas dejo un código bien explicado de una rutina de multiplicación y de división, espero les sirva:

Código: Microchip Assembler
  1. ;****** Debemos declarar las variables primero, estas son:
  2. ;***************************************************
  3. ;****** Factor_A
  4. ;****** Factor_B
  5. ;****** Result_H
  6. ;****** Result_L
  7. ;****** Dividendo_H
  8. ;****** Dividendo_L
  9. ;****** Divisor
  10. ;****** Cociente_H
  11. ;****** Cociente_L
  12. ;***************************************************
  13.  
  14. ;Se cargan Previamente en Factor_A y Factor_B los valores a multiplicar
  15. ;El resultado quedará almacenado en Result_H y Result_L
  16.  
  17. Multiplicar
  18.                 clrf    Result_L                        ;borramos para inicializar
  19.                 clrf    Result_H
  20.                 movf    Factor_B,F                      ;Si es cero...
  21.                 btfsc   STATUS,Z                        ;En Caso que el Factor "B" Sea Cero
  22.                 return                                          ;volver con resultado= 0
  23.                 movf    Factor_A,W                      ;cargamos el Factor "A"
  24. Mult_Bucle
  25.                 addwf   Result_L,F                      ;Sumamos "A", Tantas veces como sea "B"
  26.                 btfsc   STATUS,C                        ;Existe Acarreo?...
  27.                 incf    Result_H,F                      ;...Si. Incrementamos el byte Mayor
  28.                 decfsz  Factor_B,F                      ;Terminó la Multiplicación?...
  29.                 goto    Mult_Bucle                      ;... No, Seguimos haciendo sumas.
  30.                 return                                          ;Si. Volvemos a la rutina principal
  31.  
  32.  
  33. ;Se carga previamente en Dividendo_H y Dividendo_L el valor total del Dividendo
  34. ;y en Divisor el valor del divisor. El resultado quedará en Cociente_H y Cociente_L
  35. ;y el resto quedará en Dividendo_L
  36. ;(Nota: Dividendo_H y Dividendo_L serán borrados en el proceso de división)
  37.  
  38. Dividir
  39.                 clrf    Cociente_L                      ;Limpiamos el valor del resultado
  40.                 clrf    Cociente_H
  41. VerifDiv
  42.                 movfw   Dividendo_H                     ;Si la parte alta del Dividendo...
  43.                 btfss   STATUS,Z                        ;contiene algún valor...
  44.                 goto    PuedeDividir                    ;... Podemos dividir
  45.                 movfw   Divisor                         ;Si no es el caso...
  46.                 subwf   Dividendo_L,W                   ;...Verificamos que la parte baja del Dividendo...
  47.                 btfss   STATUS,C                        ;...sea mayor que el divisor
  48.                 return                                          ;En caso de ser menor, la división no se realiza
  49. PuedeDividir
  50.                 incf    Cociente_L,F                    ;Aumentamos el valor del cociente bajo...
  51.                 btfsc   STATUS,Z                        ;...en caso de llegar al máximo...
  52.                 incf    Cociente_H,F                    ;...aumentamos el cociente alto
  53.                 movfw   Divisor                         ;Cargo el valor del Divisor en W...
  54.                 subwf   Dividendo_L,F                   ;...y le resto al dividendo el valor del divisor
  55.                 btfsc   STATUS,C                        ;Si el valor es positivo...
  56.                 goto    VerifDiv                        ;...continuo con la división...
  57.                 decf    Dividendo_H,F                   ;...Si fue negativo decremento la parte alta del dividendo y...
  58.                 goto    VerifDiv                        ;...continuo con la división.
  59.  
« Última modificación: 30 de Mayo de 2007, 21:15:42 por SavageChicken »
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado nietzche

  • PIC10
  • *
  • Mensajes: 14
Re: Multiplicación y División en Assembler
« Respuesta #1 en: 05 de Agosto de 2010, 03:24:12 »
excelentisimo, gracias man

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Multiplicación y División en Assembler
« Respuesta #2 en: 05 de Agosto de 2010, 12:54:54 »
Pues muchas gracias.

Desconectado agauss

  • PIC16
  • ***
  • Mensajes: 147
Re: Multiplicación y División en Assembler
« Respuesta #3 en: 24 de Agosto de 2010, 15:55:29 »
Y tendras algo en coma flotante...???
No es el conocimiento, sino el acto de aprendizaje, y no la posesión, sino el acto de llegar allí, que concede el mayor disfrute.
"Carl Friedrich Gauss"

El tacto es el arte de hacer un punto sin hacer un enemigo.
"Isaac Newton"

Desconectado TrebolTronik

  • PIC10
  • *
  • Mensajes: 1
Re:Multiplicación y División en Assembler
« Respuesta #4 en: 15 de Abril de 2017, 22:56:54 »
Muy bueno, se agradece.