; Divide 16 bit number in R7,R6 by 8 bit number in B. Put result in A.
div16: CJNE R6,#0,calcdiv
CJNE R7,#0,calcdiv
MOV R2,#0 ; If R7:R6 is 0, then result is 0
LJMP dend
calcdiv:CLR C
MOV A,B
RRC A
MOV R5,A
MOV A,#0
RRC A
MOV R4,A ; R5,R4 is the initial divisor
MOV R2,#0 ; Result
MOV R3,#80h ; Bit value for result
dloop: MOV A,R6
CLR C
SUBB A,R4 ; LS Byte subtract
MOV R1,A
MOV A,R7
SUBB A,R5 ; MS Byte subtract
JC set0 ; If carry set, subtract was not possible
MOV R7,A
MOV A,R1
MOV R6,A ; R7,R6 is the new value to subtract from
MOV A,R2
ADD A,R3
MOV R2,A ; Set bit in result
set0: CLR C
MOV A,R3
RRC A
MOV R3,A ; New bit value for result
JZ dend ; all bits have been done
CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R4
RRC A
MOV R4,A ; R5,R4 is new divisor
LJMP dloop ; do next bit
dend: MOV A,R2 ; Result in A
RET
; Divide 20 bit number in R7:R6:R5 by 10 bit number in R3:R2.
; Put result in A:B.
div20: MOV A,R5
ORL A,R6
ORL A,R7
JNZ caldiv
SETB RS0 ; Reg bank 1
MOV R7,#0
MOV R6,#0 ; If R7:R6:R5 is 0, then result is 0
CLR RS0 ; Reg bank 0
LJMP d20end
caldiv: MOV R4,#0
MOV R1,#3 ; Divisor is already 6 left. Shift another
3.
shftsub:CLR C
MOV A,R2
RLC A
MOV R2,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
DJNZ R1,shftsub ; R4:R3:R2 is the initial sutractor
SETB RS0 ; Reg bank 1
MOV R7,#0
MOV R6,#0 ; Result in R7:R6 bank 1
MOV R5,#80h
MOV R4,#0 ; Bit value for result in R5:R4 bank 1
CLR RS0 ; Reg bank 0
d20loop:CLR C
MOV A,R5
SUBB A,R2 ; LS Byte subtract
MOV R0,A
MOV A,R6
SUBB A,R3 ; Mid Byte subtract
MOV R1,A
MOV A,R7
SUBB A,R4 ; MS Byte subtract
JC res0 ; If carry set, subtract was not possible
MOV R7,A
MOV A,R1
MOV R6,A
MOV A,R0
MOV R5,A ; Update subtractee
SETB RS0 ; Reg bank 1
MOV A,R6
ORL A,R4
MOV R6,A ; Set bit in result LS Byte
MOV A,R7
ORL A,R5
MOV R7,A ; Set bit in result MS Byte
res0: SETB RS0 ; Reg bank 1
CLR C
MOV A,R5
RRC A
MOV R5,A
MOV A,R4
RRC A
MOV R4,A ; New bit value for result
ANL A,#20h
CLR RS0 ; Reg bank 0
JNZ d20end ; all bits have been done
CLR C
MOV A,R4
RRC A
MOV R4,A
MOV A,R3
RRC A
MOV R3,A
MOV A,R2
RRC A
MOV R2,A ; R4:R3:R2 is the new subtractor
LJMP d20loop ; do next bit
d20end: SETB RS0 ; Reg bank 1
MOV A,R7
MOV B,R6 ; Result in A:B
CLR RS0 ; Reg bank 0
RET
See:
| file: /Techref/8051/div32by16-ad.htm, 4KB, , updated: 2007/9/25 14:24, local time: 2025/10/24 15:58,
owner: JMN-EFP-786,
216.73.216.188,10-3-157-36:LOG IN
|
| ©2025 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions? <A HREF="http://ecomorder.com/Techref/8051/div32by16-ad.htm"> Divide 32bits by 16bits</A> |
| Did you find what you needed? |
Welcome to ecomorder.com! |
Welcome to ecomorder.com! |
.