AVR汇编百例-浮点程序库.doc_第1页
AVR汇编百例-浮点程序库.doc_第2页
AVR汇编百例-浮点程序库.doc_第3页
AVR汇编百例-浮点程序库.doc_第4页
AVR汇编百例-浮点程序库.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

;范例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 ADD 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 ;X1为正,跳行 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 ;加数阶小,右移加数对阶 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 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 ROR 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 ;乘数为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: 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 ;阶码减1OV2: 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,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 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不会溢出!)COM3: 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 ;移出位舍入 RCALL 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 SBC 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 ROL 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 ;阶码为奇数 LDI 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次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 ;r11,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 ;调基本运算子程序之一(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 $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 R17,$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 ;取浮点数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 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 ;恢复尾数最高位 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: ANDI 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 ;取浮点数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 ;r02/2时跳转 DEC R0 ;取p=m-1 LnX=(m-1)*Ln2+LN(2T) MOV R17,R15 OR R17,R14 OR R17,R13 MOV R12,R17 BREQ LN5A ;2T-1=0 只须计算(m-1)Ln2 RCALL KP2 ;R12 NOUSED! LSL R9 ROL R10 ROL R11 ;(2T-1) LSR R13 ROR R14 ROR R15 LDI R17,$80 OR R13,R17 ;2T+1 LDI R17,$7E MOV R12,R17 ;取1/(2T+1)的阶码 RJMP LNTLPLN5: ORI R16,$80 ;(T-1)为负,数符位改为1 RCALL KP2 RCALL NEG3A LDI R17,$80 ADD R9,R17 ;计算(T-1) LSR R13 ROR R14 ROR R15 LDI R17,$C0 OR R13,R17 LDI R17,$7F MOV R12,R17 ;取1/(T+1)的阶码LNTLP: LSL R11 ROL R10 ROL R9 ;(2T-1)或(T-1)规格化 DEC R12 ;调整(2T-1)/(2T+1)或(T-1)/(T+1)的阶码 SBRS R9,7 RJMP LNTLP RCALL FPD3 ;计算(2T-1)/(2T+1)或(T-1)/(T+1) 位r16,7为商之数符 PUSH R0 RCALL FPLN1 ;计算LnT或Ln(2T) .DB $7E,$12,$49,$25 ;0.14285714 ;er.total0.000000029! .DB $7E,$4C,$CC,$CD ;0.2 .DB $7F,$2A,$AA,$AB ;0.33333333 .DB $81,$00,$00,$00 ;1 .DB $01,$00 ;结束符 INC R12 POP R0LN5A: LDI R17,$80 ADD R0,R17 BREQ LN53 ;p=$80结束 BRCS LN51 NEG R0 INC R16 ;p为负数LN51: RCALL LD1 ;存LnT或Ln(2T) MOV R13,R0 RCALL NRML ;|P|规格化 RCALL GLN2 ;取ln2 RCALL FPMU ;计算|p|*ln2 RCALL GET1 ;取LnT或Ln(2T) SBRS R16,0 RJMP LN52 RCALL FPSU ;p0 计算lnT+|p|*ln2或Ln(2T)+|p|*ln2LN53: RET;范例73 ;对数衍生函数子程序LGX: RCALL LNX ;计算lnx RCALL GLN10 ;取ln10 RCALL EXCH RJMP FPDI ;转计算lgx=lnx/ln10LGAX: RCALL LD2 ;存a RCALL EXCH RCALL LNX ;计算lnx RCALL GET2 ;取a RCALL LD2 ;存lnx RCALL EXCH RCALL LNX ;计算lna RCALL GET2 ;转计算logax=lnx/lnaRJMP FPDI;范例74EXP: MOV R17,R12 ;指数函数子程序 CPI R17,$68 ;X之阶$68E1: BRCC E2 RCALL G0 ROR R12 ;(R12)=$80 INC R12 ;取exp=1 RETE2: ANDI R16,$3F ;r16,6:数符 SBRC R13,7 ORI R16,$40 ;负数 LDI R17,$7F AND R13,R17 ;取正(取|X|) LDI R17,$33 CP R15,R17 LDI R17,$0F CPC R14,R17 LDI R17,$30 CPC R13,R17 LDI R17,$87 CPC R12,R17 ;|X|与88.02969 比较 BRCS E3 ;|X|88.02969 转 SBRS R16,6 RJMP OV6G0: CLR R12 ;若x88.02969,Exp溢出 RETE3: CLR R0 ;X整数部分予清除 LDI R17,$81 MOV R8,R17 LDI R17,$38 MOV R9,R17 LDI R17,$AA MOV R10,R17 LDI R17,$3B MOV R11,R17 ;取log2e(=1/ln2) RCALL FPMU ;计算X/ln2 LDI R17,$80 SBRC R16,6 OR R13,R17 MOV R17,R12 CPI R17,$81 BR

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论