AVR汇编百例浮点程序库Word格式.docx
《AVR汇编百例浮点程序库Word格式.docx》由会员分享,可在线阅读,更多相关《AVR汇编百例浮点程序库Word格式.docx(49页珍藏版)》请在冰豆网上搜索。
![AVR汇编百例浮点程序库Word格式.docx](https://file1.bdocx.com/fileroot1/2023-1/26/f7925e23-ec94-482f-8432-82f26d3c04e3/f7925e23-ec94-482f-8432-82f26d3c04e31.gif)
不等,阶码大者浮点数值也大;
只有阶码和尾数对应相等,
CPCR8,R12;
两浮点数才相等
比较结果:
Z=1时X1=X2,否则C=0时X1>
X2,C=1时X1<
X2
CP1:
RJMPCP3;
两负数比较,转
CP2:
CPR13,R9;
正数与负数比较,只比较尾数高位字节即可
CP3:
CPR15,R11;
X1,X2皆为负,以尾数低位字节,中位字节,高位字节和
CPCR14,R10;
CPCR13,R9;
但要将X1、X2交换位置后按正数比较过程进行
CPCR12,R8
CP4:
范例64
FPSU:
LDIR17,$80;
浮点减法子程序
SUBR13,R17;
减数数符求反后作为加数
FPAD:
TSTR8;
浮点加法子程序
BREQDON1;
被加数为0,加数为和
TSTR12
BRNEFPLAD;
加数为0,取被加数为和
SAV0:
MOVR12,R8;
传送被加数取代加数
MOVR13,R9
MOVR14,R10
MOVR15,R11
DON1:
FPLAD:
ANDIR16,$3f;
清除被加数,加数数符
ORIR16,$80;
被加数数符取到(R16,7)
ORIR16,$40;
加数数符取到(R16,6)
ORR9,R17
ORR13,R17;
恢复尾数最高位
MOVR17,R12
SUBR17,R8;
计算阶差
BREQGOON;
两阶相等,转
BRCCNX3
NEGR17;
不够减求补
CPIR17,24
BRCCEXAD;
|阶差|>
24,取被加数为和
NX2A:
LSRR13
RORR14
RORR15
DECR17
BRNENX2A;
加数阶小,右移加数对阶
取被加数阶为和之阶
BRCCGOON
RCALLINC3;
舍入移出位
RJMPGOON
NX3:
BRCCCOM1;
阶差>
24,取加数为和
LOOP:
LSRR9
RORR10
RORR11
BRNELOOP;
加数阶大,右移被加数对阶
RCALLINC3A;
GOON:
SBRCR16,6
SBRSR16,7;
判别两数是否同号
RJMPSAMS;
同号转
SUBR15,R11;
异号,执行减法,加数为被减数
SBCR14,R10
SBCR13,R9
BRCCNOM;
够减转
SUBIR16,$40;
否则被减数数符求反为和之数符
RCALLNEG3;
并将差求补
NOM:
MOVR17,R13
ORR17,R14
ORR17,R15
BREQDON0;
差为0转
NMLOP:
RJMPCOM1
LSLR15
ROLR14
ROLR13
DECR12
BRNENMLOP;
规格化
OV1:
SEV;
阶码变为0,下溢(可取为0,不算溢出)
SAMS:
ADDR15,R11
ADCR14,R10
ADCR13,R9;
两数同号,执行加法
BRCCCOM1
RORR13
INCR12;
有进位时右规1次($7F+1=$80溢出)
BREQOV1;
阶码增1后变为0为上溢
BRNCCOM1
RCALLINC3
COM1:
CLV
COMA:
LDIR17,$7F
ANDR13,R17;
正数数符为0
DON:
EXAD:
RCALLSAV0;
取被加数为和
SBRSR16,7
RJMPCOMA;
配置数符
DON0:
CLRR12;
浮点数为0
范例65;
浮点乘法子程序
FPMU:
TSTR8
BREQM0;
被乘数为0,积为0
BRNEM1;
乘数为0,积也为0
M0:
RJMPG0
M1:
RCALLDP;
处理积符号,计算积之阶码
BRCSOV2
BREQOV2;
判断溢出
MOVR5,R13
MOVR6,R14
MOVR7,R15;
乘数转入R5,R6,R7
LDIR17,25;
设右移部分积次数
CLRR13
CLRR14
CLRR15;
r13r14r15清除,存放积
CLC
LOOP1:
BRCCM2
乘数右移移出位为1,被乘数加入部分积1次
M2:
RORR5
RORR6
RORR7;
部分积连同乘数右移1位
BRNELOOP1;
尾数相乘计算完成?
SBRCR13,7
RJMPM3;
乘积最高位为1转
ROLR5
ROLR15
ROLR13;
乘积最高位为0,高4位字节左移1位
SBRSR5,7
RJMPM5
末位字节舍入
BRNEM5
SEC;
舍入后R13变为0
RORR13;
将其改为$80(即0.5)
RJMPCOM2
M5:
DECR12;
舍入后R13不为0
BRNECOM2;
阶码减1
OV2:
变为0为溢出
M3:
SBRCR5,7
乘积低3位字节舍入
COM2:
正数将符号位请除
DON2:
范例66
FPDI:
TSTR12;
浮点除法子程序
BREQOV3;
除数为0,溢出
BRNED1
RJMPG0;
被除数为0,商为0
D1:
NEGR12;
除数阶码求补,以加补码代替减原码
处理商符号,计算商之阶码
BRCSOV3
FPD3:
左移相减试商25次,最后1次舍入
SUBR11,R15
SBCR10,R14
SBCR9,R13
BRCSD2;
第一次尾数相减试商
够减,商阶增1
SEC
BRNED3;
商阶增1后不为0,转计商;
否则为溢出
OV3:
SEV
D2:
ADDR11,R15
ADCR10,R14
ADCR9,R13;
不够减则恢复被除数
LOOP2:
LSLR11
ROLR10
ROLR9;
被除数算术左移
BRCSD4;
进位位为1,够减,本位商1
SBCR9,R13;
否则相减试商
BRCSD2A
RJMPD3;
够减,本位商1
D2A:
ADDR11,R15;
不够减,恢复被除数
ADCR9,R13
CLC;
本位商0
RJMPD3
D4:
被除数减去除数
D3:
BRNED5;
除法未完成,循环(1-1=0,不溢出)
MOVR14,R6
MOVR15,R7;
取回商
BRCCCOM3
第25位商舍入($800000-$FFFFFF不溢出,故INC3不会溢出!
)
COM3:
配置商数符
DON3:
D5:
ROLR7;
在R5,R6,R7中记商(不必预先清除)
ROLR6
ROLR5;
商数左移1位并记商
RJMPLOOP2
范例67
FPSQ:
模拟手算开平方子程序
ORIR16,$80;
负数建虚根标志
FPS0:
BREQDON4;
0的平方根为0
LSRR12;
阶码算术右移1位
BRCCFSQ2
移出位舍入
先将位数增1(提前舍入)
BRCSFSQ1;
C=1,不够减
若尾数变为0将其改为0.5($80-->
r13)
RJMPFSQ2
FSQ1:
RORR15;
否则将为数算术右移
FSQ2:
开出25位根,末位舍入
MOVR8,R17
LDIR17,$40
根恢复为移码
CLRR5
CLRR6
CLRR7;
根扩展区清除
CLRR9
CLRR10
CLRR11;
根存储区清除
FSQ3:
SUBR13,R17
SBCR7,R11
SBCR6,R10
SBCR5,R9;
试根
BRCSFSQ3A
RJMPFSQ4;
够减,本位根1
FSQ3A:
ADDR13,R17
ADCR7,R11
ADCR6,R10
ADCR5,R9;
否则恢复开平方数之尾数
本位商0
FSQ4:
DECR8
BRNEFSQ5;
开出第25位根?
FQDON:
MOVR15,R11;
回送根尾数
BRCCCOM4
第25位根舍入
COM4:
根尾数为正数
DON4:
FSQ5:
ROLR11
根尾数带进位左移,记根
ROLR13
ROLR7
开平方数之尾数连同扩展区左移2位
BRCCFSQ3;
未产生进位,循环
RJMPFQDON;
否则进位为第25位根(不须试,并结束子程序)!
范例68;
牛顿迭代开平方子程序
FSQR:
BREQSQRT;
ANDIR16,$7E
虚根标志
SBRCR12,0
INCR16;
阶码为奇数
尾数变为正数
LSRR12
ADCR12,R17;
得到根之移码
PUSHR12;
暂存
MOVR12,R17
SBRCR16,0
得到X1的阶码(0.5≤X1<
2)
RCALLLD1;
存X1
SBRSR16,0;
阶码为奇数时算术右移尾数即得到X1之尾数;
否则将其最
高位字节加上$40
得到首次根r0=(1+x1)/2
LDIR17,3
MOVR0,R17;
迭代3次
FSQLP:
RCALLLD2
RCALLGET1
RCALLFPDI
RCALLGET2
RCALLFPAD
计算r(i+1)=(x1/ri+ri)/2
DECR0
BRNEFSQLP;
r3的尾数为根之尾数
POPR12;
取回根之阶码
SQRT:
r16,7=1为虚数根
范例69;
基本运算程序的演示程序
DMST1:
.EQUSPL=$3D
.EQUSPH=$3E
LDIR16,2;
high(ramend)
OUTSPH,R16
LDIR16,$5F;
low(ramend)
OUTSPL,R16
LDSR11,$60;
r11,7:
数符r11,6:
阶符r11,5--0:
阶(最大为38)
LDSR12,$61;
r12-r15:
尾数
LDSR13,$62
LDSR14,$63
LDSR15,$64;
尾数共8位BCD码
RCALLDTOB;
转为二进制浮点数
RCALLLD2;
LDSR11,$65;
数符r11,阶符r11,5--0:
LDSR12,$66;
LDSR13,$67
LDSR14,$68
LDSR15,$69
RCALLGET2;
取第一操作数
RCALLFPAD;
调基本运算子程序之一(FPSU/FPMU/FPDI)
RCALLBTOD;
转回十进制浮点数
DMRET:
RJMPDMRET
范例70;
辅助子程序
KP2:
MOVR8,R12;
复制第二操作数
LD1:
STS$70,R12;
存浮点数
STS$71,R13
STS$72,R14
SYS$73,R15
LD2:
STS$74,R12;
STS$75,R13
STS$76,R14
STS$77,R15
LD3:
STS$78,R12;
STS$79,R13
STS$7A,R14
STS$7B,R15
GET1:
LDSR8,$70;
取浮点数
LDSR9,$71
LDSR10,$72
LDSR11,$73
GET2:
LDSR8,$74;
LDSR9,$75
LDSR10,$76
LDSR11,$77
GET3:
LDSR8,$78;
LDSR9,$79
LDSR10,$7A
LDSR11,$7B
INVPI:
LDIR17,$86;
取浮点数180/л
LDIR17,$65
MOVR9,R17
LDIR17,$2E
MOVR10,R17
LDIR17,$E1
MOVR11,R17
G90:
LDIR17,$87;
取浮点数90
LDIR17,$34
CLRR11
DTOR:
RCALLPI18;
角度化为弧度
RJMPFPMU
RTOD:
RCALLINVPI;
弧度化为角度
GHPI:
LDIR17,$81;
取浮点数л/2
LDIR17,$49
LDIR17,$0f
LDIR17,$DB
G01:
LDIR17,$7D;
取浮点数0.1
LDIR17,$4C
LDIR17,$CC
LDIR17,$CD
G1:
取浮点数1
PI18:
LDIR17,$7B;
取浮点数л/180
LDIR17,$0E
LDIR17,$FA
LDIR17,$35
GINT:
LDIR17,R12;
浮点数取整
CPIR17,$81
BRCCGINT1
RCALLG0;
阶码<
$81,结果为0
RJMPKP2
GINT1:
ANDIR16,$DD
ORIR16,2;
记数符
CPIR17,$98
BRCCGOVER;
阶码>
$97,溢出
RCALLBRK;
分解出整数部分(在R9R10R11)
SBRSR16,1
正数返回
NEG3A:
COMR11;
负数求(r9r10r11)之补
COMR10
COMR9
INC3A:
LDIR17,255
SUBIR11,R17
SBCIR10,R17
SBCIR9,R17;
求反后加1
GOVER:
ORIR16,$20;
设整数部分超过23位标志
BRK:
ANDIR16,$DF;
将正浮点数分解为整数/小数两部分
SUBIR17,$80
BREQBRKRT
BRCSLOOPT
CPIR17,$19;
整数部分超过24位
为溢出
LOOP4:
ROLR9
BRNELOOPT;
左移位数为阶码-$80,整数部分进入r9-r11中
BRKRT:
LOOPT:
LSRR13;
只有小数部分右移尾数($80-阶码)位
INCR17
BRNELOOPT
NRML:
ANDIR16,$BF;
1字节正整数(在R13中)规格化为浮点数
CLRR15
LDIR12,$88;
设阶码
RJMPNMLOP
G10:
LDIR17,$84;
取浮点数10
LDIR17,$20
GLN2:
取浮点数ln2(=0.6931471806)
LDIR17,$31
LDIR17,$72
LDIR17,$18
GLN10:
LDIR17,$82;
取浮点数ln10(=2.302585093)
LDIR17,$13
LDIR17,$5D
LDIR17,$8E
INVX:
计算1/X,X=0时溢出
BRNEINV
OV4:
INV:
RCALLG1;
取1
RJMPFPDI
范例71;
用荷纳法计算多项式值子程序
FPLN1:
ORIR16,$10;
设计算奇函数(lnx,sinx,arcsinx等)标志
RCALLLD3;
存X
RCALLKP2
RCALLFPMU;
计算X2
RJMPFLN0;
FPLN2:
ANDIR16,$EF;
设计算偶函数(EXP,COSX等)标志
FLN0:
存T,T=X或T=X2
POPR30
POPR31;
系数表数据地址进入Z
LSLR30
ROLR31;
由按字取数变为按字节取数
LPM;
r0<
--(z)取阶码
MOVR8,R0
ADIWR30,1;
指针增1
取尾数高位字节
MOVR9,R0
z+1
取尾数中