c51单片机浮点数及其汇编程序设计
被乘数的阶的和;
(3)积的尾数为被乘数和乘数的尾数的积。
参加运算的浮点数一般都是规格化的浮点数,尾数的积小于1,不需进行右规格化处理。但有可能小于0.5,所以需进行左规格化处理,使积为规格化浮点数。如果乘数或被乘数的尾为0、则积为410000H。由于在尾数相乘时,积的低16位不能反映在结果中,因此,积可能会产生一定的误差。
例3 算22.4l×4.23。
解: 22.41×4.23=05B349H×03875EH=07BD9AH=94.8
积的阶为乘数和被乘数的和,即8。尾数相乘时,积小于0.5,进行左规格化处理,阶码变为7。
例4 计算2586.5×(-6.91)。
解: 2586.5×(-6.91)=0CA1BOH×83DD13H=8F8BA0H=-17872
被乘数为正数,数符为0,乘数为负数,数符为1,积的数符为0⊕1=1,积为负数。
3.浮点数的除法运算
除法运算可以表示为
N=Na/Nb=[(-1)SSa×Sa×2Pa]/[(-1)SSb×Sb×2Pb ]
=(-1)SSa-SSb×(Sa/Sb) ×2Pa-Pb
浮点数的除法运算可以总结为:
(1) 商的数符为被除数与除数的符号位的差;
(2) 商的阶码为被除数和除数的阶码的差;
(3) 商的尾数为被除数和除数的尾数的商。
规格化的浮点数进行除法运算时,尾数相除,商不会小于0.5,不需进行左规格化处理。但有可能大于1,有时需进行右规格化处理。
例5 计算390.67÷14.3l。
解: 390.67÷14.31=09C357H÷04E511H=05DA4EH=27.3
商的阶码为被除数与除数的阶码的差。尾数相除时,结果的最高位为1,商为规格化浮点数。
例6 计算 -6.02÷16.157。
解: -6.02÷16.157=83C0AAH÷058143H=FFBEC8H= -0.373
异号相除时,商为负数。由于被除数的尾数大于除数的尾数,所以被除数先进行右规格化,阶码变为4,商的阶码为 -1,用补码来表示。
浮点数运算子程序
通过前面的分析可以看到,浮点运算比较复杂,有其特有的方法和规律。这里介绍几种常用的三字节浮点数运算子程序,通过分析、设计这些程序,可以进一步了解浮点数的运算过程和特点,熟悉复杂程序的设计方法。
1.浮点数通用规格化子程序
在浮点数运算过程中,有时需要左规格化,有时需要右规格化。通过规格化子程序既可实现左规格化,又可实现右规格化,其具体功能如下:
当Cy=0时,进行右规格化:F0=0时.对R6(阶)R2R3(尾数)右规格化1位;F0=1时,对R7(阶)R4R5(尾数)右规格化1位。
当Cy=1时,对R6(阶)R3R3(尾数)执行左规格化。
程序开始时,判断是执行左规格化还是右规格化。如果是右规格化,还要判断是对R6(阶)R2R3(尾数)还是对R7(阶)R4R5(尾数)进行规格化。如果是左规格化,直至把操作数变为规格化浮点数。其程序框图如图4-13所示。程序为:
FSDT: JC LNORMS
MOV C, 39H ;进行右规格化
JB F0, NR7
MOV A, R2 ;R2R3右移一位
RRC A ;(Cy)移入尾数最高位
MOV R2, A
MOV A, R3
RRC A
MOV R3, A
INC R6 ;阶码加1
RET
NR7: MOV A, R4
RRC A
MOV R4, A
MOV A, R5
RRC A
MOV R5, A
INC R7
RET
LNORMS: MOV A, R7
JNZ LSHIFT
CJNE R3, #00H, LSBIT8 ;尾数为0,阶码41H
MOV R6, #41H
LSEND : RET
LSHIFT: JB ACC.7, LSEND
LSBIT8: MOV C, F0
MOV A, R3
RLC A
MOV R3, A
MOV A, R2
RLC A
MOV R2, A
CLR F0
DEC R6
SJMP LNORMS
2.浮点数加减运算子程序
参加运算的浮点数可能是正数,也可能是负数。对于加法运算.当加数和被加数的数符相同时,尾数相加,不同时尾数相减;对于减法运算,当减数和被减数的数符相同时,尾数相减、不同时尾数相加。当两个浮点数的阶码不同时,要进行对阶,使小阶与大阶相等,因此,结果的阶码与其较大的阶码相同。
在执行加法运算时,尾数有可能大于1,因此要进行右规格化处理;执行减法运算时,尾数有可能小于0.5,因此,要进行左规格化处理。
下面是三字节浮点数加、减法处理于程序,具体功能为:
R6(阶)R2R3(尾)±R7(阶)R4R5(尾)→R4(阶)R2R3(尾);
当位3AH=0时,执行加法;
当位3AH=1时,执行减法。
程序框图如图4—14所示。程序如下:
FABP: MOV A, R6
MOV C, ACC.7
MOV 38H, C ;存被加数数符
XRL A, R7
JNB ACC.7, FAB1 ;数符相同则转
CPL 3AH ;数符不等,求反运算标志
图4-14
FAB1: MOV A, R6
MOV C, ACC.6 ;扩展阶码符号位
MOV ACC.7, C
MOV R6, A
MOV A, R7
CLR C
MOV A, R6
SUBB A, R7
JZ FAB2 ;阶码相同则转
CLR F0
JB ACC.7, FAB6
CJNE R4, #00H, FAB7
CJNE R5, #00H, FAB7
FAB2: JB 3AH, FAB9 ;转向尾数减法
MOV A, R3 ;执行尾数加法
ADD A, R5
MOV R3, A
ADD A, R2
ADDC A, R4
MOV R2, A
JNC FAB4
SETB 39H
CLR C
FAB3: CLR F0
LCALL FSDT
FAB4: CJNE R2, #00H, FAB5
CJNE R3
c51单片机浮点数汇编程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)