ImageVerifierCode 换一换
格式:DOCX , 页数:49 ,大小:30.27KB ,
资源ID:8390243      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8390243.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AVR汇编百例浮点程序库.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AVR汇编百例浮点程序库.docx

1、AVR汇编百例 浮点程序库 ;范例62 .ORG $A00 EXCH: MOV R5,R8 ;两浮点数交换子程序 MOV R8,R12 MOV R12,R5EXCH1: MOV R5,R9 ;尾数交换 MOV R9,R13 MOV R13,R5 MOV R5,R10 ;双字节交换 MOV R10,R14 MOV R14,R5 MOV R5,R11 MOV R11,R15 MOV R15,R5 RETDP: ANDI R16,$7F ;处理积/商数符,计算积/商阶码子程序 SBRC R9,7 SUBI R16,$80 SBRC R13,7 SUBI R16,$80 ;积/商符号放在r16,7 A

2、DD R12,R8 ;移码相加(除数阶码已求补) LDI R17,$80 BRCC DP1 ADD R12,R17 ;移码求和有进位,将和再加上$80,再有进位为溢出 RETDP1: SUB R12,R17 ;移码求和无进位,将和减去$80,有借位 RET ;或差为0也为溢出NEG3: COM R15 ;3字节数据求补 COM R14 ;先求反后加1 COM R13INC3: LDI R17,255 SUB R15,R17 ;以减去-1代替加1 SBC R14,R17 SBC R13,R17 RET;范例63 ;浮点数比较大小子程序 X1为被减数 X2为减数FPCP: SBRC R9,7 ;X

3、1为正,跳行 RJMP CP1 SBRC R13,7 ;X2为正,跳行 RJMP CP2 ;X1,X2异号FPCP1: CP R11,R15 ;X1,X2皆为正,以尾数低位字节,中位字节,高位字节和 CPC R10,R14 ;阶码的顺序(按无符号数)进行比较 CPC R9,R13 ;不等,阶码大者浮点数值也大;只有阶码和尾数对应相等, CPC R8,R12 ;两浮点数才相等 RET ;比较结果:Z=1时X1=X2,否则C=0时X1X2,C=1时X1X2,C=1时X124,取被加数为和NX2A: LSR R13 ROR R14 ROR R15 DEC R17 BRNE NX2A ;加数阶小,右移

4、加数对阶 MOV R12,R8 ;取被加数阶为和之阶 BRCC GOON RCALL INC3 ;舍入移出位 RJMP GOONNX3: CPI R17,24 BRCC COM1 ;阶差24,取加数为和LOOP: LSR R9 ROR R10 ROR R11 DEC R17 BRNE LOOP ;加数阶大,右移被加数对阶 BRCC GOON RCALL INC3A ;舍入移出位GOON: SBRC R16,6 SUBI R16,$80 SBRS R16,7 ;判别两数是否同号 RJMP SAMS ;同号转 SUB R15,R11 ;异号,执行减法,加数为被减数 SBC R14,R10 SBC

5、R13,R9 BRCC NOM ;够减转 SUBI R16,$40 ;否则被减数数符求反为和之数符 RCALL NEG3 ;并将差求补NOM: MOV R17,R13 OR R17,R14 OR R17,R15 BREQ DON0 ;差为0转NMLOP: SBRC R13,7 RJMP COM1 LSL R15 ROL R14 ROL R13 DEC R12 BRNE NMLOP ;规格化OV1: SEV ;阶码变为0,下溢(可取为0,不算溢出) RETSAMS: ADD R15,R11 ADC R14,R10 ADC R13,R9 ;两数同号,执行加法 BRCC COM1 ROR R13 R

6、OR R14 ROR R15 INC R12 ;有进位时右规1次($7F+1=$80溢出) BREQ OV1 ;阶码增1后变为0为上溢 BRNC COM1 RCALL INC3COM1: CLV SBRC R16,6 RETCOMA: LDI R17,$7F AND R13,R17 ;正数数符为0DON: RETEXAD: RCALL SAV0 ;取被加数为和 SBRS R16,7 RJMP COMA ;配置数符 RETDON0: CLR R12 ;浮点数为0 RET;范例65 ;浮点乘法子程序FPMU: TST R8 BREQ M0 ;被乘数为0,积为0 TST R12 BRNE M1 ;乘

