首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

51单片机多字节的除法源程序

51单片机多字节的除法源程序

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
返回列表