Autor Tema: alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?  (Leído 2798 veces)

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

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?
« en: 18 de Marzo de 2005, 17:18:00 »
Hola Amig@s, tengo un pequeño problemita, alguien dispone del codigo para dividir

32 bits (4 bytes) con 16 bits (2 bytes) en asembler? loco
Gracias!!!

Norberto Rebotado
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?
« Respuesta #1 en: 18 de Marzo de 2005, 18:01:00 »
Dudo que algún pic pueda hacerlo asi,pero los dspic te la hacen en una sola instruccion,eso si,en 18 ciclos

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?
« Respuesta #2 en: 18 de Marzo de 2005, 18:30:00 »
je je je... garcias Modulay, yo tenia rutinas de 24 bits... pero consegui aqui
http://www.piclist.com/techref/microchip/math/32bmath-ph.htm
esta muy interesante! Sonrisa GiganteRebotado

Gracias!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
RE: alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?
« Respuesta #3 en: 05 de Junio de 2005, 02:58:00 »
             Por si no lo as conseguido espero que este programa te sirba on saludo, y suerte, Carlos.


;              Divicion de 32 bit x 32 bit
;          Son necesarios un maximo de 3202 ciclos de reloj
;          Ocupa una capacidad total de memoria de 229 pocisiones
;          con la resta

MAYOR1      EQU      .32      ;
MAYOR2      EQU      .33      ;
MAYOR3      EQU      .34      ;
MAYOR4      EQU      .35      ;
MANOR1      EQU      .36      ;
MENOR2      EQU      .37      ;
MENOR3      EQU      .38      ;
MENOR4      EQU      .39      ;
RES1      EQU      .40      ; RESULTADO
RES2      EQU      .41      ; RESULTADO
RES3      EQU      .42      ; RESULTADO
RES4      EQU      .43      ; RESULTADO
DI1         EQU      .44      ; NUMERO A DIVIDIR MAS SIGNIFICATIVO
DI2         EQU      .45      ; NUMERO A DIVIDIR
DI3         EQU      .46      ; NUMERO A DIVIDIR
DI4         EQU      .47      ; NUMERO A DIVIDIR MENOS SIGNIFICATIVO
DIV1      EQU      .48      ; NUMERO DIVISOR MAS SIGNIFICATIVO
DIV2      EQU      .49      ; NUMERO DIVISOR
DIV3      EQU      .50      ; NUMERO DIVISOR
DIV4      EQU      .51      ; NUMERO DIVISOR MENOS SIGNIFICATIVO
MULT1      EQU      .56      ;
MULT2      EQU      .57      ;
MULT3      EQU      .58      ;
MULT4      EQU      .59      ;
DATO      EQU      .52      ;   
CONTA1      EQU      .53      ;
CONTA2      EQU      .54      ;
CONTA      EQU      .55      ;
ACARREO      EQU      .92      ;

;................................................................................................

DIVIDE                  ;32 X 32
   clrf   CONTA
   clrf   CONTA1
   clrf   CONTA2
   clrf   DATO
   clrf   MAYOR1
   clrf   MAYOR2
   clrf   MAYOR3
   clrf   MAYOR4
   clrf   MULT1
   clrf   MULT2
   clrf   MULT3
   clrf   MULT4

   movlw   .0
   subwf   DI1,W
   btfss   STATUS,Z
   goto   GFD
   movlw   .0
   subwf   DI2,W
   btfss   STATUS,Z
   goto   GFD
   movlw   .0
   subwf   DI3,W
   btfss   STATUS,Z
   goto   GFD
   movlw   .0
   subwf   DI4,W
   btfss   STATUS,Z
   goto   GFD
   goto   DIV_SAL
GFD
   movf   DIV1,W
   movwf   DATO
   call   VER1
   btfsc   CONTA2,0
   goto   DIVFIN

   movf   DIV2,W
   movwf   DATO
   call   VER1
   btfsc   CONTA2,0
   goto   DIVFIN

   movf   DIV3,W
   movwf   DATO
   call   VER1
   btfsc   CONTA2,0
   goto   DIVFIN

   movf   DIV4,W
   movwf   DATO
   call   VER1
DIVFIN
   clrf   CONTA2
   movf   DI1,W
   movwf   DATO
   call   VER
   btfsc   CONTA2,0
   goto   DIFIN

   movf   DI2,W
   movwf   DATO
   call   VER
   btfsc   CONTA2,0
   goto   DIFIN

   movf   DI3,W
   movwf   DATO
   call   VER
   btfsc   CONTA2,0
   goto   DIFIN

   movf   DI4,W
   movwf   DATO
   call   VER
DIFIN
   incf   CONTA1,F
   movf   CONTA1,W
   movwf   CONTA2
   decfsz   CONTA1,F
   goto   SAL1
   goto   SAL2
SAL1
   bcf      STATUS,C
   rlf      DIV4,F
   rlf      DIV3,F
   rlf      DIV2,F
   rlf      DIV1,F
   decfsz   CONTA1,F
   goto   SAL1
SAL2
   movf   DI1,W
   movwf   MAYOR1
   movf   DI2,W
   movwf   MAYOR2
   movf   DI3,W
   movwf   MAYOR3
   movf   DI4,W
   movwf   MAYOR4
RE
   movf   DIV1,W
   subwf   MAYOR1,W
   btfss   STATUS,C
   goto   ARRASTRE
   btfss   STATUS,Z
   goto   BIEN

   movf   DIV2,W
   subwf   MAYOR2,W
   btfss   STATUS,C
   goto   ARRASTRE
   btfss   STATUS,Z
   goto   BIEN

   movf   DIV3,W
   subwf   MAYOR3,W
   btfss   STATUS,C
   goto   ARRASTRE
   btfss   STATUS,Z
   goto   BIEN

   movf   DIV4,W
   subwf   MAYOR4,W
   btfss   STATUS,C
   goto   ARRASTRE
   goto   BIEN
ARRASTRE
   bcf      STATUS,C
   rrf      DIV1,F
   rrf      DIV2,F
   rrf      DIV3,F
   rrf      DIV4,F
   bcf      STATUS,C
   rlf      MULT4,F
   rlf      MULT3,F
   rlf      MULT2,F
   rlf      MULT1,F
   bcf      MULT4,0
   decfsz   CONTA2,F
   goto   RE
   goto   DIV_SAL
BIEN
   movf   DIV1,W
   movwf   MENOR1
   movf   DIV2,W
   movwf   MENOR2
   movf   DIV3,W
   movwf   MENOR3
   movf   DIV4,W
   movwf   MENOR4

   call   RESTA
   
   movf   RES1,W
   movwf   MAYOR1
   movf   RES2,W
   movwf   MAYOR2
   movf   RES3,W
   movwf   MAYOR3
   movf   RES4,W
   movwf   MAYOR4

   bcf      STATUS,C
   rrf      DIV1,F
   rrf      DIV2,F
   rrf      DIV3,F
   rrf      DIV4,F
   bcf      STATUS,C
   rlf      MULT4,F
   rlf      MULT3,F
   rlf      MULT2,F
   rlf      MULT1,F
   bsf      MULT4,0
   
   decfsz   CONTA2,F
   goto   RE
   goto   DIV_SAL
VER
   bcf      STATUS,C
   movlw   .8
   movwf   CONTA
QWE
   btfsc   DATO,7
   goto   ZXC
   decf   CONTA1,F
   rlf      DATO,F
   decfsz   CONTA,F
   goto   QWE
   return
VER1
   bcf      STATUS,C
   movlw   .8
   movwf   CONTA
ASD
   btfsc   DATO,7
   goto   ZXC
   incf   CONTA1,F
   rlf      DATO,F
   decfsz   CONTA,F
   goto   ASD
   return
ZXC
   movlw   .1
   movwf   CONTA2
   return
DIV_SAL
   movf   MULT1,W
   movwf   RES1
   movf   MULT2,W
   movwf   RES2
   movf   MULT3,W
   movwf   RES3
   movf   MULT4,W
   movwf   RES4
   return
RESTA                  ;32 x 32
   clrf   ACARREO

   comf   MAYOR4,W
   addwf   MENOR4,W
   movwf   RES4
   btfsc   STATUS,C
   incfsz   MENOR3,F
   goto   IOP1
   incfsz   MENOR2,F
   goto   IOP1
   incfsz   MENOR1,F
   goto   IOP1
   bsf      ACARREO,0
IOP1   
   comf   MAYOR3,W
   addwf   MENOR3,W
   movwf   RES3
   btfsc   STATUS,C
   incfsz   MENOR2,F
   goto   IOP2
   incfsz   MENOR1,F
   goto   IOP2
   bsf      ACARREO,0
IOP2
   comf   MAYOR2,W
   addwf   MENOR2,W
   movwf   RES2
   btfsc   STATUS,C
   incfsz   MENOR1,F
   goto   IOP3
   bsf      ACARREO,0
IOP3
   comf   MAYOR1,W
   addwf   MENOR1,W
   movwf   RES1
   btfsc   STATUS,C
   bsf      ACARREO,0

   btfsc   ACARREO,0
   bcf      STATUS,C
   btfss   ACARREO,0
   bsf      STATUS,C   

   comf   RES4,F
   comf   RES3,F
   comf   RES2,F
   comf   RES1,F

   return
La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado antoniof

  • Moderadores
  • PIC24F
  • *****
  • Mensajes: 729
RE: alguien dispone de codigo asm para DIVIDIR 32 X 16 BITS?
« Respuesta #4 en: 05 de Junio de 2005, 17:01:00 »
Jeje. Precisamente esta tarde he estado trabajando con una rutina para dividir un número de 48 bits entre otro de 24 bits:

Codigo:
;****************************************************************************
; DIVIDE:   Rutina para dividir un número de 48bits entre otro de 24 bits
; Formula:      dividendo = dividendo/divisor
;      
; Ram usada:   dividendo   6 bytes ( 48 bits )
;               divisor    3 bytes ( 24 bits )
;               temp       3 bytes
;               bitcount   1 byte  (Contador de bucles)
;****************************************************************************

divide   movlw   0x04
   movwf   divisor1
   movlw   0x78
   movwf   divisor2
   movlw   0x69
   movwf   divisor3   ;Carga el Divisor
   clrf   temp1
   clrf   temp2
   clrf   temp3      ;Borra los temporales
   movlw   d"48"
   movwf   bitcount   ;Carga el contador
   bcf   status,c   ;Borra el carry

bckdiv   rlf   dividendo6,f
   rlf   dividendo5,f
   rlf   dividendo4,f
   rlf   dividendo3,f
   rlf   dividendo2,f
   rlf   dividendo1,f
   rlf   temp3,f
   rlf   temp2,f
   rlf   temp1,f      ;Desplaza todos los registros

   movf    divisor1,w
   subwf   temp1,w      ;Comprueba si temp > divisor
   btfss   status,2
   goto    nochk
   movf    divisor2,w   ;Si los MSB son iguales checkea los siguientes
   subwf   temp2,w
   btfss   status,2
   goto    nochk
   movf    divisor3,w   ;Si estos son iguales checkea los siguientes
   subwf   temp3,w
   
nochk   btfss   status,c   ;El carry esta a 1 si temp > divisor
   goto   skip      ;Sino, no se resta   
   movf   divisor3,w   ;Resta los 24 bits del temporal a los
   subwf   temp3,f      ;24 bits del temp
   btfss   status,c
   decf   temp2,f
   movf   divisor2,w   ;temp - divisor --> temp
   subwf   temp2,f   
   btfss   status,c
   decf   temp1,f
   movf   divisor1,w
   subwf   temp1,f
   bsf   status,c   ;Se mete un 1 en el carry si se resta
   
skip   decfsz  bitcount,f   ;Decrementa el contador
   goto   bckdiv

   rlf   dividendo6,w   ;Mete el último carry en el resultado
   movwf   dds4      ;y mete el resutado en los registros del DDS
   rlf   dividendo5,w
   movwf   dds3
   rlf   dividendo4,w
   movwf   dds2
   rlf   dividendo3,w
   movwf   dds1
   rlf   dividendo2,f
   rlf   dividendo1,f
   return