📄 jrdmdysf.asm
字号:
;
; ************ 9、浮点数除法子程序FDIV ************
;
FDIV: LCALL FMLD
MOV A,R6
XRL A,R7
MOV A,ACC.7
MOV 38H,C ; 保存商的符号
CLR A
MOV R6,A
MOV R7,A
CJNE R4,#0,FD1
CJNE R5,#0,FD1
SETB C
RET
FD1: MOV A,R3 ; 比较被除数与除数的尾数大小
SUBB A,R5
MOV A,R2
SUBB A,R4
JC FD2
CLR PSW.5 ; 被除数尾数太大,则右移一位
CLR 39H
LCALL FSDT
MOV A,R7
RRC A
MOV R7,A
CLR C
SJMP FD1
FD2: 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
DDIV: MOV A,R1 ; 定点双字节小数除法
PUSH ACC ; 保护R1
MOV B,#10H
DV1: CLR C
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV PSW.5,C
CLR C
SUBB A,R5
MOV R1,A
MOV A,R2
SUBB A,R4
; JB PSW.5,DV2
; JC DV3
;DV2: MOV R2,A
MOV A,R1
MOV R3,A
INC R6
;DV3: DJNZ B,DV1
POP ACC ; 恢复R1
MOV R1,A
MOV A,R7
MOV R2,A
MOV A,R6
MOV R3,A
RET
;功能:将Bit 3CH(数符)R2R3中的整数转换成三字节浮点数,送(R1)指向的内部RAM单元中。
;
; ************ 10、双字节整数转换成三字节浮点数INTF ************
;
INTF: MOV R6,#10H
SETB C
CLR PSW.5
LCALL FSDT
MOV A,R6
MOV C,3CH
MOV ACC.7,C
MOV R4,A
LCALL FSTR
RET
;功能:将(R0)指向的内部RAM中的三字节浮点数取整,16位的
;整数绝对值值送R2R3,符号存于位单元3CH。
;
; ************ 11、三字节浮点数转换为双字节整数子程序FINT ************
;
FINT: CLR PSW.5
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
DEC R0
DEC R0
MOV A,@R0
MOV C,ACC.7
MOV 3CH,C ; 取出符号位
CLR ACC.7
JNB ACC.6,FIN1
MOV R2,#0 ; 阶码小于0
MOV R3,#0
RET
FIN1: CJNE A,#17,$+3
JC FIN3
SETB PSW.5 ; 溢出
MOV R2,#0FFH
MOV R3,#0FFH
RET
FIN3: CJNE A,#16,FIN4
RET
FIN4: CLR C ; 阶码小于0,小于16
XCH A,R2 ; 尾数右移一位
RRC A
XCH A,R2
XCH A,R3
RRC A
XCH A,R3
INC A ; 阶码加1
SJMP FIN3
;功能:计算Y=an+……+a1x+a00入口时,X在内部RAM中,(R0)指向X的阶码。
;计算后,Y也放于内部RAM中,R1指向Y的阶码单元,ai放于调用指令后。
;
; ************ 12、三字节浮点数多项式计算子程序FPLN ************
;
FPLN: POP DPH ; 从栈中得到an的指针
POP DPL
CLR A
MOVC A,@A+DPTR ; 取出anp
MOV R6,A
INC DPTR
CLR A
MOVC A,@A+DPTR ; 取出anp
MOV R2,A
INC DPTR
CLR A
MOVC A,@A+DPTR ; 取出ani
MOV R3,A
INC DPTR
FP1: MOV A,@R0
XRL A,R6
MOV C,ACC.7
MOV 38H,C ; 暂存乘积符号
INC R0
MOV A,@R0 ; 取出X的尾数
MOV R4,A
INC R0
MOV A,@R0
MOV R5,A
DEC R0
DEC R0
LCALL DMUL ; 调用定点双字节小数乘法DMUL见FMUL子程序
MOV A,R2
JB ACC.7,FP2
MOV A,R7 ; 左规格化一位
RLC A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DEC R6
FP2: MOV A,R6 ; 计算乘积的阶码
ADD A,@R0
MOV C,38H
MOV ACC.7,C
MOV R6,A
CLR A
MOVC A,@A+DPTR ; 取出aip
MOV R7,A
INC DPTR
CLR A
MOVC A,@A+DPTR ; 取出aip
MOV R4,A
INC DPTR
CLR A
MOVC A,@A+DPTR ; 取出ail
MOV R5,A
INC DPTR
CLR 3AH
LCALL FABP
MOV A,R4
MOV R6,A
CLR A
MOVC A,@A+DPTR ; 取出下一个字节
CJNE A,#40H,FP1
LCALL FSTR ; 结束,回送计算结果
INC DPTR
CLR A
JMP @A+DPTR ; 转回后继指令
;功能:把由(R0)指示的三字节二进制浮点数转换成十进制浮点数,放在由(R1)指示
;的6个内存单元中。其中,第一个单元为十进制浮点数阶码(8位二进制补码形式),后
;5个单元为十进制尾数(5位十进制数字,每个字节为一个BCD码)。数符在Bit 3CH中,
;Bit 3CH=0为正数;Bit 3CH=1为负数。
;
; ************ 13、三字节浮点二进制到十进制转换子程序FBTD ************
;
FBTD: MOV A,@R0
MOV C,ACC.7
MOV 3CH,C ; 存放浮点数的符号
MOV C,ACC.6 ; 把阶码扩展为双符号位
MOV ACC.7,C
MOV R6,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
DEC R0
DEC R0
CJNE R2,#0,FB3
CJNE R3,#0,FB3
CLR A ; 二进制浮点数为0
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
INC R1
MOV @R1,A
FB1: DEC R1
DEC R1
DEC R1
DEC R1
DEC R1
RET
FB3: MOV @R1,#0 ; 十进制浮点数阶码初值
JB 3EH,FB4
DEC @R1
FB4: INC R1
MOV @R1,#1 ; 比较值1、2、4的阶码
JNB 3EH,FB5
INC @R1
JNB 3FH,FB5
INC @R1
FB5: MOV A,R6
CLR C
SUBB A,@R1
JZ FB13
JNB ACC.6,FB14
FB6: DEC @R1 ; 二进制数阶码小于比较值取新的比较值
DEC @R1
DEC @R1
DEC @R1
FB7: MOV A,R6
CLR C
SUBB A,@R1
JZ FB16
JB ACC.6,FB17
FB8: JNB 3EH,FB9 ; 二进制数阶码大于比较值
DEC R6
JNB 3FH,FB9
DEC R6
FB9: CJNE R6,#0,FB19
MOV R6,#5
JNB 3EH,FB12
MOV R7,#1
JNB 3FH,FB10
INC R7
FB10: CLR A
CLR C
FB11: XCH A,R3 ; 把二进制尾数转换成定点数
RLC A
XCH A,R3
XCH A,R2
RLC A
XCH A,R2
RLC A
DJNZ R7,FB11
DEC R6
MOV @R1,A ; 十进制尾数高位(整数)
INC R1
FB12: MOV A,R3 ; 把定点小数转成十进制小数
MOV B,#1O
MUL AB
MOV R3,A
MOV R7,B
MOV A,R2
MOV B,#10
MUL AB
ADD A,R7
MOV R2,A
CLR A
ADDC A,B
MOV @R1,A
INC R1
DJNZ R6,FB12
SJMP FB1 ; 结束
FB13: MOV A,R2
SUBB A,#80H
JC FB6
FB14: MOV R5,#0CDH ; (R6R2R3)*0.1
MOV R4,#0CCH
LCALL DMUL
MOV A,R2
JB ACC.7,FB20
MOV A,R7
MOV C,ACC.7 ; 四舍五入
ORL C,ACC.6
MOV A,R3 ; 左规格化一位
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DEC R6
FB15: MOV A,R6 ; 加0.1的阶码
ADD A,#0FDH
MOV R6,A
DEC R1
INC @R1 ; 十进制数阶码加1
INC R1
SJMP FB5
FBX: SJMP FB7
FB19: MOV A,R2 ; 右移R2R3,使(R0=0)
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
INC R6
SJMP FB9
FB16: MOV A,#0CBH
CLR C
SUBB A,R3
MOV A,#0CCH
SUBB A,R2
JC FB8
FB17: MOV R4,#0A0H ; (R6R2R3)*10
MOV R5,#0
LCALL DMUL
MOV A,R2
JB ACC.7,FB21
MOV A,R7
MOV C,ACC.7 ; 四舍五入
ORL C,ACC.6
MOV A,R3 ; 左规格化一位
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DEC R6
FB18: MOV A,R6 ; 加10的阶码
ADD A,#4
MOV R6,A
DEC R1
DEC @R1 ; 十进制数阶码减1
INC R1
SJMP FBX
FB20: MOV A,R7
JNB ACC.7,FB15
MOV A,R3 ; 四舍五入
ORL A,#1
MOV R3,A
SJMP FB15
FB21: MOV A,R7
JNB ACC.7,FB18
MOV A,R3 ; 四舍五入
ORL A,#1
MOV R3,A
SJMP FB18
;功能:把放在由(DPTR)指示的外部RAM缓冲区中的一个十进制数(以回车符0DH结尾)
;转换成三字节浮点二进制数,放在(R1)指示的三字节内部RAM中。
; ************ 14、三字节浮点数十进制到二进制转换子程序FDTB ************
;
FDTB: MOV @R1,#41H ; y-0
INC R1
MOV @R1,#0
INC R1
MOV @R1,#0
DEC R1
DEC R1
CLR 3BH
MOV 7CH,#0 ; 小数点位置计数器清零
CLR 3CH ; 符号
MOVX A,@DPTR
CJNE A,#2BH,FDTB1
SJMP FDTB2 ; 正号“+”
FDTB1: CJNE A,#2DH,FDTB3
SETB 3CH ; 负号“-”
FDTB2: INC DPTR
MOVX A,@DPTR
FDTB3: CJNE A,#30H,$+3
JC FDTB8
CJNE A,#3AH,$+3
JNC FDTBE
FDTB4: CLR C ;“0”=<(A)< “9”
SUBB A,#30H ; ASCII码转换成BCD码
PUSH ACC
INC DPTR
MOV 7DH,#4 ; 10
MOV 7EH,#0A0H
MOV 7EH,#0
MOV R0,#7DH
LCALL FMUL
LCALL FSTR ; y*10-y
POP ACC
MOV R3,A
MOV R2,#0
MOV R6,#16
SETB C
CLR F0
LCALL FSDT ; 输入数字转换成浮点数
MOV A,R6
MOV @R0,A
INC R0
MOV A,R2
MOV @R0,A
INC R0
MOV A,R3
MOV @R0,A
MOV R0,#7DH
LCALL FADD
LCALL FSTR ; 小数点位置计数器加1
FDTB5: MOVX A,@DPTR
CJNE A,#30H,$+3
JC FDTB6
CJNE A,#3AH,$+3
JC FDTB4
FDTB6: CJNE A,#2EH,FDTB9
FDTB7: INC DPTR ;(A)中为小数点“.”
SETB 3BH ; 置位遇小数点标志
SJMP FDTB5
FDTB8: CJNE A,#2EH,FDTBE
SJMP FDTB7
FDTBE: SETB PSW.5 ; 出错
RET
FDTB9: CJNE A,#0DH,FDTBE
JNB 3BH,FDTBB
MOV A,7CH ; 遇到过小数点
JZ FDTBB
FDTBA: MOV 7DH,#7DH ; 0.1
MOV 7EH,#0CCH
MOV 7FH,0CDH
MOV R0,#7DH
LCALL FMUL
LCALL FSTR ; y*0.1-y
DJNZ 7CH,FDTBA ; 循环
FDTBB: MOV A,@R1
MOV C,3CH ; 回送符号
MOV ACC.7,C
MOV @R1,A
CLR PSW.5
RET
;功能:把(R0)指向的内部RAM中三字节浮点数开平方,结果Z送到(R1)指向的内部RAM单元中。
;
; ************ 15、浮点数开平方子程序FSQR *****************
;
FSQR: MOV A,@R0
JB ACC.7,FR3 ; X为负数转出错处理
MOV @R1,A ; 取X为迭代初值Z。
INC R0
INC R1
MOV A,R0
MOV @R1,A
INC R0
INC R1
MOV A,@R0
MOV @R1,A
DEC R0
DEC R0 ;(R0)指向X的阶码存储单元
DEC R1
DEC R1 ;(R1)指向Zi的阶码存储单元
FR1: LCALL FDIV ; 计算X/Zi-R6R2R3
MOV R6,A
MOV A,@R1 ; Zi取到R7R4R5
MOV R7,A
INC R1
MOV A,@R1
MOV R4,A
INC R1
MOV A,@R1
MOV R5,A
DEC R1
DEC R1
CLR 3AH
LCALL FABP ; 计算(Zi+X/Zi)-R4R2R3
CLR PSW.5
MOV A,R4 ; 计算1/2(Zi+X/Zi)得Zi+1
DEC A
CLR ACC.7
MOV R4,A
MOV B,R7
CLR B.7
CJNE A,B,FR2 ; 比较Zi+1和Zi的阶码相等否?
MOV A,R5
SUBB A,R3
ANL A,#0FCH
MOV R7,A
MOV A,R6
SUBB A,R2 ; Zi+1和Zi尾数高位不相等转FR2
JNZ FR2
CJNE R7,#0,FR2 ; Zi+1和Zi尾数低位差大于03,转FR2
SETB PSW.5 ; 置结束标志
FR2: LCALL FSTR ; 存Zi+1
JNB PSW.5,FR1
RET
FR3: CLR PSW.5
RET ; 负数开平方出错处理
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -