首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

MCS-51浮点运算子程序及其使用说明(5)

MCS-51浮点运算子程序及其使用说明(5)

(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)



入口条件:操作数在[R0]中。

出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。

影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节

FSQR: MOV A,@R0

JNB ACC.7,SQR

SETB OV ;负数开平方,出错

RET

SQR: INC R0

INC R0

MOV A,@R0

DEC R0

ORL A,@R0

DEC R0

JNZ SQ

MOV @R0,#41H;尾数为零,不必运算

CLR OV

RET

SQ: MOV A,@R0

MOV C,ACC.6 ;将阶码扩展成8bit补码

MOV ACC.7,C

INC A ;加一

CLR C

RRC A ;除二

MOV @R0,A ;得到平方根的阶码,回存之

INC R0 ;指向被开方数尾数的高字节

JC SQR0 ;原被开方数的阶码是奇数吗?

MOV A,@R0 ;是奇数,尾数右规一次

RRC A

MOV @R0,A

INC R0

MOV A,@R0

RRC A

MOV @R0,A

DEC R0

SQR0: MOV A,@R0

JZ SQR9 ;尾数为零,不必运算

MOV R2,A ;将尾数传送到R2R3中

INC R0

MOV A,@R0

MOV R3,A

MOV A,R2 ;快速开方,参阅定点子程序说明

ADD A,#57H

JC SQR2

ADD A,#45H

JC SQR1

ADD A,#24H

MOV B,#0E3H

MOV R4,#80H

SJMP SQR3

SQR1: MOV B,#0B2H

MOV R4,#0A0H

SJMP SQR3

SQR2: MOV B,#8DH

MOV R4,#0D0H

SQR3: MUL AB

MOV A,B

ADD A,R4

MOV R4,A

MOV B,A

MUL AB

XCH A,R3

CLR C

SUBB A,R3

MOV R3,A

MOV A,B

XCH A,R2

SUBB A,R2

MOV R2,A

SQR4: SETB C

MOV A,R4

RLC A

MOV R6,A

CLR A

RLC A

MOV R5,A

MOV A,R3

SUBB A,R6

MOV B,A

MOV A,R2

SUBB A,R5

JC SQR5

INC R4

MOV R2,A

MOV R3,B

SJMP SQR4

SQR5: MOV A,R4

XCH A,R2

RRC A

MOV F0,C

MOV A,R3

MOV R5,A

MOV R4,#8

SQR6: CLR C

MOV A,R3

RLC A

MOV R3,A

CLR C

MOV A,R5

SUBB A,R2

JB F0,SQR7

JC SQR8

SQR7: MOV R5,A

INC R3

SQR8: CLR C

MOV A,R5

RLC A

MOV R5,A

MOV F0,C

DJNZ R4,SQR6

MOV A,R3 ;将平方根的尾数回传到[R0]中

MOV @R0,A

DEC R0

MOV A,R2

MOV @R0,A

SQR9: DEC R0 ;数据指针回归原位

CLR OV ;开方结果有效

RET



(18) 标号: FPLN 功能:浮点数多项式计算



入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。

出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。

影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 4字节

FPLN: POP DPH ;取出多项式系数存放地址

POP DPL

XCH A,R0 ;R0、R1交换角色,自变量在[R1]中

XCH A,R1

XCH A,R0

CLR A ;清第一工作区

MOV R2,A

MOV R3,A

MOV R4,A

CLR 1FH

PLN1: CLR A ;读取一个系数,并装入第二工作区

MOVC A,@A+DPTR

MOV C,ACC.7

MOV 1EH,C

MOV C,ACC.6

MOV ACC.7,C

MOV R5,A

INC DPTR

CLR A

MOVC A,@A+DPTR

MOV R6,A

INC DPTR

CLR A

MOVC A,@A+DPTR

MOV R7,A

INC DPTR ;指向下一个系数

MOV C,1EH ;比较两个数符

RRC A

XRL A,23H

RLC A

MOV F0,C ;保存比较结果

LCALL AS1 ;进行代数加法运算

CLR A ;读取下一个系数的第一个字节

MOVC A,@A+DPTR

CJNE A,#40H,PLN2;是结束标志吗?

XCH A,R0 ;运算结束,恢复R0、R1原来的角色

XCH A,R1

XCH A,R0

LCALL MOV0 ;将结果回传到[R0]中

CLR A

INC DPTR

JMP @A+DPTR ;返回主程序

PLN2: MOV A,@R1 ;比较自变量和中间结果的符号

XRL A,23H

RLC A

MOV 1FH,C ;保存比较结果

LCALL MUL0 ;进行乘法运算

SJMP PLN1 ;继续下一项运算



(19) 标号: FLOG 功能:以10为底的浮点对数函数



入口条件:操作数在[R0]中。

出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。

影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:9字节

FLOG: LCALL FLN ;先以E为底求对数

JNB OV,LOG

RET ;如溢出则停止计算

LOG: MOV R5,#0FFH;系数0.43430(1/Ln10)

MOV R6,#0DEH

MOV R7,#5CH

LCALL MUL1 ;通过相乘来换底

LJMP MOV0 ;传回结果




(20) 标号: FLN 功能:以E为底的浮点对数函数



入口条件:操作数在[R0]中。

出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。

影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 7字节




FLN: LCALL MVR0 ;将[R0]传送到第一工作区

JB 1FH,LNOV;负数或零求对数,出错

MOV A,R3

ORL A,R4

JNZ LN0

LNOV: SETB OV

RET

LN0: CLR C

LCALL RL1 ;左规一次

CLR A

XCH A,R2 ;保存原阶码,清零工作区的阶码

PUSH ACC

LCALL RLN ;规格化

LCALL MOV0 ;回传

LCALL FPLN ;用多项式计算尾数的对数

DB 7BH,0F4H,30H;0.029808

DB 0FEH,85H,13H;-0.12996

DB 7FH,91H,51H;0.28382

DB 0FFH,0FAH,0BAH;-0.4897

DB 0,0FFH,0CAH;0.99918

DB 70H,0C0H,0;1.1442×10-5

DB 40H ;结束

POP ACC ;取出原阶码

JNZ LN1

RET ;如为零,则结束

LN1: CLR 1EH ;清第二区数符

MOV C,ACC.7

MOV F0,C ;保存阶符

JNC LN2

CPL A ;当阶码为负时,求其绝对值

INC A

LN2: MOV R2,A ;阶码的绝对值乘以0.69315

MOV B,#72H

MUL AB

XCH A,R2

MOV R7,B

MOV B,#0B1H

MUL AB

ADD A,R7

MOV R7,A ;乘积的尾数在R6R7R2中

CLR A

ADDC A,B

MOV R6,A

MOV R5,#8 ;乘积的阶码初始化(整数部分为一字节)

LN3: JB ACC.7,LN4;乘积格式化

MOV A,R2

RLC A

MOV R2,A

MOV A,R7

RLC A

MOV R7,A

MOV A,R6

RLC A

MOV R6,A

DEC R5

SJMP LN3

LN4: MOV C,F0 ;取出阶符,作为乘积的数符

MOV ACC.7,C

LJMP ASN ;与尾数的对数合并,得原操作数的对数
返回列表