7、数为0,积也为0M0: RJMP G0 M1: RCALL DP ;处理积符号,计算积之阶码 BRCS OV2 BREQ OV2 ;判断溢出 LDI R17,$80 OR R9,R17 OR R13,R17 ;恢复尾数最高位 MOV R5,R13 MOV R6,R14 MOV R7,R15 ;乘数转入R5,R6,R7 LDI R17,25 ;设右移部分积次数 CLR R13 CLR R14 CLR R15 ;r13r14r15清除,存放积 CLCLOOP1: BRCC M2 ADD R15,R11 ADC R14,R10 ADC R13,R9 ;乘数右移移出位为1,被乘数加入部分积1次M2:

8、ROR R13 ROR R14 ROR R15 ROR R5 ROR R6 ROR R7 ;部分积连同乘数右移1位 DEC R17 BRNE LOOP1 ;尾数相乘计算完成? SBRC R13,7 RJMP M3 ;乘积最高位为1 转 ROL R5 ROL R15 ROL R14 ROL R13 ;乘积最高位为0,高4位字节左移1位 SBRS R5,7 RJMP M5 RCALL INC3 ;末位字节舍入 BRNE M5 SEC ;舍入后R13变为0 ROR R13 ;将其改为$80(即0.5) RJMP COM2M5: DEC R12 ;舍入后R13不为0 BRNE COM2 ;阶码减1OV

9、2: SEV ;变为0为溢出 RETM3: SBRC R5,7 RCALL INC3 ;乘积低3位字节舍入COM2: LDI R17,$7F SBRS R16,7 AND R13,R17 ;正数将符号位请除DON2: CLV RET;范例66FPDI: TST R12 ;浮点除法子程序 BREQ OV3 ;除数为0,溢出 TST R8 BRNE D1 RJMP G0 ;被除数为0,商为0D1: NEG R12 ;除数阶码求补,以加补码代替减原码 RCALL DP ;处理商符号,计算商之阶码 BRCS OV3 BREQ OV3 ;判断溢出 LDI R17,$80 OR R9,R17 OR R13

10、,R17 ;恢复尾数最高位FPD3: LDI R17,25 ;左移相减试商25次,最后1次舍入 SUB R11,R15 SBC R10,R14 SBC R9,R13 BRCS D2 ;第一次尾数相减试商 INC R12 ;够减,商阶增1 SEC BRNE D3 ;商阶增1后不为0,转计商;否则为溢出OV3: SEV RETD2: ADD R11,R15 ADC R10,R14 ADC R9,R13 ;不够减则恢复被除数LOOP2: LSL R11 ROL R10 ROL R9 ;被除数算术左移 BRCS D4 ;进位位为1,够减,本位商1 SUB R11,R15 SBC R10,R14 SBC

11、 R9,R13 ;否则相减试商 BRCS D2A SEC RJMP D3 ;够减,本位商1D2A: ADD R11,R15 ;不够减,恢复被除数 ADC R10,R14 ADC R9,R13 CLC ;本位商0 RJMP D3D4: SUB R11,R15 SBC R10,R14 SBC R9,R13 ;被除数减去除数D3: DEC R17 BRNE D5 ;除法未完成,循环(1-1=0,不溢出) MOV R13,R5 MOV R14,R6 MOV R15,R7 ;取回商 BRCC COM3 RCALL INC3 ;第25位商舍入($800000-$FFFFFF不溢出,故INC3不会溢出!)C

12、OM3: LDI R17,$7F SBRS R16,7 AND R13,R17 ;配置商数符DON3: RETD5: ROL R7 ;在R5,R6,R7中记商(不必预先清除) ROL R6 ROL R5 ;商数左移1位并记商RJMP LOOP2;范例67FPSQ: ANDI R16,$7F ;模拟手算开平方子程序 SBRC R13,7 ORI R16,$80 ;负数 建虚根标志FPS0: TST R12 BREQ DON4 ;0的平方根为0 LDI R17,$80 OR R13,R17 ;恢复尾数最高位 LSR R12 ;阶码算术右移1位 BRCC FSQ2 INC R12 ;移出位舍入 RC

13、ALL INC3 ;先将位数增1(提前舍入) BRCS FSQ1 ;C=1,不够减 SEC ROR R13 ;若尾数变为0将其改为0.5($80-r13) RJMP FSQ2FSQ1: LSR R13 ROR R14 ROR R15 ;否则将为数算术右移FSQ2: LDI R17,25 ;开出25位根,末位舍入 MOV R8,R17 LDI R17,$40 ADD R12,R17 ;根恢复为移码 CLR R5 CLR R6 CLR R7 ;根扩展区清除 CLR R9 CLR R10 CLR R11 ;根存储区清除FSQ3: SUB R13,R17 SBC R7,R11 SBC R6,R10 S

