原创 一个精巧的两字节除法子程序

2008-10-19 17:35 3240 3 3 分类: MCU/ 嵌入式
天雨粟 发表于 2008-10-19 14:59 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 一个精巧的两字节除法子程序


一个精巧的两字节除法子程序

条件:8个unsigned char型数据相加,高位在R2中,低位在R3中
出口:将此数除以8,余数四舍五入

MOV    A,R2        ;(R2,R3)/8
SWAP    A
RL    A
XCH    A,R3
SWAP    A
RL    A
ADD    A,#80H        ;四舍五入
ANL    A,#1FH
ADDC    A,R3
RET                    ;结果在A中

下面是具体分析:由于被操作数是8个无符号字符型数据相加,固其高位(R2)里D3位及其以上必为0。
现在将其分为三部分别想办法:R2的低四位,R3的高四位,R3的低四位。

将R2的低四位换到高四位,相当于把低四位乘以16,左移一位,又相当于乘以2,则原数被乘以了32。R2的真实意义是(R2)*256,现在我们将其看作一个普通的单字节数,则相当于将其除以了256。先乘以32再除以256,则等于将原数除以8。

将R3的高四位移到低四位,完成除以16,左移一位,相当于乘以2,最终完成除以8。

R3的低四位,其中的D3位,其权值正好为8,通过左移,移到新数的D0位(形成商加1——D3=1时;或不加——D3=0时)。R3的D2~D0位是余数,如为4~7时要五入;如为0~3时要四舍。分析可知,当D2为1时,余数为4~7;D2为0时,余数为0~3。在对R3进行左移操作时,D2已移到最高位,现对移位的结果加#80H,D2为1时,必置位CY,通过ADDC指令加进位形成五入,否则四舍。
ANL A,#1FH,因为R3/8,商的有效位为D4~D0,其它位在运算时要使用,但取结果时必须屏蔽掉。


hotpower 发表于 2008-10-19 17:12 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

2楼: 不算“精巧”吧~~~俺这个要少3条语句~~~


;R2=00000YYY R3=xxxxxXXX
MOV  A,R3;xxxxxXXX
ADD  A,#4;XXX+4 四舍五入(CY)
ANL  A,#0F8H;xxxxx000
ADDC A,R2;xxxxxYYY+CY
SWAP A;xyyyxxxx
RL   A;yyyxxxxx
RET;结果在A中yyyxxxxx

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /3 下一条