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

上传人:b****6 文档编号:21526503 上传时间:2023-01-31 格式:DOCX 页数:49 大小:30.27KB
下载 相关 举报
AVR汇编百例浮点程序库Word格式.docx_第1页
第1页 / 共49页
AVR汇编百例浮点程序库Word格式.docx_第2页
第2页 / 共49页
AVR汇编百例浮点程序库Word格式.docx_第3页
第3页 / 共49页
AVR汇编百例浮点程序库Word格式.docx_第4页
第4页 / 共49页
AVR汇编百例浮点程序库Word格式.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

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

《AVR汇编百例浮点程序库Word格式.docx》由会员分享,可在线阅读,更多相关《AVR汇编百例浮点程序库Word格式.docx(49页珍藏版)》请在冰豆网上搜索。

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

不等,阶码大者浮点数值也大;

只有阶码和尾数对应相等,

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

取尾数中

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销 > 经济市场

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

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