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

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

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

本浮点子程序库有三个不同层次的版本,以便适应不同的应用场合:

1.小型库(FQ51A.ASM):只包含浮点加、减、乘、除子程序。

2.中型库(FQ51B.ASM):在小型库的基础上再增加绝对值、倒数、比较、平方、开平方、

数制转换等子程序。

3.大型库(FQ51.ASM):包含本说明书中的全部子程序。

为便于读者使用本程序库,先将有关约定说明如下:

1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数

据,地址小的单元存放高字节。如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。

2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为

阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节

纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在

程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,

则二进制浮点数表示为83C000H。若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。

3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为

阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用

双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数

部分的位数,如 876.5 的阶码是03H,-876.5 的阶码是 83H;当十进制数的绝对值小于1

时,阶码就等于 80H 减去小数点后面零的个数,例如 0.00382 的阶码是 7EH,-0.00382

的阶码是 0FEH。在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。例

如有一个十进制浮点操作数存放在30H、31H、32H中,数值是 -0.07315,即-0.7315乘以10

的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]来指向它,则应使(R0)=30H。

4.运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算

的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮

点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或

输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。

5.工作区:数据工作区固定在A、B、R2~R7,数符或标志工作区固定在PSW和23H单

元(位1CH~1FH)。在浮点系统中,R2、R3、R4和位1FH为第一工作区,R5、R6、R7和位1EH

为第二工作区。用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的

透明性。

6.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用

积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:

计算 Y = Ln √ | Sin (Ab/C+D) |

已知:A=-123.4;B=0.7577;C=56.34;D=1.276; 它们分别存放在30H、33H、36H、

39H开始的连续三个单元中。用BCD码浮点数表示时,分别为A=831234H;B=007577H;

C=025634H;D=011276H。

求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各

种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用。程序如下:

TEST: MOV R0,#39H ;指向BCD码浮点操作数D

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R0,#36H ;指向BCD码浮点操作数C

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R0,#33H ;指向BCD码浮点操作数B

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R0,#30H ;指向BCD码浮点操作数A

LCALL BTOF ;将其转换成二进制浮点操作数

MOV R1,#33H ;指向二进制浮点操作数B

LCALL FMUL ;进行浮点乘法运算

MOV R1,#36H ;指向二进制浮点操作数C

LCALL FDIV ;进行浮点除法运算

MOV R1,#39H ;指向二进制浮点操作数D

LCALL FADD ;进行浮点加法运算

LCALL FSIN ;进行浮点正弦运算

LCALL FABS ;进行浮点绝对值运算

LCALL FSQR ;进行浮点开平方运算

LCALL FLN ;进行浮点对数运算

LCALL FTOB ;将结果转换成BCD码浮点数

STOP: LJMP STOP

END

运行结果,[R0]=804915H,即Y=-0.4915,比较精确的结果应该是-0.491437。




(1) 标号: FSDT 功能:浮点数格式化



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

出口信息:已格式化浮点操作数仍在[R0]中。

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

FSDT: LCALL MVR0 ;将待格式化操作数传送到第一工作区中

LCALL RLN ;通过左规完成格式化

LJMP MOV0 ;将已格式化浮点操作数传回到[R0]中



(2) 标号: FADD 功能:浮点数加法




入口条件:被加数在[R0]中,加数在[R1]中。

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

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

FADD: CLR F0 ;设立加法标志

SJMP AS ;计算代数和
返回列表