c51单片机浮点数及其汇编程序设计
, #00H, FAB5
MOV R4, #41 ;结果为0,规格化
RET
FAB5: MOV A, R6
MOV C, 38H
MOV ACC.7, C
XCH A, R4
MOV R6, A
RET
FAB6: CJNE R2, #00H, FAB8
CJNE R3, #00H, FAB8
MOV A, R7
MOV R6, A
SJMP FAB2
FAB7: CPL F0
FAB8: CLR C
LCALL FSDT
SJMP FAB1
FAB9: MOV A, R3 ;尾数相减
CLR C
SUBB A, R5
MOV R3, A
MOV A, R2
SUBB A, R4
MOV R2, A
JNC FAB10
CLR A
CLR C
SUBB A, R3
MOV R3, A
CLR A
SUBB A, R2
MOV R2, A
CPL 38H
FAB10: SETB C
SJMP FAB3
3. 浮点数乘法运算子程序
浮点数相乘时,阶码直接相加即获得积的阶码,尾数相乘时,结果可能小于0.5,需进行左规格化处理。下面是三字节浮点数乘法运算子程序,具体功能为:
(Ro)指向的三字节浮点数×(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)。
图4-15三字节浮点数乘法的程序框图。程序为:
FMUL: LCALL FMLD ;传送浮点数
MOV A, R6 ;求积的数符
XRL A, R7
MOV C, ACC.7
MOV 38H, C
LCALL DMUL ;调用双字节无符号数乘法子程序
MOV A, R7
MOV C, ACC.7
MOV F0, C
MOV A, @R0
ADD A, @R1
MOV R6, A
SETB C
LCALL FSDT ;进行规格化操作
图4-15 三字节浮点数乘法子程序
MOV A, R6
MOV C, 38H
MOV ACC.7, C ;置积的数符
MOV R4, A
RET
注:(1)FMLD为浮点数取数子程序,功能为:将(R0)指向的三字节浮点数送入R6(阶)R2R3(尾数)中,将(R1)指向的三字节浮点数送入R7(阶)R4R5(尾数)中。
(2)DMUL为双字节无符号数乘法子程序。
4.浮点数除法运算子程序
在进行除法运算时,被除数的尾数可能比除数的尾数大很多,使结果大于1。为避免这种情况,如果被除数尾数大于除数的尾数,先将被除数的尾数右移,使其小于除数的尾数。阶码也相应增加,保持其数值不变。下面是三字节浮点数除法运算程序,其功能为:(R0)指向的三字节浮点数除以(R1)指向的三字节浮点数→R4(阶)R2R3(尾数)中。
程序框图如图4-16所示。程序为:
Fdiv: LCALL FMLD
MOV A, R6
XRL A, R7 ;求商的数符
MOV C, ACC.7
MOV 38H, C
CLR A
MOV R6, A
MOV R7, A
CJNE R4, #00H, Fdiv1
CJNE R5, #00H, Fdiv1
SETB C
RET ;除数为0返回
Fdiv1: MOV A, R3 ;比较被除数与
SUBB A, R5 ;除数的尾数
MOV A, R2
SUBB A, R4
JC Fdiv2
CLR F0
CLR 39H
LCALL FDST
RRC A
MOV R7, A
CLR C
SJMP Fdiv1
Fdiv2: CLR A
XCH A, R6
PUSH ACC
LCALL Ddiv ;调用双字节除法程序
POP ACC
ADD A, @R0
CLR C
SUBB A, @R1
MOV C, 38H
MOV ACC.7, C
MOV R4, A
CLR C
RET
c51单片机浮点数汇编程 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)