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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

第五章 AVR单片机浮点数运算程序设计.docx

1、第五章 AVR单片机浮点数运算程序设计第五章 浮点数运算程序设计5.1 四字节浮点格式进行数值运算时,采用定点数运算往往不能满足要求。例短整数(8位带符号数)表示数的范围为-128+127;整数(16位带符号数)表示数的范围为-32768+32767;长整数(32位带符号数)表示数的范围为-231(231-1)。每增加或减少1个数字单位恒为1,这样在绝对值很小的时候,表示的数的精度就很低。为了满足数的范围和精度的要求,常采用浮点数的格式。二进制浮点数一般采用M2E的形式表示。其中M为尾数,是定点数(无符号数),为数符,E为指数。若用1位二进制数表示符号位,0为正,1为负; 24位二进制数表示尾

2、数 0.10000.1111 8位二进制数表示指数,取-125+128 则表示数的范围就可以扩大为(0.52-1251.02128)即(1.210-383.41038),精度为2-24即5.910-8。我们采用的IEEE提出的四字节浮点数标准,恰好能很好表示这个范围的浮点数,其格式为:最高位(第31位)为数符位,0为正,1为负;低23位(022位)为尾数,实际尾数为0.10000.1111第2330位这8位为阶码。由于指数取值范围为-125+128,可正可负,为简单起见,阶码采用指数的移码,阶码=指数+$7E。这样阶码恒为正。 阶码为0即浮点数为0(小于1.210-38);阶码为$78,指数为

3、$78-$7E=-6;阶码为$88,指数为$88-$7E=10;阶码为$FF,指数为$ff-$7E=$81超出四字节浮点数的表示范围,表示溢出(即绝对值大于3.4*1038)。为了方便理解该符点数的格式,下面举几个实际例子。例:十进制数1=0.5*21,数符为0;阶码为1+$7E=$7F;尾数0.5=0.1000b,去掉最高位1,000(23位);四字节浮点数为0011 1111 100b 即为$3F 80 00 00例:0.5=0.5*20,数符为0;阶码为$7E;尾数去掉最高位1为00000b(23位); 四字节浮点数为0011 1111 00000b 即为$3F 00 00 00。例:5

4、=101=0.101*23数符为1;阶码为3+$7E=$81;尾数去掉最高位1为01000b(23位);四字节浮点数为 1100 0000 1010 00000b 即为$C0 A0 00 00。5.2 四字节浮点运算子程序库AVR32FP.INC 该浮点运算子程序主要有最基本的数值计算(加、减、乘、除运算)和整数到浮点、浮点到整数的转换。该浮点运算子程序库占353个字。共使用寄存器16个并使用了SRAM五个字节。注意:调用加减乘除子程序前必须将Y寄存器置初值,使用的SRAM五个字节的地址为Y-5、Y-4、Y-3、Y-2、Y-1。且应使这五个字节与堆栈区和SRAM其它工作区不要重复。浮点运算子程

5、序库中包含以下八个子程序:INT2FP16位整数转换成四字节浮点数运算子程LONG2FP32位长整数转换成四字节浮点数运算子程FP2INT四字节浮点数转换成16位整数运算子程FP2LONG四字节浮点数转换成32位长整数运算子程ADD32F四字节浮点加法运算子程SUB32F四字节浮点减法运算子程DIV32F四字节浮点除法运算子程MPY32F四字节浮点乘法运算子程 由于这八个浮点子程序都是常用的。所以将这些子程序编写在一块,各有自己的入口,又有一些共同的程序段。这样编写可以节省程序存储单元,浮点程序库总共只占353个字,还不到AT90S8535内部Flash的十分之一,一般不至于影响存放用户程序。

6、以下简单介绍一下各浮点子程序的程序思想:1定点长整数(或整数)转换成浮点数:若为整数先将其转换成长整数(正数高16位添0,负数高16位添1);取出符号位及绝对值(正数绝对值不变,负数绝对值取补);将31位绝对值左移至最高位为1,其后23位数即为浮点数尾数(不足23位用0补足);浮点数的阶码为$9d减去左移次数。2浮点数取长整(或取整):先判断阶码是否小于$7f,若小于$7f则结果为0;再看阶码是否大于$9d(或$8d),若大于则溢出,正数取$7fffffff(或$7fff),负数取$80000000(或$8000);否则尾数最高位补1,右移24位尾数($96-阶码)次,即可求得尾数绝对值;取补

7、即得到长整数(或整数)。注:($96-阶码)为负时为低位补0次数。3浮点加减法运算:减法可对减数改变符号作加法运算;如一个加数为零或两数的阶码值相差大于尾数长度(24位),则可忽略较小的加数,之和取较大的加数;作加法运算前先对阶,小阶对大阶,较小的数尾数右移阶码之差次;尾数作加法运算;结果再浮点规格化,转化成24位尾数最高位刚好为1,化成规定浮点格式。 4浮点乘法运算:不需要对准小数点,只要把阶码相加,再减去$7e;尾数相乘;符号相异或;然后对结果进行必要的规格化。5浮点数除法运算:在执行浮点数除法时,应先调整被除数的阶码,使被除数的尾数小于除数的尾数(使商不大于1),然后把阶码相减,再加上$

8、7e;尾数相除;符号相异或。 一般浮点库使用者不必详细了解浮点子程的编写原理,只要求正确使用这些浮点子程,注意入口、出口、使用的寄存器(必要时这些寄存器应加以保护)和使用的内部SRAM地址(应使这些SRAM不作其他常期保留数据的空间和远离堆栈区)。浮点子程序库(AVR32FP.INC)清单:INT2FP16位整数转换成四字节浮点数运算子程入口: r17:r16; 出口:r19:r18:r17:r16使用的寄存器:r16,r17,r18,r19,r20,r26。LONG2FP32位长整数转换成四字节浮点数运算子程入口:r19:r18:r17:r16; 出口:r19:r18:r17:r16;使用的

9、寄存器:r16,r17,r18,r19,r20,r26。FP2INT四字节浮点数转换成16位整数运算子程入口: r19:r18:r17:r16 ;出口:r19:r18;使用的寄存器:r16,r17,r18,r19,r20,r26。FP2LONG四字节浮点数转换成32位长整数运算子程入口:r19:r18:r17:r16 ; 出口:r19:r18:r17:r16;使用的寄存器:r16,r17,r18,r19,r20,r26。ADD32F四字节浮点加法运算子程入口:r19:r18:r17:r16 + r24:r23:r22:r21; 出口:r19:r18:r17:r16;使用的寄存器:r16,r17

10、,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM:Y-5,Y-4,Y-3,Y-2,Y-1。SUB32F四字节浮点减法运算子程入口:r19:r18:r17:r16 - r24:r23:r22:r21; 出口:r19:r18:r17:r16;使用的寄存器:r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM:Y-5,Y-4,Y-3,Y-2,Y-1。DIV32F四字节浮点除法运算子程入口:r19:r18:r17:r16 / r24:r23:r22:r21; 出口:r19:r18:

11、r17:r16;使用的寄存器:r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM: Y-1。MPY32F四字节浮点乘法运算子程入口:r19:r18:r17:r16 / r24:r23:r22:r21;出口:r19:r18:r17:r16;使用的寄存器:r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM: Y-1。INT2FP: ; 16位整数转换成四字节浮点数运算子程 CLR R18 SBRC R17,7 ; R

12、17:R16为待转换的整数 COM R18 CLR R19 ; 16位整数按数符位扩展成32位长整数 SBRC R18,7 ; 为正,R19,R18清零 COM R19 ; 为负,R19,R18置为$FFFFLONG2FP: ; 32位长整数转换成四字节浮点数运算子程 CLR R20 ; 清符号位R20 AND R19,R19 ; 先判+/- BRPL LONG2FP_1 ; 为正,跳至LONG2FP_1 RCALL QUBU ; 为负,调QUBU子程取补 COM R20 ; 符号位R20取反 LONG2FP_1: MOV R26,R16 ; 再判R19:R18:R17:R16是否全零 OR

13、R26,R17 OR R26,R18 OR R26,R19 BRNE LONG2FP_2 ; 不为零跳至LONG2FP_2 RJMP JGW0 ; 为零跳至JGW0结果为零LONG2FP_2: LDI R26,$16 ; 令R26 = 22 RJMP LONG2FP_4 LONG2FP_3: INC R26 LSR R19 ROR R18 ROR R17 ROR R16LONG2FP_4: AND R19,R19 ; 判高位是否为零 BRNE LONG2FP_3 ; 不为零,右移一位,阶码加 1 LONG2FP_5: AND R18,R18 ; 判次高位是否为零 BRNE LONG2FP_7

14、SUBI R26,$08 ; 为零,阶码减 8 MOV R18,R17 ;数左移 8 位 MOV R17,R16 LDI R16,$00 ; 低位以 $00 填充 RJMP LONG2FP_5 LONG2FP_6: DEC R26 ADD R16,R16 ADC R17,R17 ADC R18,R18LONG2FP_7: BRPL LONG2FP_6 ; R18第7为0,再左移一位 MOV R19,R26 ; 阶码减 1 ,直到R18第7位为1 RJMP GGH FP2INT: ; 四字节浮点数转换成16位整数运算子程 LDI R26,$0E ; 令R26 = 14 RJMP FP2LONG_

15、1 ; 跳至FP2LONG_1 FP2LONG: ; 四字节浮点数转换成32位长整数运算子程 LDI R26,$1E ; 令R26 = 30 FP2LONG_1: RCALL FP2LONG_11 ; 调FP2LONG_11子程 BREQ FP2LONG_4 ;相等,即阶码为 0 ,按 0 处理 SUB R26,R19 ;R26(14)-阶码差值 BREQ FP2LONG_2 ;为 0 ,则跳至FP2LONG_2 BRPL FP2LONG_5 ;为正, 则跳至FP2LONG_5无溢出FP2LONG_2: ;有溢出 AND R20,R20 ;符号为正, BRMI FP2LONG_3 ;符号为负,

16、则跳至FP2LONG_3 LDI R16,$FF LDI R17,$FF LDI R18,$FF LDI R19,$7F RET ;正向溢出,结果置为 $7F FF FF FFFP2LONG_3: LDI R16,$00 LDI R17,$00 LDI R18,$00 LDI R19,$80 RET ; 负向溢出,结果置为 $80 00 00 00FP2LONG_4: LDI R16,$00 LDI R17,$00 LDI R18,$00 LDI R19,$00 RET ;结果为 0 ,置为 $00 00 00 00FP2LONG_5: ;无溢出 INC R19 ;阶码差值 + 1 BRMI

17、FP2LONG_4 ;为负,即(阶码 $7E)按零处理 LDI R19,$00 ;清R19 SUBI R26,$08 ;R26(14-阶码差值) -8 BRPL FP2LONG_7 ;为正转FP2LONG_7 SUBI R26,$F8 ;不够减则加 8 MOV R19,R18 ;左移 8 位 MOV R18,R17 MOV R17,R16 LDI R16,$7F ;低位以 $7F 填充 RJMP FP2LONG_8 ;跳至 FP2LONG_8 FP2LONG_6: MOV R16,R17 ;右移 8 位 MOV R17,R18 LDI R18,$00 ;高位以 $00 填充 SUBI R26,

18、$08 ;R26-8 FP2LONG_7: CPI R26,$08 ;R26值与 8 相比较 BRCC FP2LONG_6 ;有借位,跳至FP2LONG_6 FP2LONG_8: ;无借位 AND R26,R26 BREQ FP2LONG_10 FP2LONG_9: LSR R19 ;右移一位 ROR R18 ROR R17 ROR R16 DEC R26 ;R26-1,不为 0 跳至FP2LONG_9 BRNE FP2LONG_9 ;直到R26为 0 为止 FP2LONG_10: ;考虑符号位 SBRC R20,7 RJMP QUBU ;为负,则跳至QUBU取补 返回 RET ;为正,返回F

19、P2LONG_11: MOV R20,R19 ; 取浮点数数符存于R20最高位 ANDI R20,$80 ADD R18,R18 ; 将阶码移至R19 ADC R19,R19 SUBI R19,$80 ; 阶码减 $80 存于R19 SEC ROR R18 ; 恢复尾数最高位 1 CPI R19,$80 ; 阶码差值与 $80 相比较 RET ADD32F_1: ; 存储结果 MOV R20,R25 MOV R19,R24 MOV R18,R23 MOV R17,R22 MOV R16,R21ADD32F_2: RJMP GGH ; 跳至GGH处理结果SUB32F: ; 四字节浮点减法运算子程

20、 SUBI R24,$80 ; 减数取反,视为浮点加法运算 ADD32F: ; 四字节浮点加法运算子程 RCALL YCL ; 调YCL子程 CPI R24,$80 ;先判加数是否为 0 BREQ ADD32F_2 ;为 0 则和为被加数 跳至ADD32F_2 CPI R19,$80 ;再判被加数是否为 0 BREQ ADD32F_1 ;为 0 则和为加数 跳至ADD32F_1ADD32F_3: MOV R26,R19 ;转存被加数阶码 SUB R26,R24 ;R26=被加数阶码 减 加数阶码 BRVS ADD32F_2 ;溢出,跳至ADD32F_2 即加数可忽略 BRMI ADD32F_4

21、 ;为负,跳至ADD32F_4 BRNE ADD32F_5 ;不等,跳至ADD32F_5 CP R16,R21 CPC R17,R22 CPC R18,R23 BRCC ADD32F_5 ADD32F_4: RCALL ADD32F_16 ;调ADD32F_16,被加数和加数相交换 RJMP ADD32F_3 ;跳至ADD32F_3ADD32F_5: CPI R26,$18 ;阶码差值与 24 相比较 BRCS ADD32F_6 ;C=1,跳至ADD32F_6,即 24 加数清 0 CLR R22 CLR R23 ADD32F_6: CPI R26,$08 ;阶码差值与 8 相比较 BRCS

22、ADD32F_7 ;C=1,跳至ADD32F_7 (直至 8) MOV R21,R22 ;加数尾数右移 8 位 MOV R22,R23 ;高 8 位清 0 CLR R23 SUBI R26,$08 ;阶码差值再减 8 RJMP ADD32F_6 ;跳至ADD32F_6ADD32F_7: AND R26,R26 BREQ ADD32F_9 ;直至R26=0,跳至ADD32F_9 ADD32F_8: LSR R23 ;加数尾数右移 1 位 ROR R22 ROR R21 DEC R26 ;阶码差值减 1 BRNE ADD32F_8 ;不为 0 跳至ADD32F_8ADD32F_9: MOV R26

23、,R20 ;被加数和加数是否同号 EOR R26,R25 BRMI ADD32F_10 ;异号,跳至ADD32F_10 RCALL ADD32F_13 ;同号,调ADD32F_13子程尾数相加 BRCC ADD32F_2 ;C=0,无溢出,跳至ADD32F_2 ROR R18 ;C=1,溢出,尾数右移 1 位 ROR R17 ROR R16 SUBI R19,$FF ;阶码加 1 BRVC ADD32F_2 ;无溢出,跳至ADD32F_2,处理结果 RJMP JGZD ;溢出,跳至JGZD ,出结果ADD32F_10: RCALL ADD32F_14 ;调ADD32F_14子程尾数相减 BRN

24、E ADD32F_11 ;不等,跳至ADD32F_11 RJMP JGW0 ;跳至JGW0 ,出结果 ADD32F_11: BRCC ADD32F_12 ;C=0,够减,跳至ADD32F_12 RCALL ADD32F_15 ;C=1,不够减,调ADD32F_15子程取补ADD32F_12: AND R18,R18 ;判R18最高位是否位 1 BRMI ADD32F_2 ;为 1 ,跳至ADD32F_2,处理结果 ADD R16,R16 ;为 0 ,尾数左移一位 ADC R17,R17 ADC R18,R18 SUBI R19,$01 ;阶码减 1 BRVC ADD32F_12 ;无溢出,跳至

25、ADD32F_12 RJMP JGZD ;溢出,跳至JGZD ,出结果 ADD32F_13: ;尾数相加 ADD R16,R21 ADC R17,R22 ADC R18,R23 RET ADD32F_14: ;尾数相减 SUB R16,R21 SBC R17,R22 SBC R18,R23 RET ADD32F_15: ;结果取补 COM R17 COM R18 NEG R16 SBCI R17,$FF SBCI R18,$FF RET ADD32F_16: ;两个数相交换 ST -Y,R21 ST -Y,R22 ST -Y,R23 ST -Y,R24 ST -Y,R25 MOV R24,R1

26、9 MOV R21,R16 MOV R22,R17 MOV R23,R18 MOV R25,R20 LD R20,Y+ LD R19,Y+ LD R18,Y+ LD R17,Y+ LD R16,Y+ RETYCL: MOV R20,R19 LDI R26,$80 ADD R18,R18 ADC R19,R19 ; 将阶码移至R19 EOR R19,R26 ; 阶码减 $80 存于R19 ADD R26,R26 ROR R18 ; 恢复尾数最高位 1 ANDI R20,$80 ;取浮点数数符存于R20最高位 MOV R25,R24 LDI R26,$80 ADD R23,R23 ; 将阶码移至R

27、24 ADC R24,R24 EOR R24,R26 ; 阶码减 $80 存于R24 ADD R26,R26 ROR R23 ; 恢复尾数最高位 1 ANDI R25,$80 ;取浮点数数符存于R25最高位 CPI R19,$80 RET GGH: ;规格化 ADD R18,R18 ;隐含尾数最高位为 1 LDI R26,$80 ;考虑符号位 EOR R26,R19 ; ADD R20,R20 ROR R26 ; 右移R26,R18 ROR R18 MOV R19,R26 ;R26移至R19 RET DIV32F_1: ST -Y,R26 ;转存R26 CLR R13 ;清R15:R14:R1

28、3 CLR R14 CLR R15 LDI R26,$18 ;令R26=$18(24)DIV32F_2: CP R16,R21 ;被除数(余数)与除数两尾数相比 CPC R17,R22 CPC R18,R23 BRCS DIV32F_3 ;被除数(余数) 除数 SUB R16,R21 ;余数 = 被除数 - 除数 SBC R17,R22 SBC R18,R23 SEC RJMP DIV32F_4 DIV32F_3: CLC ; 清除进位位DIV32F_4: ADC R13,R13 ; 商左移一位,并加上进位位 ADC R14,R14 ADC R15,R15 ADD R16,R16 ; 余数左移

29、一位 ADC R17,R17 ADC R18,R18 DEC R26 ; R26-1 BRNE DIV32F_2 ;循环 24 次 MOV R16,R13 ;取出商 MOV R17,R14 MOV R18,R15 LD R26,Y+ ;恢复R26 RET DIV32F: ; 四字节浮点除法运算子程 AND R24,R24 BREQ DIV32F_7 ;跳至DIV32F_7,出结果 AND R19,R19 ;判被除数是否为 0 BREQ JGW0 ;为 0 ,则结果为 0 RCALL YCL ;调YCL子程 BREQ JGW0 ;跳至JGW0, 结果为 0 EOR R20,R25 ;取商的符号位存于R20 SEC SBC R19,R24 ;取出商的阶码 BRVS JGZD ;溢出,跳至JGZD LSR R23 ;无溢出 ROR R22 ;将被除数与除数得尾数 ROR R21 ;右移一位,最高位置 0 LSR R18 ROR R17 ROR R16 RCALL DIV32F_1 ;调DIV32F_1子程,进行运算 AND R18,R18 ;判R18最高位是否为 0 BRMI DIV32F_5 ;为

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

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