单片机多字节加减乘除法程序

单片机字节加减乘除法程序
文章长度[6790]加入时间[2007-8-14]更新时间[2012-6-12 18:04:14]级别[0][评论]中国gps网
[收藏]
一种实用的单片机多字节除法算法
一种实用的单片机多字节除法算法在单片机的实际应用中,除法运算是比较常见的一种运算。
以MCS-51单片机为例,虽然它提供了除法指令,但只能进行单字节除以单字节
的运算,如果要进行多字节的除法运算,就得自己设计算法。目前,许多资料上
都介绍了四字节除以二字节的算法,但它们主要有以下几点不足:
1.只能求出商,不能求出余数;
2.在被除数高二位大于除数时,不能进行运算;
3.商只有两个字节。例如,被除数是0FFFFFFFFH,除数是0004H时,商数
应该是3FFFFFFFH,余数是0003H。
但是,用以前的算法是无法进行运算的。在实际运用中,参与运算的数是任意
的,有时需要求出余数,有时商数要求有四个字节,因此,以前的算法在实际应
用中受到了很大的限制。为了满足实际运用中的需要,我设计了一套新的四字
节除以二字节的算法,克服了上述算法中的缺点,可以适合广泛的实际需要。下
面以MCS-51汇编语言为例进行说明。该算法增加了两字节的余数单元,并把
被除数单元用来存放商数。运算时,首先判断除数是否为零,若为零时,则设溢
出标志为1,然后退出。若除数不为零,则采用移位相减法进行运算。
首先,把进位位和余数单元清零。再将进位位、余数单元和被除数单元按顺序首
尾相连,逐位进行向左循环移位(如图示),共移位32次。每移位一次,余数单元
都  C (H L)(HH HL LH LL) 进位位余数单元被除数单元和除数作一
次减法运算,若够减,余数单元内容更新为两者之差,并且将被除数最末一位置
为1;若不够减,则余数单元内容保持不变,且将被除数最末一位置为0。判断是
否够减的方法是:在作减法之前,先保存进位位,再看作完减法后的进位位。仅在作减法之前进位位为0,并且作减法之后进位位为1时判为不够减,其余情况均视为够减。这样,等到全部运算结束时,商数为四个字节,存放在被除数单元中;余数为两个字节,存放在余数单元中。
例如,被除数是0FFFFFFFFH,除数是0004H时,运行新的算法,商数是3FFFFFFFH,存放在被除数单元中,余数是0003H,存放在余数单元中。这个算法自然、流畅,运算结果商数为四个字节,余数为两个字节,尤其是在求除以某数的N次方时,只需连续调用N次该算法子程序就可以了,省去了繁琐的数据转存语句。该算法还可以依实际需要扩充为位数更高的多字节除数算法,也可以移植到其它的单片机平台上。
本算法已在AT89C51单片机上调试通过。下面给出算法的程序代码清单。
divdll data 20h ;定义被除数单元
divdlh data 21h
divdhl data 22h
dlvdhh data 23h
divl data 24h ;定义除数单元
divh data 25h
templ data 26h ;定义余数单元
temph data 27h
divd: push acc
push b
mov a,divdh ;判除数是否为零
orl a,divl
jnz divd0
setb ov ;除数为零,置溢出标志
pop b
pop acc
ret
divd0: mov templ,#00h ;除数不为零,进行运算
mov b,#20h ;置循环次数
divd1:clr c ;进位位、余数单元和mov a,divdll ;被除数单元全体逐个rlc a ;向左循环移位
mov divdll,a
mov a,divdlh
rlc a
mov divdlh,a
mov a,divdhl
rlc a
mov divdhl,a
mov a,divdhh
rlc a
mov divdhh,a
mov a,templ
rlc a
mov templ,a
xch a,temph
rlc a
xch a,temph
mov f0,c ;保存进位位
clr c
t5荧光灯subb a,divl ;用余数减去除数
mov r7,a
mov a,temph
subb a,divh
anl c,/f0 ;判断是否够减
jc divd2 ;不够减,移下一位
mov templ,r7 ;够减,刷新余数单元
inc divdll ;商上1
divd2: djnz b,divd1
clr ov
pop b
pop acc
王永炎简介ret
end
真正实用的任意字节加减乘除子程序
大家都用C估计它的作用已不大了。这是本人初学单片机时从一种自己熟悉的产品反汇编出来的,本人还据此做了一套用于EMC单片机的子程序(不舍得贴)。
这套程序的作者是在用手工编译再敲进仿真机的年代做出来的,估计新一辈的单片机工程师没有几个会这么认真的去做一段代码。
这套程序通用性极强,用它做四则混算方便程度跟C有得一比,但代码比用C 的短多了,本程序缺点执行时间长了点,不太适合做较高速的实时运算。
除法子程序的算法原理跟楼主的是一个样的。
产权比率
;===================================================
;乘法子程序: ;
;R3放被乘数起始地址,R4放乘数起始地址;积放入R7所指向RAM中,R5表示相乘位数, 高位表示R3位数,低位表示R4位数;地址高存放高位;
mov r3,#dbuf03 ;
mov r4,#dbuf06 ;
mov r7,#dbuf08 ;
lcall mulstart
MULSTART: MOV A,R5 ;存放乘积地址清零ANL A,#0F0H ;
SWAP A ;
MOV R6,A ;R6:表示R3位数,
ANL 05H,#0FH ;R5:表示R4位数
ADD A,R5 ; MOV R2,A ;R2:乘积位数, MOV 00H,R7 ;
CLR A ;谢尔宾斯基
PRODCLR: MOV @R0,A ;
INC R0 ;
DJNZ R2,PRODCLR ;
MULLOOP: MOV 00H,R7 ;
MOV 02H,R6 ;
MOV 01H,R4 ;
MOV A,@R1 ;
JZ MULLOOP4 ;
MULLOOP1: MOV 01H,R3 ;
MOV A,@R1 ;
JZ MULLOOP5 ;
MOV 01H,R4 ;
MOV B,@R1 ;
MUL AB ;
ADD A,@R0 ;
MOV @R0,A ;
MOV A,B ;
INC R0 ;
激光笔ADDC A,@R0 ;
MOV @R0,A ;
JNC MULLOOP3 ;
MOV 01H,R0 ;
MULLOOP2:
INC R1 ;
CLR A ;
ADDC A,@R1 ;
MOV @R1,A ;
JC MULLOOP2 ;
MULLOOP3: INC R3 ;
DJNZ R2,MULLOOP1 ;
MOV A,R3 ;
SUBB A,R6 ;
MOV R3,A ;
MULLOOP4: INC R4 ;
INC R7 ;
DJNZ R5,MULLOOP ;
RET ;
MULLOOP5: INC R0 ;
SJMP MULLOOP3 ;
;============================================
;除法子程序: ;R3:存放被除数指针,R4:存放除数指针;商放入R3所指向RAM 中,余数放入以DB
UF10开始的连续RAM中,R5表示相乘位数, 高位表示被除数位数,低位表示除数位数. ;地址高存放高位;
MOV R3,#DBUF08 ;
MOV R4,#DBUF06 ;
MOV R5,#42H ;
LCALL DIVSTART

本文发布于:2024-09-21 04:38:44,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/683588.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:算法   字节   单元   运算   单片机
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议