51单片机多字节的除法源程序
;(四字节除四字节,被除数或者除数小于四字节,则前面填0即可)
; 后面还有一个双字节除双字节的程序,如果除数是单字节,则字高位填为00即可)
;R4R5R6R7放被除数 R0R1R2R3放除数
;当除数的长度为4字节时 R3R4R5R6是余数 R7是商
;当除数的长度为3字节时 R3R4R5是余数 R6R7是商
;当除数的长度为2字节时 R3R4是余数 R5R6R7是商
;当除数的长度为1字节时 R3是余数 R4R5R6R7是商
;被除数是双字时,将R4R5置为0即可,这个程序包打天下
;用一个单元来放中间值 单元名为Danyuan
Danyuan Equ 3BH
MOV R7,#0ffh
MOV R6,#0ffh
MOV R5,#0ffh
MOV R4,#0ffh
MOV R3,#100
MOV R2,#0H
MOV R1,#0H
MOV R0,#0H
MOV B,#08H
CJNE R0,#00H,DVDL
MOV B,#10H
CLR A
XCH A,R3
XCH A,R2
XCH A,R1
XCH A,R0
CJNE R0,#00H,DVDL
CLR A
XCH A,R2
XCH A,R1
XCH A,R0
MOV B,#18H
CJNE R0,#00H,DVDL
CLR A
XCH A,R1
XCH A,R0
MOV B,#20H
CJNE R0,#00H,DVDL
SETB OV
JMP END_DIV
DVDL: MOV Danyuan,#00H
DVDL2: CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
XCH A,R5
RLC A
XCH A,R5
XCH A,R4
RLC A
XCH A,R4
XCH A,Danyuan
RLC A
XCH A,Danyuan
JC DVDL1
DVDL4: SUBB A,R3
MOV A,R5
SUBB A,R2
MOV A,R4
SUBB A,R1
MOV A,Danyuan
SUBB A,R0
JC DVDL3
DVDL1: CLR C
MOV A,R6
SUBB A,R3
MOV R6,A
MOV A,R5
SUBB A,R2
MOV R5,A
MOV A,R4
SUBB A,R1
MOV R4,A
MOV A,Danyuan
SUBB A,R0
MOV Danyuan,A
INC R7
DVDL3: DJNZ B,DVDL2
END_DIV:
MOV R3,Danyuan
NOP ;停在这里看结果
END
;双字节除双字节的程序如下:
;51单片机双字节的除法
;51单片机只是8位的,但有时候需要实现双字节除法,里面的指令只支持8位。
;想来想去,只好用减法来实现了。下面这个子程序是双字节除以双字节,商、余数结果都是双字节保存,可能有点消耗资源,但这样可以整合在一块。
;****************************************
;函数名称:Div2Byte
;功能描述:无符号数双字节除法
;传入参数:R0R1被除数 R2R3除数
;返回数据:R4R5商 R6R7余数
;其他说明:比如双字节数R0R1,R0高字节 R1低字节
;****************************************
Div2Byte:
Mov R0,#0ffh
Mov R1,#0ffh
Mov R2,#0
Mov R3,#254
Mov R4,#0
Mov R5,#0 ;商赋初值零
Mov A,R0
Mov R6,A
Mov A,R1
Mov R7,A ;余数赋初值,保证商为零时余数正常
Div2Byte_1:
Mov A,R1
Clr C
Subb A,R3 ;低字节相减
Mov R1,A
Mov A,R0
Subb A,R2 ;高位相减
Mov R0,A
Jc Div2Byte_3 ;如果高字节都需要借位则退出循环
Clr C
Mov A,R5
Add A,#1 ;之后JNC判断,故不用INC
Mov R5,A
Jnc Div2Byte_2
Inc R4 ;商加1
Div2Byte_2:
Mov A,R1
Mov R7,A
Mov A,R0
Mov R6,A ;更新余数
LJMP Div2Byte_1
Div2Byte_3:
Nop
END |