⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msc.51fudian.asm

📁 51汇编浮点子程序 51汇编浮点子程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
 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

    (26)  标号:  BTOF    功能:浮点BCD码转换成格式化浮点数

入口条件:浮点BCD码操作数在[R0]中。
出口信息:转换成的格式化浮点数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:6字节

BTOF: INC R0 ;判断是否为零。
 INC R0
 MOV A,@R0
 MOV R7,A
 DEC R0
 MOV A,@R0
 MOV R6,A
 DEC R0
 ORL A,R7
 JNZ BTF0
 MOV @R0,#41H;为零,转换结束。
 RET
BTF0: MOV A,@R0

MOV C,ACC.7
 MOV 1DH,C ;保存数符。
 CLR 1FH ;以绝对值进行转换。
 MOV C,ACC.6 ;扩充阶码为八位。
 MOV ACC.7,C
 MOV @R0,A
 JNC BTF1
 ADD A,#19 ;是否小于1E-19?
 JC BTF2
 MOV @R0,#41H;小于1E-19时以0计。
 INC R0
 MOV @R0,#0
 INC R0
 MOV @R0,#0
 DEC R0
 DEC R0
 RET
BTF1: SUBB A,#19
 JC BTF2
 MOV A,#3FH ;大于1E19时封顶。
 MOV C,1DH
 MOV ACC.7,C
 MOV @R0,A
 INC R0
 MOV @R0,#0FFH
 INC R0

MOV @R0,#0FFH
 DEC R0
 DEC R0
 RET
BTF2: CLR A ;准备将BCD码尾数转换成十六进制浮点数。
 MOV R4,A
 MOV R3,A
 MOV R2,#10H ;至少两个字节。
BTF3: MOV A,R7
 ADD A,R7
 DA A
 MOV R7,A
 MOV A,R6
 ADDC A,R6
 DA A
 MOV R6,A
 MOV A,R4
 RLC A
 MOV R4,A
 MOV A,R3
 RLC A
 MOV R3,A
 DEC R2
 JNB ACC.7,BTF3;直到尾数规格化。
 MOV A,R6 ;四舍五入。
 ADD A,#0B0H
 CLR A
 ADDC A,R4
 MOV R4,A
 CLR A

ADDC A,R3
 MOV R3,A
 JNC BTF4
 MOV R3,#80H
 INC R2
BTF4: MOV DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数。
 MOV A,@R0
 ADD A,#19 ;计算表格偏移量。
 MOV B,#3
 MUL AB
 ADD A,DPL
 MOV DPL,A
 JNC BTF5
 INC DPH
BTF5: CLR A ;查表。
 MOVC A,@A+DPTR
 MOV C,ACC.6
 MOV ACC.7,C
 MOV R5,A
 MOV A,#1
 MOVC A,@A+DPTR
 MOV R6,A
 MOV A,#2
 MOVC A,@A+DPTR
 MOV R7,A
 LCALL MUL1 ;将阶码对应的浮点数和尾数对应的浮点数相乘。

MOV C,1DH ;取出数符。
 MOV 1FH,C
 LJMP MOV0 ;传送转换结果。

   (27)  标号:  FTOB    功能:格式化浮点数转换成浮点BCD码

入口条件:格式化浮点操作数在[R0]中。
出口信息:转换成的浮点BCD码仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1DH~1FH   堆栈需求:6字节

FTOB: INC R0
 MOV A,@R0
 INC R0
 ORL A,@R0
 DEC R0
 DEC R0
 JNZ FTB0
 MOV @R0,#41H
 RET
FTB0: MOV A,@R0
 MOV C,ACC.7
 MOV 1DH,C
 CLR ACC.7
 MOV @R0,A

LCALL MVR0
 MOV DPTR,#BFL0;绝对值大于或等于1时的查表起点。
 MOV B,#0 ;十的0次幂。
 MOV A,R2
 JNB ACC.7,FTB1
 MOV DPTR,#BTFL;绝对值小于1E-6时的查表起点。
 MOV B,#0EDH ;十的-19次幂。
 ADD A,#16
 JNC FTB1
 MOV DPTR,#BFLN;绝对值大于或等于1E-6时的查表起点。
 MOV B,#0FAH ;十的-6次幂。
FTB1: CLR A ;查表,找到一个比待转换浮点数大的整数幂。
 MOVC A,@A+DPTR
 MOV C,ACC.6
 MOV ACC.7,C
 MOV R5,A
 MOV A,#1
 MOVC A,@A+DPTR

MOV R6,A
 MOV A,#2
 MOVC A,@A+DPTR
 MOV R7,A
 MOV A,R5 ;和待转换浮点数比较。
 CLR C
 SUBB A,R2
 JB ACC.7,FTB2;差为负数。 
 JNZ FTB3
 MOV A,R6
 CLR C
 SUBB A,R3
 JC FTB2
 JNZ FTB3
 MOV A,R7
 CLR C
 SUBB A,R4
 JC FTB2
 JNZ FTB3
 MOV R5,B ;正好是表格中的数。
 INC R5 ;幂加一。
 MOV R6,#10H ;尾数为0·1000。
 MOV R7,#0
 SJMP FTB6 ;传送转换结果。
FTB2: INC DPTR ;准备表格下一项。
 INC DPTR

INC DPTR
 INC B ;幂加一。
 SJMP FTB1 ; 
FTB3: PUSH B ;保存幂值。
 LCALL DIV3 ;相除,得到一个二进制浮点数的纯小数。
FTB4: MOV A,R2 ;取阶码。
 JZ FTB5 ;为零吗?
 CLR C
 LCALL RR1 ;右规。
 SJMP FTB4
FTB5: POP ACC ;取出幂值。
 MOV R5,A ;作为十进制浮点数的阶码。
 LCALL HB2 ;转换尾数的十分位和百分位。
 MOV R6,A
 LCALL HB2 ;转换尾数的千分位和万分位。
 MOV R7,A
 MOV A,R3 ;四舍五入。
 RLC A
 CLR A
 ADDC A,R7

DA A
 MOV R7,A
 CLR A
 ADDC A,R6
 DA A
 MOV R6,A
 JNC FTB6
 MOV R6,#10H
 INC R5
FTB6: INC R0 ;存放转换结果。
 INC R0
 MOV A,R7
 MOV @R0,A
 DEC R0
 MOV A,R6
 MOV @R0,A
 DEC R0
 MOV A,R5
 MOV C,1DH ;取出数符。
 MOV ACC.7,C
 MOV @R0,A 
 RET
HB2: MOV A,R4 ;尾数扩大100倍。
 MOV B,#100
 MUL AB
 MOV R4,A
 MOV A,B
 XCH A,R3
 MOV B,#100
 MUL AB
 ADD A,R3
 MOV R3,A
 JNC HB21

INC B
HB21: MOV A,B ;将整数部分转换成BCD码。
 MOV B,#10
 DIV AB
 SWAP A
 ORL A,B
 RET
BTFL: DB 41H,0ECH,1EH ;1.0000E-19
 DB 45H,93H,93H ;1.0000E-18
 DB 48H,0B8H,78H ;1.0000E-17
 DB 4BH,0E6H,96H ;1.0000E-16
 DB 4FH,90H,1DH ;1.0000E-15
 DB 52H,0B4H,25H ;1.0000E-14
 DB 55H,0E1H,2EH ;1.0000E-13
 DB 59H,8CH,0BDH ;1.0000E-12
 DB 5CH,0AFH,0ECH ;1.0000E-11
 DB 5FH,0DBH,0E7H ;1.0000E-10
 DB 63H,89H,70H ;1.0000E-9

DB 66H,0ABH,0CCH ;1.0000E-8
 DB 69H,0D6H,0C0H ;1.0000E-7
BFLN: DB 6DH,86H,38H ;1.0000E-6
 DB 70H,0A7H,0C6H ;1.0000E-5
 DB 73H,0D1H,0B7H ;1.0000E-4
 DB 77H,83H,12H ;1.0000E-3
 DB 7AH,0A3H,0D7H ;1.0000E-2
 DB 7DH,0CCH,0CDH ;1.0000E-1
BFL0: DB 1,80H,00H ;1.0000
 DB 4,0A0H,00H ;1.0000E1
 DB 7,0C8H,00H ;1.0000E2
 DB 0AH,0FAH,00H ;1.0000E3
 DB 0EH,9CH,40H ;1.0000E4
 DB 11H,0C3H,50H ;1.0000E5
 DB 14H,0F4H,24H ;1.0000E6

DB 18H,98H,97H ;1.0000E7
 DB 1BH,0BEH,0BCH ;1.0000E8
 DB 1EH,0EEH,6BH ;1.0000E9
 DB 22H,95H,03H ;1.0000E10
 DB 25H,0BAH,44H ;1.0000E11
 DB 28H,0E8H,0D5H ;1.0000E12
 DB 2CH,91H,85H ;1.0000E13
 DB 2FH,0B5H,0E6H ;1.0000E14
 DB 32H,0E3H,60H ;1.0000E15
 DB 36H,8EH,1CH ;1.0000E16
 DB 39H,31H,0A3H ;1.0000E17
 DB 3CH,0DEH,0BH ;1.0000E18
 DB 40H,8AH,0C7H ;1.0000E19

    (28)  标号:  FCOS    功能:浮点余弦函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:  6字节

FCOS: LCALL FABS ;COS(-X) = COS X
 MOV R5,#1 ;常数1.5708(π/2)
 MOV R6,#0C9H
 MOV R7,#10H
 CLR 1EH
 LCALL MVR0
 CLR F0
 LCALL AS1 ;x+(π/2)
 LCALL MOV0 ;保存结果,接着运行下面的FSIN程序

    (29)  标号:  FSIN    功能:浮点正弦函数

入口条件:操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH  堆栈需求:  6字节

FSIN: MOV A,@R0
 MOV C,ACC.7
 MOV 1DH,C ;保存自变量的符号
 CLR ACC.7 ;统一按正数计算
 MOV @R0,A
 LCALL MVR0 ;将[R0]传送到第一工作区
 MOV R5,#0 ;系数0.636627(2/π)
 MOV R6,#0A2H
 MOV R7,#0FAH
 CLR 1EH
 LCALL MUL1 ;相乘,自变量按(π/2)规一化
 MOV A,R2 ;将结果复制到第二区
 MOV R5,A
 MOV A,R3
 MOV R6,A
 MOV A,R4
 MOV R7,A
 LCALL INT ;第一区取整,获得象限信息
 MOV A,R2
 JZ SIN2
SIN1: CLR C ;将浮点象限数转换成定点象限数

LCALL RR1
 CJNE R2,#10H,SIN1
 MOV A,R4
 JNB ACC.1,SIN2
 CPL 1DH ;对于第三、四象限,结果取反
SIN2: JB ACC.0,SIN3
 CPL 1FH ;对于第一、三象限,直接求规一化的小数
 SJMP SIN4
SIN3: MOV A,R4 ;对于第二、四象限,准备求其补数
 INC A
 MOV R4,A
 JNZ SIN4
 INC R3
SIN4: LCALL RLN ;规格化
 SETB F0
 LCALL AS1 ;求自变量归一化等效值
 LCALL MOV0 ;回传
 LCALL FPLN ;用多项式计算正弦值
 DB 7DH,93H,28H;0.07185
 DB 41H,0,0 ;0

DB 80H,0A4H,64H;-0.64215
 DB 41H,0,0 ;0
 DB 1,0C9H,2;1.5704
 DB 41H,0,0 ;0
 DB 40H ;结束
 MOV A,@R0 ;结果的绝对值超过1.00吗?
 JZ SIN5
 JB ACC.6,SIN5
 INC R0 ;绝对值按1.00封顶
 MOV @R0,#80H
 INC R0
 MOV @R0,#0
 DEC R0
 DEC R0
 MOV A,#1
SIN5: MOV C,1DH ;将数符拼入结果中
 MOV ACC.7,C
 MOV @R0,A
 RET

    (30)  标号:  FATN    功能:浮点反正切函数

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

出口信息:结果仍在[R0]中。
影响资源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆栈需求:7字节

FATN: MOV A,@R0
 MOV C,ACC.7
 MOV 1DH,C ;保存自变量数符
 CLR ACC.7 ;自变量取绝对值
 MOV @R0,A
 CLR 1CH ;清求余运算标志
 JB ACC.6,ATN1;自变量为纯小数否?
 JZ ATN1
 SETB 1CH ;置位求余运算标志
 LCALL FRCP ;通过倒数运算,转换成纯小数
ATN1: LCALL FPLN ;通过多项式运算,计算反正切函数值
 DB 0FCH,0E4H,91H;-0.055802
 DB 7FH,8FH,37H;0.27922

DB 0FFH,0EDH,0E0H;-0.46460
 DB 7BH,0E8H,77H;0.028377
 DB 0,0FFH,68H;0.9977
 DB 72H,85H,0ECH;3.1930×10-5
 DB 40H ;结束
 JNB 1CH,ATN2;需要求余运算否?
 CPL 1FH ;准备运算标志
 MOV C,1FH
 MOV F0,C ;常数1.5708(π/2)
 MOV R5,#1
 MOV R6,#0C9H
 MOV R7,#10H
 LCALL AS1 ;求余运算
 LCALL MOV0 ;回传
ATN2: MOV A,@R0 ;拼入结果的数符
 MOV C,1DH
 MOV ACC.7,C
 MOV @R0,A
 RET


    (31)  标号:  RTOD    功能:浮点弧度数转换成浮点度数

入口条件:浮点弧度数在[R0]中。
出口信息:转换成的浮点度数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

RTOD: MOV R5,#6 ;系数(180/π)传送到第二工作区
 MOV R6,#0E5H
 MOV R7,#2FH
 SJMP DR ;通过乘法进行转换

    (32)  标号:  DTOR    功能:浮点度数转换成浮点弧度数

入口条件:浮点度数在[R0]中。
出口信息:转换成的浮点弧度数仍在[R0]中。
影响资源:PSW、A、B、R2~R7、位1EH、1FH  堆栈需求:6字节

DTOR: MOV R5,#0FBH;系数(π/180)传送到第二工作区
 MOV R6,#8EH
 MOV R7,#0FAH
DR: LCALL MVR0 ;将[R0]传送到第一工作区
 CLR 1EH ;系数为正
 LCALL MUL1 ;通过乘法进行转换
 LJMP MOV0 ;结果传送到[R0]中
 END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -