一个精巧的两字节除法子程序
条件: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,其它位在运算时要使用,但取结果时必须屏蔽掉。
|
|
文章评论(0条评论)
登录后参与讨论