AVR乘除法子程序.doc
《AVR乘除法子程序.doc》由会员分享,可在线阅读,更多相关《AVR乘除法子程序.doc(38页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、优质文本AVR乘除法子程序;* A P P L I C A T I O N N O T E A V R 2 0 0 * ;* ;* Title:Multiply and Divide Routines ;* Version:1.1 ;* Last updated:97.07.04 ;* Target:AT90Sxxxx (All AVR Devices) ;* ;* Support E-mail: ;* ;* DESCRIPTION ;* This Application Note lists subroutines for the following ;* Muliply/Divide ap
2、plications. Routines are straight-line implementations ;* optimized for speed: ;* ;* 8 x 8 = 16 bit unsigned ;* 16 x 8 = 32 bit unsigned ;* 16 x 16 = 32 bit unsigned ;* 8 / 8 = 8 + 8 bit unsigned ;* 16 / 16 = 16 + 16 bit unsigned ;* ;* .include 1200def.inc rjmpRESET;reset handle ;* ;* ;* mpy8u - 8x8
3、 Bit Unsigned Multiplication ;* ;* Number of cycles:65 ;* Low registers used:None ;* High registers used :3 (mc8u,mp8u/m8uL,m8uH) ;* ;* Note: Result Low byte and the multiplier share the same register. ;* This causes the multiplier to be overwritten by the result. ;* ;* ;* Subroutine Register Variab
4、les .defmc8u=r16;multiplicand .defmp8u=r17;multiplier .defm8uL=r17;result Low byte .defm8uH=r18;result High byte .defcycle=r31;* Code mpy8u: ldi cycle,8clrm8uH;clear result High byte lsrmp8u;shift multiplier m8u: brccnoad80;if carry set addm8uH,mc8u; add multiplicand to result High byte noad80:rorm8
5、uH;shift right result High byte rorm8uL;rotate right result L byte and multiplier dec cyclebrne m8uret ;* ;* 2字节乘法子程序 ;-16bit*16bit- aH.aL * bH.bL = result3.2.1.0 -;-或-16bit*8bit- aH.aL * bL = Result3.2.1 -;*.defaL=r16;multiplicand low byte /被乘数.defaH=r17;multiplicand high byte .defbL=r18;multiplier
6、 low byte /乘数.defbH=r19;multiplier high byte .defresult0=r18;result byte 0 (LSB) .defresult1=r19;result byte 1 .defresult2=r20;result byte 2 .defresult3=r21;result byte 3 (MSB) .defcycle=r31;* Code m16_8u: ldi cycle,8ldi R19,0rjmp mBeginm16_16u:ldi cycle,16mBegin:clrresult3;clear 2 highest bytes of
7、result clrresult2 lsrbH;乘数/2rorbL;C-Rd.0 Rd.0-Rd.1 Rd.15-0m16_16u1:brccnoadd;假设Rd.0=1/(if carry set)addresult2,aL; 被乘数低字节加到结果的2字节 adcresult3,aH; 被乘数高字节加到结果的3字节noadd:rorresult3;shift right result byte 3 rorresult2;rotate right result byte 2 rorresult1;rotate result byte 1 and multiplier High rorresul
8、t0;rotate result byte 0 and multiplier Low dec cyclebrne m16_16u1ret ;* ;* ;* div8u - 8/8 Bit Unsigned Division ;* ;* This subroutine divides the two register variables dd8u (dividend) and ;* dv8u (divisor). The result is placed in dres8u and the remainder in ;* drem8u. ;* ;* Number of words:94 + re
9、turn;* Low registers used:1 (drem8u) ;* High registers used :2 (dres8u/dd8u,dv8u,cycle) ;* ;* ;* Subroutine Register Variables .defdrem8u=r15;remainder .defdres8u=r16;result .defdd8u=r16;dividend .defdv8u=r17;divisor .defcycle=r18;* Code * R16/R17=R16+R15 *div8u:clrdrem8u;clear remainder and carry l
10、di cycle,9;8+1d8u_0: roldd8u;shift left dividenddec cyclebreqd8u_2roldrem8u;shift dividend into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_1;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_0;else d8u_1:sec; set carry to be
11、 shifted into resultrjmpd8u_0d8u_2:ret ;* ;* ;* div8u - 8/8 Bit Unsigned Division ;* ;* This subroutine divides the two register variables dd8u (dividend) and ;* dv8u (divisor). The result is placed in dres8u and the remainder in ;* drem8u. ;* ;* Number of words:66 + return ;* Number of cycles:50/58
12、/66 (Min/Avg/Max) + return ;* Low registers used:1 (drem8u) ;* High registers used :2 (dres8u/dd8u,dv8u) ;* ;* ;* Subroutine Register Variables .defdrem8u=r15;remainder .defdres8u=r16;result .defdd8u=r16;dividend .defdv8u=r17;divisor ;* Code div8u:subdrem8u,drem8u;clear remainder and carry roldd8u;s
13、hift left dividend roldrem8u;shift dividend into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_1;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_2;else d8u_1:sec; set carry to be shifted into result d8u_2:roldd8u;shift left d
14、ividend roldrem8u;shift dividend into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_3;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_4;else d8u_3:sec; set carry to be shifted into result d8u_4:roldd8u;shift left dividend rol
15、drem8u;shift dividend into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_5;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_6;else d8u_5:sec; set carry to be shifted into result d8u_6:roldd8u;shift left dividend roldrem8u;shif
16、t dividend into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_7;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_8;else d8u_7:sec; set carry to be shifted into result d8u_8:roldd8u;shift left dividend roldrem8u;shift dividend
17、into remainder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_9;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_10;else d8u_9:sec; set carry to be shifted into result d8u_10:roldd8u;shift left dividend roldrem8u;shift dividend into rema
18、inder subdrem8u,dv8u;remainder = remainder - divisor brccd8u_11;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_12;else d8u_11:sec; set carry to be shifted into result d8u_12:roldd8u;shift left dividend roldrem8u;shift dividend into remainder s
19、ubdrem8u,dv8u;remainder = remainder - divisor brccd8u_13;if result negative adddrem8u,dv8u; restore remainder clc; clear carry to be shifted into result rjmpd8u_14;else d8u_13:sec; set carry to be shifted into result d8u_14:roldd8u;shift left dividend roldrem8u;shift dividend into remainder subdrem8
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 乘除 法子 程序
限制150内