14、BC R5,R9 ;试根 BRCS FSQ3A SEC RJMP FSQ4 ;够减,本位根1FSQ3A: ADD R13,R17 ADC R7,R11 ADC R6,R10 ADC R5,R9 ;否则恢复开平方数之尾数 CLC ;本位商0 FSQ4: DEC R8 BRNE FSQ5 ;开出第25位根?FQDON: MOV R13,R9 MOV R14,R10 MOV R15,R11 ;回送根尾数 BRCC COM4 RCALL INC3 ;第25位根舍入COM4: LDI R17,$7F AND R13,R17 ;根尾数为正数DON4: RETFSQ5: ROL R11 ROL R10 RO

15、L R9 ;根尾数带进位左移,记根 LSL R15 ROL R14 ROL R13 ROL R7 ROL R6 ROL R5 LSL R15 ROL R14 ROL R13 ROL R7 ROL R6 ROL R5 ;开平方数之尾数连同扩展区左移2位 BRCC FSQ3 ;未产生进位,循环 RJMP FQDON ;否则进位为第25位根(不须试,并结束子程序)!;范例68 ;牛顿迭代开平方子程序FSQR: TST R12 BREQ SQRT ;0的平方根为0 ANDI R16,$7E SBRC R13,7 ORI R16,$80 ;虚根标志 SBRC R12,0 INC R16 ;阶码为奇数 L

16、DI R17,$7F AND R13,R17 ;尾数变为正数 LSR R12 LDI R17,$40 ADC R12,R17 ;得到根之移码 PUSH R12 ;暂存 LDI R17,$80 MOV R12,R17 SBRC R16,0 INC R12 ;得到X1的阶码(0.5X12) RCALL LD1 ;存 X1 LSR R13 ROR R14 ROR R15 LDI R17,$40 SBRS R16,0 ;阶码为奇数时算术右移尾数即得到X1之尾数;否则将其最 ;高位字节加上$40 OR R13,R17 ;得到首次根r0=(1+x1)/2 LDI R17,3 MOV R0,R17 ;迭代3

17、次FSQLP: RCALL LD2 RCALL GET1 RCALL FPDI RCALL GET2 RCALL FPAD DEC R12 ;计算r(i+1)=(x1/ri+ri)/2 DEC R0 BRNE FSQLP ;r3的尾数为根之尾数 POP R12 ;取回根之阶码SQRT: RET ;r16,7=1 为虚数根;范例69 ;基本运算程序的演示程序 DMST1: .EQU SPL=$3D .EQU SPH=$3E LDI R16,2 ;high(ramend) OUT SPH,R16 LDI R16,$5F ;low(ramend) OUT SPL,R16 LDS R11,$60 ;r

18、11,7:数符 r11,6 :阶符 r11,5-0:阶(最大为38) LDS R12,$61 ;r12-r15:尾数 LDS R13,$62 LDS R14,$63 LDS R15,$64 ;尾数共8位BCD码 RCALL DTOB ;转为二进制浮点数 RCALL LD2 ;暂存 LDS R11,$65 ;r11,7:数符 r11,阶符 r11,5-0:阶(最大为38) LDS R12,$66 ;r12-r15:尾数 LDS R13,$67 LDS R14,$68 LDS R15,$69 RCALL DTOB ;转为二进制浮点数 RCALL GET2 ;取第一操作数 RCALL FPAD ;调

19、基本运算子程序之一(FPSU/FPMU/FPDI) RCALL BTOD ;转回十进制浮点数DMRET: RJMP DMRET;范例70 ;辅助子程序KP2: MOV R8,R12 ;复制第二操作数 MOV R9,R13 MOV R10,R14 MOV R11,R15 RETLD1: STS $70,R12 ;存浮点数 STS $71,R13 STS $72,R14 SYS $73,R15 RETLD2: STS $74,R12 ;存浮点数 STS $75,R13 STS $76,R14 STS $77,R15 RETLD3: STS $78,R12 ;存浮点数 STS $79,R13 STS

20、 $7A,R14 STS $7B,R15 RETGET1: LDS R8,$70 ;取浮点数 LDS R9,$71 LDS R10,$72 LDS R11,$73 RETGET2: LDS R8,$74 ;取浮点数 LDS R9,$75 LDS R10,$76 LDS R11,$77 RETGET3: LDS R8,$78 ;取浮点数 LDS R9,$79 LDS R10,$7A LDS R11,$7B RETINVPI: LDI R17,$86 ;取浮点数180/ MOV R8,R17 LDI R17,$65 MOV R9,R17 LDI R17,$2E MOV R10,R17 LDI R1

