CODE
;File: DIV2424.ASM
;Title: The 24-bit Division Routine
;Version: 1.5
;Last updated: 29.05.08
;Author: GM
;Target: Microchip microcontroller of PIC18 family
;
;Support E-mail: pdp11@bk.ru
;
;DESCRIPTION
;This routine divides an unsigned 24-bit value by an unsigned
;24-bit value to get an unsigned 24-bit quotient
;using: call udiv2424
;processing time: 418-562 machine cycles
;input data:
; dividend - in variables dvd2,dvd1,dvd0(lsb)
; divisor - in variables dvs2,dvs1,dvs0(lsb)
;output data:
; quotient - in variables dvd2,dvd1,dvd0(lsb)
; remainder- in variables rmn2,rmn1,rmn0(lsb)
LIST P=PIC18F45J10
#include "P18F45J10.INC"
global udiv2424
extern dvd2,dvd1,dvd0
extern dvs2,dvs1,dvs0
extern rmn2,rmn1,rmn0
extern bitcnt
code
udiv2424
clrf rmn0 ;clear remainder
clrf rmn1
clrf rmn2
movlw .24 ;bit shift counter
movwf bitcnt
bcf STATUS,0
udiv241
rlcf dvd0
rlcf dvd1
rlcf dvd2
rlcf rmn0
rlcf rmn1
rlcf rmn2
movf dvs0,w ;rmn-dvs-->rmn
subwf rmn0,f
movf dvs1,w
subwfb rmn1,f
movf dvs2,w
subwfb rmn2,f
bc udiv242 ;Cy=1 if rmn>=0
movf dvs0,w ;rmn+dvs-->rmn
addwf rmn0,f
movf dvs1,w
addwfc rmn1,f
movf dvs2,w
addwfc rmn2,f
bcf STATUS,0
udiv242
decfsz bitcnt,f
bra udiv241
rlcf dvd0
rlcf dvd1
rlcf dvd2
return
end
Как видите, код достаточно компактный, и достаточно быстрый, по крайней мере в сети быстрее не нашёл. Ну, можно ещё немного ускорить, циклов на 50, с разумным увеличением размера программы. Немного позже добавлю программу деления 32/32-->32.