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

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

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

(21) 标号: FE10 功能:以10为底的浮点指数函数



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

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

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

FE10: MOV R5,#2 ;加权系数为3.3219(Log210)

MOV R6,#0D4H

MOV R7,#9AH

SJMP EXP ;先进行加权运算,后以2为底统一求幂



(22) 标号: FEXP 功能:以E为底的浮点指数函数



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

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

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

FEXP: MOV R5,#1 ;加权系数为1.44272(Lng2e)

MOV R6,#0B8H

MOV R7,#0ABH

EXP: CLR 1EH ;加权系数为正数

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

LCALL MUL1 ;进行加权运算

SJMP E20 ;以2为底统一求幂



(23) 标号: FE2 功能:以2为底的浮点指数函数



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

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

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

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

E20: MOV A,R3

ORL A,R4

JZ EXP1 ;尾数为零

MOV A,R2

JB ACC.7,EXP2;阶符为负?

SETB C

SUBB A,#6 ;阶码大于6否?

JC EXP2

JB 1FH,EXP0;数符为负否?

MOV @R0,#3FH;正指数过大,幂溢出

INC R0

MOV @R0,#0FFH

INC R0

MOV @R0,#0FFH

DEC R0

DEC R0

SETB OV

RET

EXP0: MOV @R0,#41H;负指数过大,幂下溢,清零处理

CLR A

INC R0

MOV @R0,A

INC R0

MOV @R0,A

DEC R0

DEC R0

CLR OV

RET

EXP1: MOV @R0,#1 ;指数为零,幂为1.00

INC R0

MOV @R0,#80H

INC R0

MOV @R0,#0

DEC R0

DEC R0

CLR OV

RET

EXP2: MOV A,R2 ;将指数复制到第二工作区

MOV R5,A

MOV A,R3

MOV R6,A

MOV A,R4

MOV R7,A

MOV C,1FH

MOV 1EH,C

LCALL INT ;对第一区取整

MOV A,R3

JZ EXP4

EXP3: CLR C ;使尾数高字节R3对应一个字节整数

RRC A

INC R2

CJNE R2,#8,EXP3

EXP4: MOV R3,A

JNB 1FH,EXP5

CPL A ;并用补码表示

INC A

EXP5: PUSH ACC ;暂时保存之

LCALL RLN ;重新规格化

CPL 1FH

SETB F0

LCALL AS1 ;求指数的小数部分

LCALL MOV0 ;回传指数的小数部分

LCALL FPLN ;通过多项式计算指数的小数部分的幂

DB 77H,0B1H,0C9H;1.3564×10-3

DB 7AH,0A1H,68H;9.8514×10-3

DB 7CH,0E3H,4FH;0.055495

DB 7EH,0F5H,0E7H;0.24014

DB 0,0B1H,72H;0.69315

DB 1,80H,0 ;1.00000

DB 40H ;结束

POP ACC ;取出指数的整数部分

ADD A,R2 ;按补码加到幂的阶码上

MOV R2,A

CLR 1FH ;幂的符号为正

LJMP MOV0 ;将幂传回[R0]中




(24)标号: DTOF 功能:双字节十六进制定点数转换成格式化浮点数



入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。

出口信息:转换成格式化浮点数在[R0]中(三字节)。

影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节

DTOF: MOV R2,A ;按整数的位数初始化阶码

MOV A,@R0 ;将定点数作尾数

MOV R3,A

INC R0

MOV A,@R0

MOV R4,A

DEC R0

LCALL RLN ;进行规格化

LJMP MOV0 ;传送结果到[R0]中



(25) 标号: FTOD 功能:格式化浮点数转换成双字节定点数



入口条件:格式化浮点操作数在[R0]中。

出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符

在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。

影响资源:PSW、A、B、R2、R3、R4、位1FH 堆栈需求: 6字节

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

MOV A,R2

JZ FTD4 ;阶码为零,纯小数

JB ACC.7,FTD4;阶码为负,纯小数

SETB C

SUBB A,#10H

JC FTD1

SETB OV ;阶码大于16,溢出

RET

FTD1: SETB C

MOV A,R2

SUBB A,#8 ;阶码大于8否?

JC FTD3

FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换

LCALL FTD8

SETB F0 ;设立双字节整数标志

CLR C

CLR OV

RET

FTD3: MOV B,#8 ;按一字节整数一字节小数转换

LCALL FTD8

SETB C ;设立一字节整数一字节小数标志

CLR F0

CLR OV

RET

FTD4: MOV B,#0 ;按纯小数转换

LCALL FTD8

CLR OV ;设立纯小数标志

CLR F0

CLR C

RET

FTD8: MOV A,R2 ;按规定的整数位数进行右规

CJNE A,B,FTD9

MOV A,R3 ;将双字节结果传送到[R0]中

MOV @R0,A

INC R0

MOV A,R4

MOV @R0,A

DEC R0

RET

FTD9: CLR C

LCALL RR1 ;右规一次

SJMP FTD8
返回列表