📄 isomaths.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;位寻址区:20h-->24h即(00-->27h)用语一些数制转换计算,25H(28H-->2FH)用于标志
;26h-->2Ah(即30H-->57H):用于上位机通信
;2Bh-->2Fh(即58h-->7fh)用于与设备通信标志
;RAM 10H-->1FH用于上位机(即两组寄存器)
;RAM 30H-->3FH及浮点数运算
;RAM 40H-->4FH用于设备
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
NEGATIVE_FLAG BIT 28H ;用于浮点数转换
POINTER_FLAG BIT 29H ;用于小数点标志
FLOOP_COUNT EQU 30H ;用于浮点数及程序中的循环
R8 EQU 31H ;浮点数转化暂存地址
R9 EQU 32H ;用于浮点数
R10 EQU 33H ;用于浮点数
BCD_LEN EQU 34H ;用于BCD码的转换
REG_R0 EQU 35H ;暂存BCD码转化为浮点数的地址保护
REG_R1 EQU 36H
REG_R6 EQU 37H
REG_R7 EQU 38H
;以下是浮点数转化程序,针对ISOVEL数据格式编写
;***************************************
;四字节浮点数转换成双字节无符号整形(隐含1位小数点)
;由R0,R1指向要转换的数,转化后的结果存到r3(底位),r4(高位)
;R2(底位) R3 R4 R5(阶码)
;R3 R4
;***************************************
FTOB1: CLR NEGATIVE_FLAG
MOV DPL,R0 ;取数
MOV DPH,R1
MOVX A,@DPTR
MOV R2,A ;取底位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R5 ;特殊情况,0时此数位0
JNZ SIGB
MOV A,R2
JNZ SIGB
MOV A,R3
JNZ SIGB
MOV A,R4
JNZ SIGB
RET
SIGB: MOV A,R5 ;判正负
JNB ACC.7,SIGB0
SETB NEGATIVE_FLAG
SIGB0: CLR C
MOV A,R4
RLC A
MOV A,R5
RLC A
CLR C
SUBB A,#127
ADD A,#3 ;阶码加3相当于*8
MOV R5,A
MOV A,R4
SETB ACC.7 ;恢复隐含的1
MOV R4,A
MOV R7,A
MOV A,R3
MOV R6,A
MOV A,R2
MOV 21H,A
CLR C
XCH A,R7
RRC A
XCH A,R7
XCH A,R6
RRC A
XCH A,R6
XCH A,21H
RRC A
XCH A,21H
CLR C
XCH A,R7
RRC A
XCH A,R7
XCH A,R6
RRC A
MOV R6,A
XCH A,21H
RRC A
CLR C
ADD A,R2
MOV A,R6
ADDC A,R3
MOV R3,A
MOV A,R7
ADDC A,R4
MOV R4,A
JC SIGB1
SIGB2: MOV A,R5
CLR C
CJNE A,#15,SIGB3 ;阶码15,则为原数
RET
SIGB1: INC R5
SETB C
XCH A,R4
RRC A
XCH A,R4
XCH A,R3
RRC A
XCH A,R3
LJMP SIGB2
SIGB3: JC SIGB4
MOV R3,#0FFH ;数据超出2字节范围,简单的处理
MOV R4,#7FH
RET
SIGB4: MOV A,#15
CLR C
SUBB A,R5
MOV R5,A ;分离出右移次数
SIGB5: LCALL RIGHT
DJNZ R5,SIGB5 ;一位结束后R4,R3即为所得的数
JNB NEGATIVE_FLAG,SIGB6 ;
CLR C
MOV A,R3
CPL A
ADD A,#1
MOV R3,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
SIGB6: RET
;***************************************
;四字节浮点数转换成双字节无符号整形
;由R0,R1指向要转换的数,转化后的结果存到r3(底位),r4(高位)
;R2 R3 R4 R5
;R2 R3
;***************************************
FTOB: CLR NEGATIVE_FLAG
MOV DPL,R0 ;取数
MOV DPH,R1
MOVX A,@DPTR
MOV R2,A ;取底位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOVX A,@DPTR
MOV R4,A
INC DPTR
MOVX A,@DPTR
MOV R5,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R5
JNB ACC.7,FT_NEG0
SETB NEGATIVE_FLAG
FT_NEG0: MOV A,R5 ;特殊情况,0时此数位0
JNZ FT1
MOV A,R2
JNZ FT1
MOV A,R3
JNZ FT1
MOV A,R4
JNZ FT1
RET
FT1: CLR C
MOV A,R4
RLC A
MOV A,R5
RLC A
CLR C
SUBB A,#127
MOV R5,A
CLR C
CJNE A,#15,FI1 ;与15等,即不用移位,即为R4,R3,原数
RET
FI1: JC FI2
MOV R3,#0FFH ;数据超出2字节范围,简单的处理
MOV R4,#7FH
RET
FI2: MOV A,R4 ;恢复隐含的1
SETB ACC.7
MOV R4,A
MOV A,#15
CLR C
SUBB A,R5
MOV R5,A ;分离出右移次数
FI3: LCALL RIGHT
DJNZ R5,FI3 ;一位结束后R4,R3即为所得的数
JB NEGATIVE_FLAG,FI_NEG
RET
FI_NEG: CLR C
MOV A,R3
CPL A
ADD A,#1
MOV R3,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
RET
RIGHT: CLR C
XCH A,R4
RRC A
XCH A,R4
XCH A,R3
RRC A
XCH A,R3
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
B1TOF: CLR NEGATIVE_FLAG
MOV R9,R7 ;为子程序出口统一,暂存R6,R7地址
MOV R8,R6
MOV R6,#10H ;除法移位次数
MOV R7,#0 ;移位积存器清零
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR
MOV R4,A ;取高位
INC DPTR
MOVX A,@DPTR
MOV R3,A
INC DPTR
MOV R0,DPL
MOV R1,DPH
MOV A,R4
JNB ACC.7,LP ;判断正负
SETB NEGATIVE_FLAG
CLR C ;还原为原码
MOV A,R3
SUBB A,#1
MOV R3,A
MOV A,R4
SUBB A,#0
CPL A
MOV R4,A
MOV A,R3
CPL A
MOV R3,A
;以下是除10子程序,通过移位完成,入口R4高,R3底,被除数;出口R4高,R3底,商;R7用于移位,并存余数
LP: CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R7
RLC A
MOV R7,A
LP1: CLR C ;除以10分离出整数,和小数
MOV A,R7
SUBB A,#10 ;除10
JC SMALL
MOV R7,A ;存余数
INC R3
SJMP LP1
SMALL: DJNZ R6,LP
MOV R2,#0
MOV R6,#8H ;以下将R7中的小数部分转化为二进制小数,放于R2 ,R6用于循环8次
LP3: CLR C
MOV A,R7
ADDC A,R7
DA A
MOV B,A
ANL A,#0F0H ;分离出高4位,看是否有进位,由于除数是10 ,因此每次只能进位1位
JZ LP4
SETB C
MOV A,R2
RLC A
MOV R2,A
AJMP LP31
LP4: CLR C
MOV A,R2
RLC A
MOV R2,A
LP31: MOV A,B
ANL A,#0FH
MOV R7,A
DJNZ R6,LP3
MOV A,R2 ;0,不能规格化
JZ LP32
AJMP LP5
LP32: MOV A,R3
JZ LP33
SJMP LP5
LP33: MOV A,R4
JZ LP6
LP5: MOV R5,#142 ;15+127=142 阶码初始值
LP51: MOV A,R4 ;以下是规格化此浮点数
JB ACC.7,LPOVER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -