资源描述:
《mcs-51单片机实用子程序库2》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、MCS-51单片机实用子程序库(二)(11)标号:DIVS功能:双字节二进制有符号数除法(补码)入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。出口信息:OV=0时商在R2、R3中,OV=1时溢出。影响资源:PSW、A、B、R1~R7堆栈需求:5字节DIVS:LCALLMDS;计算结果的符号和两个操作数的绝对值PUSHPSW;保存结果的符号LCALLDIVD;计算两个绝对值的商JNBOV,DVS1;溢出否?POPACC;溢出,放去结果的符号,保留溢出标志RETDVS1:POPPSW;未溢出,取出结果的符号MOVR4,#0MOV
2、R5,#0MDSE:JBF0,MDS2;用补码表示结果CLROV;结果为正,原码即补码,计算成功RETMDS:CLRF0;结果符号初始化MOVA,R6;判断第二操作数的符号JNBACC.7,MDS1;为正,不必处理CPLF0;为负,结果符号取反XCHA,R7;第二操作数取补,得到其绝对值CPLAADDA,#1XCHA,R7CPLAADDCA,#0MOVR6,AMDS1:MOVA,R2;判断第一操作数或运算结果的符号JNBACC.7,MDS3;为正,不必处理CPLF0;为负,结果符号取反MDS2:MOVA,R5;求第一操作数的绝对值或运算结果的
3、补码CPLAADDA,#1MOVR5,AMOVA,R4CPLAADDCA,#0MOVR4,AMOVA,R3CPLAADDCA,#0MOVR3,AMOVA,R2CPLAADDCA,#0MOVR2,AMDS3:CLROV;运算成功RET (12)标号:SH2功能:双字节二进制无符号数开平方(快速)入口条件:被开方数在R2、R3中。出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。影响资源:PSW、A、B、R2~R7堆栈需求:2字节SH2:MOVA,R2ORLA,R3JNZSH20RET;被开方数为零,不必运算SH20:MO
4、VR7,#0;左规次数初始化MOVA,R2SH22:ANLA,#0C0H;被开方数高字节小于40H否?JNZSQRH;不小于40H,左规格化完成,转开方过程CLRC;每左规一次,被开方数左移两位MOVA,R3RLCAMOVF0,CCLRCRLCAMOVR3,AMOVA,R2MOVACC.7,CMOVC,F0RLCARLCAMOVR2,AINCR7;左规次数加一SJMPSH22;继续左规 (13)标号:SH4功能:四字节二进制无符号数开平方(快速)入口条件:被开方数在R2、R3、R4、R5中。出口信息:平方根在R2、R3中,整数部分的位数为原数
5、的一半,其余为小数。影响资源:PSW、A、B、R2~R7堆栈需求:2字节SH4:MOVA,R2ORLA,R3ORLA,R4ORLA,R5JNZSH40RET;被开方数为零,不必运算SH40:MOVR7,#0;左规次数初始化MOVA,R2SH41:ANLA,#0C0H;被开方数高字节小于40H否?JNZSQRH;不小于40H,左规格化完成MOVR6,#2;每左规一次,被开方数左移两位SH42:CLRC;被开方数左移一位MOVA,R5RLCAMOVR5,AMOVA,R4RLCAMOVR4,AMOVA,R3RLCAMOVR3,AMOVA,R2RLC
6、AMOVR2,ADJNZR6,SH42;被开方数左移完两位INCR7;左规次数加一SJMPSH41;继续左规SQRH:MOVA,R2;规格化后高字节按折线法分为三个区间ADDA,#57HJCSQR2ADDA,#45HJCSQR1ADDA,#24HMOVB,#0E3H;第一区间的斜率MOVR4,#80H;第一区间的平方根基数SJMPSQR3SQR1:MOVB,#0B2H;第二区间的斜率MOVR4,#0A0H;第二区间的平方根基数SJMPSQR3SQR2:MOVB,#8DH;第三区间的斜率MOVR4,#0D0H;第三区间的平方根基数SQR3:MU
7、LAB;与区间基点的偏移量乘区间斜率MOVA,BADDA,R4;累加到平方根的基数上MOVR4,AMOVB,AMULAB;求当前平方根的幂XCHA,R3;求偏移量(存放在R2R3中)CLRCSUBBA,R3MOVR3,AMOVA,R2SUBBA,BMOVR2,ASQR4:SETBC;用减奇数法校正一个字节的平方根MOVA,R4;当前平方根的两倍加一存入R5R6中RLCAMOVR6,ACLRARLCAMOVR5,AMOVA,R3;偏移量小于该奇数否?SUBBA,R6MOVB,AMOVA,R2SUBBA,R5JCSQR5;小于,校正结束,已达到一
8、个字节的精度INCR4;不小于,平方根加一MOVR2,A;保存新的偏移量MOVR3,BSJMPSQR4;继续校正SQR5:MOVA,R4;将一个字节精度的根存入R2