📄 elc-1.asm
字号:
;功能:把(R0)指向的内部RAM中的三字节浮点数送到R6R2R3
; 把(R1)指向的内部RAM中的三字节浮点数送到R7R4R5
;程序使用A,R0-R7
;************************************************************
FMLD: MOV A,@R0 ;取操作数1
MOV R6,A
INC R0
MOV A,@R0
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
DEC R0 ;恢复(R0)的值
DEC R0
MOV A,@R1 ;取操作数2
MOV R7,A
INC R1
MOV A,@R1
MOV R4,A
INC R1
MOV A,@R1
MOV R5,A
DEC R1 ;恢复(R1)的值
DEC R1
RET
;***************************浮点数存数子程序*************************************
;功能:将R4R2R3的浮点数送到(R1)指向的内部RAM单元中
FSTR: MOV A,R4
MOV @R1,A
INC R1
MOV A,R2
MOV @R1,A
INC R1
MOV A,R3
MOV @R1,A
DEC R1
DEC R1
RET
;*******************************************************************************
;****************************浮点数加减法处理子程序*****************************
;功能:将R6R2R3和R7R4R5中的两个三字节浮点数进行相加或相减
;结果送R4R2R3
;*******************************************************************************
FABP: MOV A,R6
MOV C,ACC.7
MOV FG00,C ;被加数符号保存
XRL A,R7
JNB ACC.7,FA1 ;两数同号转FA1
CPL FG02 ;两数异号,取反运算标志
FA1: MOV A,R6 ;扩张阶码为双符号位
MOV C,ACC.6
MOV ACC.7,C
MOV R6,A
MOV A,R7
MOV C,ACC.6
MOV ACC.7,C
MOV R7,A
CLR C
MOV A,R6
SUBB A,R7
JZ FA2
CLR PSW.5
CLR FG01
JB ACC.7,FA5
CJNE R4,#0,FA6
CJNE R5,#0,FA6
FA2: JB FG02,FA8 ;执行尾数加法
MOV A,R3
ADD A,R5
MOV R3,A
MOV A,R2
ADDC A,R4
MOV R2,A
JNC FA4
SETB FG01 ;溢出,尾数右移一位
CLR C
FA3: CLR PSW.5
LCALL FSDT
FA4: CJNE R2,#0,FAA
CJNE R3,#0,FAA ;当结果为0时处理
MOV R4,#41H
RET
FAA: MOV A,R6
MOV C,FG00 ;回送结果符号
MOV ACC.7,C
XCH A,R4
MOV R6,A
RET
FA5: CJNE R2,#0,FA7
CJNE R3,#0,FA7
MOV A,R7
MOV R6,A
SJMP FA2
FA6: CPL PSW.5
FA7: CLR C
LCALL FSDT
SJMP FA1
FA8: MOV A,R3 ;执行尾数减法
CLR C ;不够减,尾数取补
SUBB A,R5
MOV R3,A
MOV A,R2
SUBB A,R4
MOV R2,A
JNC FA9
CLR A
CLR C
SUBB A,R3
MOV R3,A
CLR A
SUBB A,R2
MOV R2,A
CPL FG00 ;结果符号取反
FA9: SETB C
SJMP FA3
;***************************浮点加法子程序FADD*************************
;功能:将(R0)指向的内部RAM中的三字节浮点数加上(R1)指向的浮点数
;结果送R4R2R3
;**********************************************************************
FADD: CLR FG02 ;(R0)(R0+1)(R0+2)+(R1)(R1+1)(R1+2) -> R4R2R3
LCALL FMLD
LCALL FABP
RET
;***************************浮点减法子程序SUB**************************
;功能:将(R0)指向的内部RAM中的三字节浮点数减去(R1)指向的浮点数
;结果送R4R2R3
;**********************************************************************
FSUB: SETB FG02
LCALL FMLD
LCALL FABP
RET
;********************************************************************************
;**********************************************************************************
;***************************浮点乘法子程序FMUL*************************
FMUL: LCALL FMLD ;(R0)(R0+1)(R0+2)乘(R1)(R1+1)(R1+2) -> R4R2R3
MOV A,R6
XRL A,R7
MOV C,ACC.7
MOV FG00,C
LCALL DMUL
MOV A,R7
MOV C,ACC.7
MOV PSW.5,C
MOV A,@R0
ADD A,@R1
MOV R6,A
SETB C
LCALL FSDT
MOV A,R6
MOV C,FG00
MOV ACC.7,C
MOV R4,A
RET
;**************************************************************************
DMUL: MOV A,R3
MOV B,R5
MUL AB
MOV R7,B
MOV A,R3
MOV B,R4
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R5
MUL AB
ADD A,R7
MOV R7,A
MOV A,R3
ADDC A,B
MOV R3,A
MOV PSW.5,C
MOV A,R2
MOV B,R4
MUL AB
ADD A,R3
MOV R3,A
CLR A
ADDC A,B
MOV C,PSW.5
ADDC A,#0
MOV R2,A
RET
;********************************************************************
;将(R0)指向的内部RAM中的浮点整数除以(R1)指向的内部RAM中的浮点数,商送R4R3R2
;FDIV子程序使用累加器A,寄存器B,R0~R7,影响标志位F0,CY(除数尾数为0),调用FMLD、FSDT子程序
;******************************************************************
FDIV: LCALL FMLD
MOV A,R6
XRL A,R7
MOV C,ACC.7
MOV FG00,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 FG01
LCALL FSDT
MOV A,R7
RRC A
MOV R7,A
CLR C
SJMP FD1
FD2: CLR A
XCH A,R6
PUSH ACC
LCALL WDIV
POP ACC
ADD A,@R0
CLR C
SUBB A,@R1
MOV C,FG00
MOV ACC.7,C
MOV R4,A
CLR C
RET
;************************************************************************
WDIV: MOV A,R1
PUSH ACC
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
MOV R1,A
MOV A,R7
MOV R2,A
MOV A,R6
MOV R3,A
RET
;***************************************************************************
;功能:将FG04(数符)R2R3中的整数转换成三字节浮点数送(R1)指向的内部RAM单元中
;程序使用A,R1,R2,R3,R6,调用FSDT,FSTR子程序
;***************************************************************************
INTF: MOV R6,#10H ; 双字节整数 -> 三字节浮点数
SETB C ; FG04(数符)R2R3 -> @R1为首址的三字节
CLR PSW.5
LCALL FSDT
MOV A,R6
MOV C,FG04
MOV ACC.7,C
MOV R4,A
LCALL FSTR
RET
;*******************************************************************
FINT: CLR PSW.5 ;浮点数取整 (R0)(R0+1)(R0+2) -> FG04(数符)R2R3
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 FG04,C
CLR ACC.7
JNB ACC.6,FIN1
MOV R2,#00H
MOV R3,#00H
RET
FIN1: CJNE A,#11H,FIN2
FIN5: SETB PSW.5
MOV R2,#0FFH
MOV R3,#0FFH
RET
FIN2: JNC FIN5
FIN3: CJNE A,#10H,FIN4
RET
FIN4: CLR C
XCH A,R2
RRC A
XCH A,R2
XCH A,R3
RRC A
XCH A,R3
INC A
MOV FG02,C
SJMP FIN3
;************************************************************************8
IDTB: MOV A,@R0 ;R0为首址的2位十进制整数 -> R2R3二进制整数
MOV B,#10
MUL AB
INC R0
ADD A,@R0
MOV R3,A
MOV R2,#0
RET
;*************************************************************************
PDTB: MOV R3,#0 ;4位十进制小数 -> 二进制数小数,结果存R3R4中
MOV R4,#0 ;R0指向4位十进制数的最低位 R2待转换十进制数的位数
PDTL: MOV A,R3
MOV B,#9AH
MUL AB ; (R3)*9AH
MOV R5,B
XCH A,R4
MOV B,#19H
MUL AB ; (R4)*19H
ADD A,R4
MOV A,R5
ADDC A,B
MOV R5,A
MOV A,@R0
MOV B,#9AH
MUL AB ; ((R0))*9AH
ADD A,R5
MOV R4,A ; ****
CLR A
ADDC A,B
XCH A,R3
MOV B,#19H
MUL AB ; (R3)*19H
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
MOV A,@R0
MOV B,#19H
MUL AB ; ((R0))*19H
ADD A,R3
MOV R3,A
DEC R0
DJNZ R2,PDTL
RET
;***********************************************************************
FBTD: MOV A,@R0
MOV C,ACC.7
MOV FG04,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
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 FG06,FB4
DEC @R1
FB4: INC R1
MOV @R1,#1
JNB FG06,FB5
INC @R1
JNB FG07,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 FG06,FB9
DEC R6
JNB FG07,FB9
DEC R6
FB9: CJNE R6,#0,FB19
MOV R6,#5
JNB FG06,FB12
MOV R7,#1
JNB FG07,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,#10
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
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
ADD A,#0FDH
MOV R6,A
DEC R1
INC @R1
INC R1
SJMP FB5
FBX: SJMP FB7
FB19: MOV A,R2
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
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
ADD A,#4
MOV R6,A
DEC R1
DEC @R1
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
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -