Hola NANO1985:
Aquí te paso una subrutina de división:
Para usar la subrutina en (ACCbHI)(ACCbLO) cargas el Numerador luego en (ACCaHI)(ACCaLO) cargas el denominador y llamas a la surutina (es decir haces ... call D_divF) luego en (ACCbHI)(ACCbLO) tienes el cociente y en (ACCcHI) el residuo. Lo puedes usar con cualquier PIC de cualquier serie
;************************************************************************************************
; SUBRUTINAS DE DIVISION A 16 BITS
;************************************************************************************************
; definir en la RAM: TEMP, sign, ACCaHI, ACCaLO, ACCbHI, ACCbLO, ACCcHI, ACCcLO, ACCdHI, ACCdLO
;(ACCbHI)(ACCbLO) / (ACCaHI)(ACCaLO) = (Q)->(ACCbHI)(ACCbLO) + (R)->(ACCcHI)(ACCcLO) |
;Q: Cociente
;R: Residuo
;----------------------------------------------------------------------------------------
TRUE equ 1
FALSE equ 0
;+++++++++++++++++++++++++
SIGNED equ FALSE
divMac MACRO
LOCAL NOCHK
LOCAL NOGO
bcf STATUS,C
rlf ACCdLO, F
rlf ACCdHI, F
rlf ACCcLO, F
rlf ACCcHI, F
movf ACCaHI,W
subwf ACCcHI,W ;check if a>c
btfss STATUS,Z
goto NOCHK
movf ACCaLO,W
subwf ACCcLO,W ;if msb equal then check lsb
NOCHK btfss STATUS,C ;carry set if c>a
goto NOGO
movf ACCaLO,W ;c-a into c
subwf ACCcLO, F
btfss STATUS,C
decf ACCcHI, F
movf ACCaHI,W
subwf ACCcHI, F
bsf STATUS,C ;shift a 1 into b (result)
NOGO rlf ACCbLO, F
rlf ACCbHI, F
ENDM
;*******************************************************************
setup movlw .16 ; for 16 shifts
movwf TEMP
movf ACCbHI,W ;move ACCb to ACCd
movwf ACCdHI
movf ACCbLO,W
movwf ACCdLO
clrf ACCbHI
clrf ACCbLO
retlw 0
;*******************************************************************
D_divF
IF SIGNED
CALL S_SIGN
ENDIF
call setup
clrf ACCcHI
clrf ACCcLO
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
divMac
IF SIGNED
btfss sign,MSB ; check sign if negative
retlw 0
goto neg_B ; negate ACCa ( -ACCa -> ACCa )
ELSE
retlw 0
ENDIF
;*******************************************************************
; Assemble this section only if Signed Arithmetic Needed
IF SIGNED
S_SIGN movf ACCaHI,W
xorwf ACCbHI,W
movwf sign
btfss ACCbHI,MSB ; if MSB set go & negate ACCb
goto chek_A
comf ACCbLO ; negate ACCb
incf ACCbLO
btfsc STATUS,Z
decf ACCbHI
comf ACCbHI
chek_A btfss ACCaHI,MSB ; if MSB set go & negate ACCa
retlw 0
goto neg_A
ENDIF
;************************************************************************************************
Javicho.