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

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

Desconectado AARON

  • PIC10
  • *
  • Mensajes: 2
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #15 en: 06 de Diciembre de 2007, 02:12:43 »
HOLA, EN LA AN DE MICROCHIP DE RUTINAS MATEMATICAS VIENE LA MULTIPLICACION 8X8, PERO NO ENTIENDO COMO FUNCIONA, ALGUIEN SABE COMO?
LA ADJUNTO, LOS NUMEROS A MULTIPLICAR DEBEN SER CARGADOS PRIMERO CADA UNO EN mulcnd Y mulplr RESPECTIVAMENTE


1997 Microchip Technology Inc. DS00526E-page 7
mulcnd equ 09 ; 8 bit multiplicand
mulplr equ 10 ; 8 bit multiplier
H_byte equ 12 ; High byte of the 16 bit result
L_byte equ 13 ; Low byte of the 16 bit result
count equ 14 ; loop counter


include “p16c5x.inc”
 
Same equ 1

 ; ***************************** Begin Multiplier Routine
 mpy_S clrf H_byte
clrf L_byte
 movlw 8
 movwf count
movf mulcnd,W
 bcf STATUS,C ; Clear the carry bit in the status Reg.
loop rrf mulplr, F
 btfsc STATUS,C
addwf H_byte,Same
 rrf H_byte,Same

 
 rrf L_byte,Same
 decfsz count, F
 goto loop
 retlw 0

Desconectado AARON

  • PIC10
  • *
  • Mensajes: 2
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #16 en: 06 de Diciembre de 2007, 02:18:39 »
ALGUIEN ENTIENDE LA RUTINA DE MULTIPLICACION 8X8 DE MICROCHIP?
Ó
1997 Microchip Technology Inc. DS00526E-page 7
00029 mulcnd equ 09 ; 8 bit multiplicand
00000010 00030 mulplr equ 10 ; 8 bit multiplier
00000012 00031 H_byte equ 12 ; High byte of the 16 bit result
00000013 00032 L_byte equ 13 ; Low byte of the 16 bit result
00000014 00033 count equ 14 ; loop counter
00034 ;
00035 ;
00036 include “p16c5x.inc”
00001 LIST
00002 ;P16C5X.INC Standard Header File, Ver. 3.30 Microchip Technology, Inc.
00224 LIST
00037
00000001 00038 Same equ 1
00039
00040 ;
00041 ; ***************************** Begin Multiplier Routine
0000 0072 00042 mpy_S clrf H_byte
0001 0073 00043 clrf L_byte
0002 0C08 00044 movlw 8
0003 0034 00045 movwf count
0004 0209 00046 movf mulcnd,W
0005 0403 00047 bcf STATUS,C ; Clear the carry bit in the status Reg.
0006 0330 00048 loop rrf mulplr, F
0007 0603 00049 btfsc STATUS,C
0008 01F2 00050 addwf H_byte,Same
0009 0332 00051 rrf H_byte,Same
AN526
 
000A 0333 00052 rrf L_byte,Same
000B 02F4 00053 decfsz count, F
000C 0A06 00054 goto loop
00055 ;
000D 0800 00056 retlw 0

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hace
« Respuesta #17 en: 06 de Diciembre de 2007, 14:18:17 »
Bueno: la rutina que expusiste es bastante avanzada para quien no está ágil con el assembler.

1)         La rutina se basa en el principio matemático:                           
           Una multiplicación puede descomponerse en sumas finitas del multiplicando * 2^X
           Ej:
           100 * 254 = 100 * 2^7 + 100 * 2^6 + 100 * 2^5 + 100 * 2^4 + 100 * 2^3 + 100 * 2^2 + 100 * 2^1
                          = 100 * 128 + 100 * 64 + 100 * 32 + 100 * 16 + 100 * 8 + 100 * 4 + 100 * 2

           Las rotaciones son perfectas para llevar a la práctica este principio.

2)          Rotar a la izquierda un registro es multiplicarlo por dos.
             Rotarlo a la derecha un registro es dividirlo por dos.

Acá puede que les surja la primer aparente incongruencia entre lo que digo y lo que hace la rutina porque si bien la rutina es de multiplicación, la rutina rota los registros hacia la derecha( lo que implicaria división y no multiplicación). Pero si observan bien, verán que las sumas (addwf H_byte,Same) se realizan sobre el byte alto del resultado(H_byte), lo que produce una multiplicación tácita inicialmente por 256, pero que se irá dividiendo por dos a medida que se roten a la derecha los registros. Entonces:

Descompongamos las 8 pasadas del algorítmo:

1era pasada: se comprueba el bit0 del multiplicador. Si es un 1 se procede a realizar la suma:
                    la suma se acumula en H_byte.

Pausa aquí:
Ejemplo:
                    1 * 1
Durante la primera pasada:
                  H_byte = .1
                  L_byte = .0                   
Entonces, el resultado es .256 si consideramos ambos registros como uno solo de 16 bits.
Resumiendo: el bit0 del multiplicador(que es factor x1) en realidad produjo un factor x256.
Pero no olvidemos que todos los registros se van rotando a la derecha, hasta un total de ocho veces entonces:

En la primer pasada del algoritmo:
                            H_byte       L_byte
                Res= b'00000001 00000000'

Pero luego de la octava pasada, se rotaron ocho veces a la derecha los registros, entonces queda:
                Res= b'00000000 00000001'

Bueno, sólo resta hacer esto 8 veces, y las rotaciones son las que van acomodando por si solas el factor de multiplicación adecuado.

¿Logré explicarlo, al menos medianamente? :D
« Última modificación: 06 de Diciembre de 2007, 14:20:32 por BrunoF »
"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 SavageChicken

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 931
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #18 en: 17 de Diciembre de 2007, 14:30:57 »
Visita este Link

Salud  8)
No hay preguntas tontas...
Solo hay tontos que no preguntan.

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: Necesito multiplicar en asembler. Alguien tiene una tira de codigo para hacerlo?
« Respuesta #19 en: 17 de Diciembre de 2007, 18:43:15 »
todo bien


Código: ASM
  1. MULTIPLICACION  BCF     STATUS,0        ;RUTINA PARA MULTIPLICAR LOS NUMEROS
  2.                 CLRF    UNIDAD
  3.                 CLRF    DECENAS
  4.                 CLRF    RESULTADO
  5.                 MOVF    RESULT1,0
  6.                 BTFSS   STATUS,2
  7.                 GOTO    COL
  8.                 CLRF    RESULTADO
  9.                 GOTO    DECODIFICAR
  10. COL             MOVF    RESULT2,0
  11.                 BTFSS   STATUS,2       
  12.                 GOTO    SUCE
  13.                 CLRF    RESULTADO
  14.                 GOTO    DECODIFICAR
  15. SUCE    MOVF    RESULT1,0
  16.                 ADDWF   RESULTADO,1
  17.                 BTFSC   STATUS,0
  18.                 GOTO    EXCESO
  19.                 DECFSZ  RESULT2,1
  20.                 GOTO    SUCE
  21.                                return


saludos


 

anything