21、7,$E1 MOV R11,R17 RETG90: LDI R17,$87 ;取浮点数90 MOV R8,R17 LDI R17,$34 MOV R9,R17 CLR R10 CLR R11 RETDTOR: RCALL PI18 ;角度化为弧度 RJMP FPMURTOD: RCALL INVPI ;弧度化为角度 RJMP FPMUGHPI: LDI R17,$81 ;取浮点数/2 MOV R8,R17 LDI R17,$49 MOV R9,R17 LDI R17,$0f MOV R10,R17 LDI R17,$DB MOV R11,R17 RETG01: LDI R17,$7D ;取浮点

22、数0.1 MOV R8,R17 LDI R17,$4C MOV R9,R17 LDI R17,$CC MOV R10,R17 LDI R17,$CD MOV R11,R17 RETG1: LDI R17,$81 ;取浮点数1 MOV R8,R17 CLR R9 CLR R10 CLR R11 RETPI18: LDI R17,$7B ;取浮点数/180 MOV R8,R17 LDI R17,$0E MOV R9,R17 LDI R17,$FA MOV R10,R17 LDI R17,$35 MOV R11,R17 RETGINT: LDI R17,R12 ;浮点数取整 CPI R17,$81

23、BRCC GINT1 RCALL G0 ;阶码$97,溢出 RCALL BRK ;分解出整数部分(在R9 R10 R11) SBRS R16,1 RET ;正数返回NEG3A: COM R11 ;负数求(r9 r10 r11)之补 COM R10 COM R9INC3A: LDI R17,255 SUBI R11,R17 SBCI R10,R17 SBCI R9,R17 ;求反后加1 RETGOVER: ORI R16,$20 ;设整数部分超过23位标志 RETBRK: ANDI R16,$DF ;将正浮点数分解为整数/小数两部分 LDI R17,$80 OR R13,R17 ;恢复尾数最高位

24、 CLR R9 CLR R10 CLR R11 MOV R17,R12 SUBI R17,$80 BREQ BRKRT BRCS LOOPT CPI R17,$19 ;整数部分超过24位 BRCC GOVER ;为溢出LOOP4: LSL R15 ROL R14 ROL R13 ROL R11 ROL R10 ROL R9 DEC R17 BRNE LOOPT ;左移位数为阶码-$80,整数部分进入r9-r11中BRKRT: RETLOOPT: LSR R13 ;只有小数部分右移尾数($80-阶码)位 ROR R14 ROR R15 INC R17 BRNE LOOPT RETNRML: AN

25、DI R16,$BF ;1字节正整数(在R13中)规格化为浮点数 CLR R14 CLR R15 LDI R12,$88 ;设阶码 RJMP NMLOPG10: LDI R17,$84 ;取浮点数10 MOV R8,R17 LDI R17,$20 MOV R9,R17 CLR R10 CLR R11 RETGLN2: LDI R17,$80 ;取浮点数ln2(=0.6931471806) MOV R8,R17 LDI R17,$31 MOV R9,R17 LDI R17,$72 MOV R10,R17 LDI R17,$18 MOV R11,R17 RETGLN10: LDI R17,$82

26、;取浮点数ln10(=2.302585093) MOV R8,R17 LDI R17,$13 MOV R9,R17 LDI R17,$5D MOV R10,R17 LDI R17,$8E MOV R11,R17 RETINVX: TST R12 ;计算1/X, X=0时溢出 BRNE INVOV4: SEV RETINV: RCALL G1 ;取1 RJMP FPDI ;范例71 ;用荷纳法计算多项式值子程序FPLN1: ORI R16,$10 ;设计算奇函数(lnx,sinx,arcsinx 等)标志 RCALL LD3 ;存X RCALL KP2 RCALL FPMU ;计算X2 RJMP FLN0 ; FPLN2: ANDI R16,$EF ;设计算偶函数(EXP,COSX等)标志 FLN0: RCALL LD1 ;存T,T=X 或T=X2 POP R30 POP R31 ;系数表数据地址进入Z LSL R30 ROL R31 ;由按字取数变为按字节取数 LPM ;r0-(z)取阶码 MOV R8,R0 ADIW R30,1 ;指针增1 LPM ;取尾数高位字节 MOV R9,R0 ADIW R30,1 ;z+1 LPM ;取尾数中

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1