MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示.
;这是本人使用的MSC-51 3字节和4字节浮点数计算程序,主要用于数据采集及上传,经过IEEE转换,在上位机直接显示。 ;本人还有热电阻和热电偶温度查表计算程序,有需要可EMAIL:majingsong1@2911.net ; FLOATING PROGRAM ; ;########################################## ;########################################## ;----------------------------------------------- ; IEEE754 FLOAT CONVERT TO 4 BYTES FLOAT ; INPUT: ((R0))((R0)+1)((R0)+2)((R0)+3) IEEE-754 FLOAT ; OUTPUT: R4 R5R6R7 4 BYTES FLOAT ;----------------------------------------------- IEE_F:MOV A,@R0 JNZ CON_0 INC R0 MOV A,@R0 JNZ CON_1 INC R0 MOV A,@R0 JNZ CON_2 INC R0 MOV A,@R0 JNZ CON_3 DEC R0 DEC R0 DEC R0 RET CON_3:DEC R0 CON_2:DEC R0 CON_1:DEC R0 CON_0:CLR FLAG_0 INC R0 MOV A,@R0 RLC A MOV R5,A DEC R0 MOV A,@R0 RLC A MOV R4,A JNC SA_IE SETB FLAG_0 SA_IE: CLR C MOV A,R4 SUBB A,#7FH CLR C INC A ,C MOV C,FLAG_0 ,C MOV R4,A MOV A,R5 SETB C RRC A MOV R5,A INC R0 INC R0 MOV A,@R0 MOV R6,A INC R0 MOV A,@R0 MOV R7,A DEC R0 DEC R0 DEC R0 RET ;--------------------------------------------- ; 4 BYTES FLOAT CONVERT TO IEEE754 FLOAT ; INPUT: ((R0)) R2R3R4 4 BYTES FLOAT ; OUTPUT: ((R1)) ((R1)+1) ((R1)+2) ((R1)+3) ; IEEE-754 FLOAT ;--------------------------------------------- F_IEE: INC R0 MOV A, @R0 MOV R2, A INC R0 MOV A, @R0 MOV R3, A INC R0 MOV A, @R0 MOV R4, A DEC R0 DEC R0 DEC R0 MOV A,R2 JZ ZERO_IEE MOV A,@R0 MOV FLAG_0,C CLR ACC. JC F_FF DEC A CLR C ADD A,#7FH LJMP F_TR F_FF: CLR C SUBB A,#02H F_TR: MOV C,FLAG_0 RRC A MOV @R1,A INC R1 MOV A,R2 ,C MOV @R1,A INC R1 MOV A,R3 MOV @R1,A INC R1 MOV A,R4 MOV @R1,A FIEE_OFF:DEC R1 DEC R1 DEC R1 RET ZERO_IEE:MOV @R1,A INC R1 MOV @R1,A INC R1 MOV @R1,A INC R1 MOV @R1,A SJMP FIEE_OFF ;========================================== ; 2 BYTE MUL ; 0.R2R3 * 0.R4R5→0.R2R3R7 ;------------------------------------------ D2_MUL: 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 A, R3 ADDC A, B MOV R3, A , c MOV A, R2 MOV B, R4 MUL AB ADD A, R3 MOV R3, A CLR A ADDC A, B ADDC A, # MOV R2, A RET ;------------------------------ ; 2 BYTE DIV ; 0.R2R3R7R6 / 0.R4R5→0.R2R3 ; INPUT 0.R2R3 < 0.R4R5 ;------------------------------ D2_DIV: MOV A, R1 PUSH ACC MOV B, #10H A2O: 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 , C CLR C SUBB A, R5 MOV R1, A MOV A, R2 SUBB A, R4 , A2S JC A2R A2S: MOV R2, A MOV A, R1 MOV R3, A INC R6 A2R: DJNZ B, A2O POP ACC MOV R1, A MOV A, R7 MOV R2, A MOV A, R6 MOV R3, A RET ;-------------------------------------- ; 3 BYTE FLOAT LOAD ; ((R0))→R6,((R0)+1)→R2,((R0)+2)→R3 ; ((R1))→R7,((R1)+1)→R4,((R0)+2)→R5 ;-------------------------------------- F3_MLD: MOV A, @R0 MOV R6, A INC R0 MOV A, @R0 MOV R2, A INC R0 MOV A, @R0 MOV R3, A DEC R0 DEC R0 MOV A, @R1 MOV R7, A INC R1 MOV A, @R1 MOV R4, A INC R1 MOV A, @R1 MOV R5, A DEC R1 DEC R1 RET ;-------------------------------------- ; 3 BYTE FLOAT STANDED ;-------------------------------------- F3_SDT: JC M3A MOV C, FLAG39 , M3B MOV A, R2 RRC A MOV R2, A MOV A, R3 RRC A MOV R3, A INC R6 RET M3B: MOV A, R4 RRC A MOV R4, A MOV A, R5 RRC A MOV R5, A INC R7 RET M3A: MOV A, R2 JNZ M3C CJNE R3, #, M3D MOV R6, #41H M3E: RET , M3E MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A CLR PSW. DEC R6 SJMP M3A RET ;-------------------------------------- ; 3 BYTE FLOAT ADD OR SUB ; R6R2R3 + R7R4R5→R4R2R3 ; R6R2R3 - R7R4R5→R4R2R3 ; FLAG3A = 0 ADD FLAG3A = 1 SUB ;-------------------------------------- F3_ABP: MOV A, R6 MOV FLAG38, C XRL A, R7 , SQ CPL FLAG3A MOV A, R6 , C MOV R6, A MOV A, R7 , C MOV R7, A SQ: CLR C MOV A, R6 SUBB A, R7 JZ ST CLR PSW. CLR FLAG39 , SW CJNE R4, #00H, SE CJNE R5, #00H, SE ST: JB FLAG3A, SY MOV A, R3 ADD A, R5 MOV R3, A MOV A, R2 ADDC A, R4 MOV R2, A JNC SD SETB FLAG39 CLR C LCALL F3_SDT SD: MOV A, R6 MOV C, FLAG38 , C XCH A, R4 MOV R6, A RET SW: CJNE R2, #00H, SF CJNE R3, #00H, SF MOV A, R7 MOV R6, A SJMP ST CLR C LCALL F3_SDT SJMP SQ SY: MOV A, R3 CLR C SUBB A, R5 MOV R3, A MOV A, R2 SUBB A, R4 MOV R2, A JNC SL CLR A CLR C SUBB A, R3 MOV R3, A CLR A SUBB A, R2 MOV R2, A CPL FLAG38 SL: SETB C SJMP SF ;-------------------------------------- ;3 BYTE FLOAT ADD ; ((R0))((R0)+1)((R0)+2) + ((R1))((R1)+1) ; ((R1)+2)→R4R2R3 ; FLAG3A = 0 ;-------------------------------------- F3_ADD: CLR FLAG3A LCALL F3_MLD LCALL F3_ABP RET ;-------------------------------------- ; 3 BYTE SUB ; ((R0))((R0)+1)((R0)+2) - ; ((R1))((R1)+1)((R1)+2)→R4R2R3 ; FLAG3A = 1 ;-------------------------------------- F3_SUB: SETB FLAG3A LCALL F3_MLD LCALL F3_ABP RET ;-------------------------------------- ; 3 BYTE FLOAT MUL ; ((R0))((R0)+1)((R0)+2) * ; ((R1))((R1)+1)((R1)+2)→R4R2R3 ;-------------------------------------- F3_MUL: LCALL F3_MLD MOV A, R6 XRL A, R7 MOV FLAG38, C LCALL D2_MUL MOV A, R7 , C MOV A, @R0 ADD A, @R1 MOV R6, A SETB C LCALL F3_SDT MOV A, R6 MOV C, FLAG38 , C MOV R4, A RET ;-------------------------------------- ; 3 BYTE FLOAT DIV ; ((R0))((R0)+1)((R0)+2) / ; ((R1))((R1)+1)((R1)+2)→R4(阶)R2R3 ; C = 0 NORMAL ,C = 1 DIV BY 0 ;-------------------------------------- F3_DIV: LCALL F3_MLD MOV A, R6 XRL A, R7 MOV FLAG38, C CLR A MOV R6, A MOV R7, A CJNE R4, #00H, TY CJNE R5, #00H, TY SETB C RET TY: MOV A, R3 SUBB A, R5 MOV A, R2 SUBB A, R4 JC TU CLR PSW. CLR FLAG39 LCALL F3_SDT MOV A, R7 RRC A MOV R7, A CLR C SJMP TY TU: CLR A XCH A, R6 PUSH ACC LCALL D2_DIV POP ACC ADD A, @R0 CLR C SUBB A, @R1 MOV C, FLAG38 , C MOV R4, A CLR C RET ;------------------------------- ; 3BYTE FLOAT STORE ; R4R2R3 TO (R1)(R1+1)(R1+2) ;------------------------------- F3_STR: 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 ;-------------------------------- ; 3 BYTE FLOAT SQRT ; F0 = 0 NORMAL ,F0 = 1 ERROR ;-------------------------------- F3_SQRT:MOV A, @R0 , BV MOV @R1, A INC R0 INC R1 MOV A, @R0 MOV @R1, A INC R0 INC R1 MOV A, @R0 MOV @R1, A DEC R0 DEC R0 DEC R1 DEC R1 BM: LCALL F3_DIV MOV R6, A MOV A, @R1 MOV R7, A INC R1 MOV A, @R1 MOV R4, A INC R1 MOV A, @R1 MOV R5, A DEC R1 DEC R1 CLR FLAG3A LCALL F3_ABP DEC R4 CLR PSW. MOV A, R4 MOV B, R7 CJNE A, B, BN MOV A, R5 SUBB A, R3 ANL A, #0FCH MOV R7, A MOV A, R6 SUBB A, R2 JNZ BN CJNE R7, #00H, BN BN: LCALL F3_STR , BM RET RET ;------------------------------------ ; 3 BYTE BIN TO 4 BYTE FLOAT ; INPUT ADDRESS (R0),OUTPUT ADDRESS (R1) ;------------------------------------ F3_BTF:MOV A, #10H MOV R2, A MOV A, @R0 MOV R3, A INC R0 MOV A, @R0 MOV R4, A DEC R0 MOV A, R3 ORL A, R4 JNZ FRLN1 MOV R2, A MOV R3, A MOV R4, A JMP FRLN2 FRLN1: MOV A, R3 , FRLN2 LCALL FRL1 SJMP FRLN1 FRLN2: INC R1 INC R1 MOV A, R4 MOV @R1, A DEC R1 MOV A, R3 MOV @R1, A DEC R1 MOV A, R2 CLR ACC. CLR ACC. MOV @R1, A RET FRL1: CLR C MOV A, R4 RLC A MOV R4, A MOV A, R3 RLC A MOV R3, A DEC R2 MOV A, R2 XRL A, #0C0H JNZ FRL1E MOV R2, A MOV R3, A MOV R4, A FRL1E: RET ;------------------------------------ ; 3 BYTE FLOAT BIN TO DEC ; INPUT DATA: FLAG3E = 0 1 <= DATA < 10 ; FLAG3E = 1 FLAG3F = 0 0.2 <= DATA < 2 ; FLAG3E = 1 FLAG3F = 1 0.4 <= DATA < 4 ;------------------------------------ F3_BTD: MOV A, @R0 MOV FLAG3C, C , 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, #00H, PA CJNE R3, #00H, PA 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 PL: DEC R1 DEC R1 DEC R1 DEC R1 DEC R1 RET PA: MOV @R1, #00H JB FLAG3E, PB DEC @R1 PB: INC R1 MOV @R1, #01H JNB FLAG3E, PD INC @R1 JNB FLAG3F, PD INC @R1 PD: MOV A, R6 CLR C SUBB A, @R1 JZ PX , PE PM: DEC @R1 DEC @R1 DEC @R1 DEC @R1 PZ: MOV A, R6 CLR C SUBB A, @R1 JZ PY , PF PQ: JNB FLAG3E, PG DEC R6 JNB FLAG3F, PG DEC R6 PG: CJNE R6, #00H, PH MOV R6, #05H JNB FLAG3E, PI MOV R7, #01H JNB FLAG3F, PJ INC R7 PJ: CLR A CLR C PK: XCH A, R3 RLC A XCH A, R3 XCH A, R2 RLC A XCH A, R2 RLC A DJNZ R7, PK DEC R6 MOV @R1, A INC R1 PI: MOV A, R3 MOV B, #0AH MUL AB MOV R3, A MOV R7,B MOV A, R2 MOV B, #0AH MUL AB ADD A, R7 MOV R2, A CLR A ADDC A, B MOV @R1, A INC R1 DJNZ R6, PI SJMP PL PX: MOV A, R2 SUBB A, #80H JC PM PE: MOV R5, #0CDH MOV R4, #0CCH LCALL D2_MUL MOV A, R2 , PN MOV A, R7 ORL C, ACC. MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A DEC R6 PT: MOV A, R6 ADD A, #0FDH MOV R6, A DEC R1 INC @R1 INC R1 SJMP PD TPS: SJMP PZ PH: MOV A, R2 RRC A MOV R2, A MOV A, R3 RRC A MOV R3, A INC R6 SJMP PG PY: MOV A, #0CBH CLR C SUBB A, R3 MOV A, #0CCH SUBB A, R2 JC PQ PF: MOV R4, #0A0H MOV R5, #00H LCALL D2_MUL MOV A, R2 , PR MOV A, R7 ORL C, ACC. MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A DEC R6 PU: MOV A, R6 ADD A, #04H MOV R6, A DEC R1 DEC @R1 INC R1 SJMP TPS PN: MOV A, R7 , PT MOV A, R3 ORL A, #01H MOV R3, A SJMP PT PR: MOV A, R7 , PU MOV A, R3 ORL A, #01H MOV R3, A SJMP PU ;----------------------------------- ; 4 BITE FLOAT MUL ;((R0))((R0)+1)((R0)+2)((R0)+3)* ; ((R1))((R1)+1)((R1)+2)((R1)+3) ; TO R4R5R6R7 ;----------------------------------- F4_MUL: LCALL F4_LD INC R1 MOV A, R0 PUSH ACC LCALL D3_MUL POP ACC MOV R0, A DEC R1 MOV A, R2 , C MOV A, @R0 XRL A, @R1 MOV FLAG38, C MOV A, @R0 ADD A, @R1 XCH A, R0 PUSH ACC SETB C LCALL F4_STD POP ACC XCH A, R0 MOV C, FLAG38 , C MOV R4, A RET ;----------------------------------- ; 4 BITE FLOAT DIV ;((R0))((R0)+1)((R0)+2)((R0)+3)/ ; ((R1))((R1)+1)((R1)+2)((R1)+3) ; TO R4R5R6R7, ; C=0 NORMAL, C=1 DIV BY 0 ;----------------------------------- F4_DIV: LCALL F4_LD MOV A, @R0 XRL A, @R1 MOV FLAG38, C CLR A MOV R5, A MOV R6, A MOV R7, A INC R1 CJNE @R1, #00H, L4A INC R1 CJNE @R1, #00H, L4B INC R1 CJNE @R1, #00H, L4C DEC R1 DEC R1 DEC R1 SETB C RET L4C: DEC R1 L4B: DEC R1 L4A: DEC R1 MOV A, @R0 XCH A, R0 INC R1 PUSH ACC L4E: MOV A, R4 INC R1 INC R1 SUBB A, @R1 MOV A, R3 DEC R1 SUBB A, @R1 MOV A, R2 DEC R1 SUBB A, @R1 JC L4D CLR PSW. CLR FLAG39 LCALL F4_STD MOV A, R5 RRC A MOV R5, A CLR C SJMP L4E L4D: MOV A, R0 PUSH ACC LCALL D3_DIV POP ACC DEC R1 XCH A, R0 POP ACC XCH A, R0 CLR C SUBB A, @R1 MOV C, FLAG38 , C MOV R4, A CLR C RET ;----------------------------------------- ; 4 BITE FLOAT LOAD ; ((R0)+1)((R0)+2)((R0)+3) TO R2R3R4 ;----------------------------------------- F4_LD: INC R0 MOV A, @R0 MOV R2, A INC R0 MOV A, @R0 MOV R3, A INC R0 MOV A, @R0 MOV R4, A DEC R0 DEC R0 DEC R0 RET ;----------------------------------------- ; 4 BITE FLOAT ADD OR SUB ; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2) ; ((R1)+3) TO R4R5R6R7 ; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2) ; ((R1)+3) TO R4R5R6R7 ; FLAG3A=0 ADD, FLAG3A=1 SUB ;----------------------------------------- F4_AB: INC R1 MOV A, @R1 MOV R5, A INC R1 MOV A, @R1 MOV R6, A INC R1 MOV A, @R1 MOV R7, A DEC R1 DEC R1 DEC R1 MOV A, @R0 MOV FLAG38, C XRL A, @R1 , F4_ABT CPL FLAG3A F4_ABT:MOV A, R0 PUSH ACC MOV A, @R0 , C MOV R0, A MOV A, R1 PUSH ACC MOV A, @R1 , C MOV R1, A F4_SDT1:CLR C MOV A, R0 SUBB A, R1 JZ F4_ABTI CLR PSW. CLR FLAG39 , F4_ABX CJNE R5, #00H, F4_ABG CJNE R6, #00H, F4_ABG CJNE R7, #00H, F4_ABG MOV A, R0 MOV R1, A F4_ABTI:JB FLAG3A, F4_ABS MOV A, R4 ADD A, R7 MOV R7, A MOV A, R3 ADDC A, R6 MOV R6, A MOV A, R2 ADDC A, R5 MOV R5, A JNC F4_ABA SETB FLAG39 CLR C F4_ABL: LCALL F4_STD MOV A, R1 MOV R0, A F4_ABA: POP ACC MOV R1, A POP ACC XCH A, R0 MOV C, FLAG38 , C XCH A, R4 RET F4_ABX: CJNE R2, #00H, F4_ABG1 CJNE R3, #00H, F4_ABG1 CJNE R4, #00H, F4_ABG1 MOV A, R1 MOV R0, A SJMP F4_ABTI F4_ABG1:CLR C LCALL F4_STD SJMP F4_SDT1 F4_ABS: CLR C MOV A, R4 SUBB A, R7 MOV R7, A MOV A, R3 SUBB A, R6 MOV R6, A MOV A, R2 SUBB A, R5 MOV R5, A JNC F4_ABS1 CLR A CLR C SUBB A, R7 MOV R7, A CLR A SUBB A, R6 MOV R6, A CLR A SUBB A, R5 MOV R5, A CPL FLAG38 F4_ABS1:SETB C CLR PSW. LCALL F4_STD SJMP F4_ABA ;----------------------------------------- ; 4 BITE FLOAT ADD ; ((R0))(R2)(R3)(R4) + ((R1))((R1)+1)((R1)+2) ; ((R1)+3) TO R4R5R6R7 ; FLAG3A=0 ADD ;----------------------------------------- F4_ADD: CLR FLAG3A LCALL F4_LD LCALL F4_AB RET ;----------------------------------------- ; 4 BITE FLOAT SUB ; ((R0))(R2)(R3)(R4) - ((R1))((R1)+1)((R1)+2) ; ((R1)+3) TO R4R5R6R7 ; FLAG3A=1 SUB ;----------------------------------------- F4_SUB: SETB FLAG3A LCALL F4_LD LCALL F4_AB RET ;----------------------------------------- ; 4 BITE FLOAT STANDED ; F0=0 R0R2R3R4 ; F0=1 R1R5R6R7 ;----------------------------------------- F4_STD: JC F4A MOV C, FLAG39 , F4B MOV A, R2 RRC A MOV R2, A MOV A, R3 RRC A MOV R3, A MOV A, R4 RRC A MOV R4, A INC R0 RET F4B: MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A INC R1 RET F4A: MOV A, R5 JNZ F4C CJNE R6, #00H, F4D CJNE R7, #00H, F4D F4E: RET , F4E ; 0E7H MOV A, R7 RLC A MOV R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A CLR PSW. DEC R0 SJMP F4A ;----------------------------------- ; 4 BYTE FLOAT STORE ; R4R5R6R7 TO (R0)(R0+1)(R0+2)(R0+3) ;----------------------------------- F4_STR: MOV A, R4 MOV @R0, A INC R0 MOV A, R5 MOV @R0, A INC R0 MOV A, R6 MOV @R0, A INC R0 MOV A, R7 MOV @R0, A DEC R0 DEC R0 DEC R0 RET ;------------------------------------------- ; 3 BYTE DIV ; 0.R2R3R4R5R6R7 / ((R1))((R1)+1)((R1)+2) ; TO (R0)(R0+1)(R0+2)(R0+3) ;------------------------------------------- D3_DIV: MOV R0, #18H INC R1 INC R1 S3D: CLR C MOV A, R7 RLC A MOV R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A MOV A, R4 RLC A MOV R4, A XCH A, R3 RLC A XCH A, R3 XCH A, R2 RLC A XCH A, R2 , C CLR C SUBB A, @R1 DEC R1 MOV A, R3 SUBB A, @R1 DEC R1 MOV B, A MOV A, R2 SUBB A, @R1 INC R1 INC R1 , S3A JC S3B S3A: CLR C MOV R2, A MOV A, R4 SUBB A, @R1 MOV R4, A MOV R3, B INC R7 S3B: DJNZ R0, S3D DEC R1 DEC R1 RET ;--------------------------------------- ; 3 BYTE MUL ; 0.R2R3R4 * 0.((R1))((R1)+1)((R1)+2) ; TO R5R6R2R3R4 ;--------------------------------------- D3_MUL: MOV R0, #19H CLR C CLR A MOV R5, A MOV R6, A MOV R7, A K3B: MOV A, R5 RRC A MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A XCH A, R2 RRC A XCH A, R2 XCH A, R3 RRC A XCH A, R3 XCH A, R4 RRC A XCH A, R4 DJNZ R0, K3A RET K3A: JNC K3B INC R1 INC R1 ADD A, @R1 MOV R7, A MOV A, R6 DEC R1 ADDC A, @R1 MOV R6, A MOV A, R5 DEC R1 ADDC A, @R1 MOV R5, A SJMP K3B ;------------------------------------------- ; 功能:以e为底的浮点指数函数 ;入口条件:操作数在TMP0中。使用TMP0,TMP1,TMP2 ;出口信息:OV=0时,结果仍在TMP0中,OV=1时,溢出。 ;影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节 ;------------------------------------------- F4_EXP: MOV R1, #TMP1 MOV A, #01H ; e(x) = 2(1.442695 * x) MOV @R1, A INC R1 MOV A, #0B8H MOV @R1, A INC R1 MOV A, #0AAH MOV @R1, A INC R1 MOV A, #3BH MOV @R1, A MOV R0, #TMP0 MOV R1, #TMP1 LCALL F4_MUL ;进行加权运算 MOV R0, #TMP0 LCALL F4_STR E20: MOV R0, #TMP0 MOV A, @R0 MOV R4, A INC R0 MOV A, @R0 MOV R5, A INC R0 MOV A, @R0 MOV R6, A INC R0 MOV A, @R0 MOV R7, A MOV A, R5 ORL A, R6 ORL A, R7 JNZ EXP2 EXP1: MOV R4, #01H ;尾数为零,幂为1.000000 MOV R5, #80H MOV R6, #00H MOV R7, #00H CLR OV RET EXP2: MOV R0, #TMP0 MOV A, @R0 MOV R4, A ;将指数复制到工作区 INC R0 MOV A, @R0 MOV R5, A INC R0 MOV A, @R0 MOV R6, A INC R0 MOV A, @R0 MOV R7, A LCALL INT EXP4: MOV A, R4 , EXP5 CLR ACC. MOV R0, A CLR C MOV R1, #00H MOV A, R5 PUSH ACC EXPJ1: MOV A, R5 RLC A MOV R5, A MOV A, R1 RLC A MOV R1, A DJNZ R0, EXPJ1 POP ACC MOV R5, A MOV A, R4 , EXPJ2 MOV A, R1 SJMP EXP6 EXPJ2: MOV A, R1 CPL A INC A SJMP EXP6 EXP5: MOV A, #00H EXP6: PUSH ACC ;暂时保存之 MOV R0, #TMP1 LCALL F4_STR MOV R0, #TMP0 MOV R1, #TMP1 LCALL F4_SUB ;求指数的小数部分 MOV R0, #TMP0 LCALL F4_STR PUSH DPH PUSH DPL MOV DPTR, #EXP_TABL MOV TMP2, #41H , #00H , #00H , #00H PLN1: CLR A ;计算指数的小数部分的幂 MOV R0, #TMP1 MOVC A, @A+DPTR MOV @R0, A INC DPTR INC R0 CLR A MOVC A, @A+DPTR MOV @R0, A INC DPTR INC R0 CLR A MOVC A, @A+DPTR MOV @R0, A INC DPTR INC R0 CLR A MOVC A, @A+DPTR MOV @R0, A INC DPTR ;指向下一个系数 MOV R0, #TMP2 MOV R1, #TMP1 LCALL F4_ADD ;进行代数加法运算 MOV R0, #TMP2 LCALL F4_STR CLR A ;读取下一个系数的第一个字节 MOVC A, @A+DPTR CJNE A, #40H, PLN2;是结束标志吗? POP DPL POP DPH POP ACC ;取出指数的整数部分 ADD A, R4 ;按补码加到幂的阶码上 MOV R4, A MOV A, R4 CLR ACC. ;幂的符号为正 MOV R4, A RET PLN2: MOV R0, #TMP0 MOV R1, #TMP2 LCALL F4_MUL ;进行乘法运算 MOV R0, #TMP2 LCALL F4_STR LJMP PLN1 ;继续下一项运算 EXP_TABL: DB 77H, 0B1H, 0C9H, 00H ; 1.3564 * 10(-3) DB 7AH, 0A1H, 68H, 00H ; 9.8514 * 10(-3) DB 7CH, 0E3H, 4FH, 00H ; 0.055495 DB 7EH, 0F5H, 0E7H, 00H ; 0.24014 DB 00H, 0B1H, 72H, 00H ; 0.69315 DB 01H, 80H, 00H, 00H ; 1.000000 DB 40H, 40H, 40H, 40H ;结束 ;------------------------------------------- ; (R4)R5R6R7 ;------------------------------------------- RLN: MOV A, R5 ;浮点数规格化 ORL A, R6 ;尾数为零否? ORL A, R7 JNZ RLN1 MOV R4, #0C1H ;阶码取最小值 RET RLN1: MOV A, R5 , RLN2 ;尾数最高位为一否? CLR C ;不为一,左规一次 LCALL RL1 SJMP RLN ;继续判断 RLN2: CLR OV ;规格化结束 RET RL1: MOV A, R7 ;第一操作数左规一次 RLC A ;尾数扩大一倍 MOV R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A DEC R4 ;阶码减一 CJNE R4, #0C0H, RL1E ;阶码下溢否? CLR A MOV R5, A ;阶码下溢,操作数以零计 MOV R6, A MOV R7, A MOV R4, #0C1H RL1E: CLR OV RET RR1: MOV A, R5 ;第一操作数右规一次 RRC A ;尾数缩小一半 MOV R5, A MOV A, R6 RRC A MOV R6, A MOV A, R7 RRC A MOV R7, A INC R4 ;阶码加一 CLR OV ;清溢出标志 CJNE R4, #40H, RR1E ;阶码上溢否? MOV R4, #3FH ;阶码溢出 SETB OV RR1E: RET ;------------------------------------------- ; 功能:浮点取整函数 ;入口条件:操作数在[R0]中。 ;出口信息:R4R5R6R7 ;------------------------------------------- FINT: MOV A, @R0 MOV R4, A ;阶存放在R4中 INC R0 MOV A, @R0 ;将尾数高字节存放在R5中 MOV R5, A INC R0 MOV A, @R0 ;将尾数第二字节存放在R6中 MOV R4, A INC R0 MOV A, @R0 ;将尾数第三字节存放在R7中 MOV R7, A DEC R0 ;恢复数据指针 DEC R0 DEC R0 LCALL INT ;在工作寄存器中完成取整运算 RET INT: MOV A, R5 ORL A, R6 ORL A, R7 JNZ INTA MOV R4, #41H ;尾数为零,阶码也清零,结束取整 RET INTA: MOV A, R4 CLR ACC. JZ INTB ;阶码为零否? , INTB;阶符为负否? CLR ACC. CLR C SUBB A, #18H ;阶码小于24否? JC INTD RET ;阶码大于24,已经是整数 INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一 MOV R7, A MOV R6, A MOV R5, A MOV R4, #41H INTC: RET INTD: CLR F0 ;舍尾标志初始化 MOV A, R4 CLR ACC. MOV R0, A CLR A MOV R1, A MOV R2, A MOV R3, A CLR C INTE: MOV A, R7 RLC A MOV R7, A MOV A, R6 RLC A MOV R6, A MOV A, R5 RLC A MOV R5, A MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A MOV A, R1 RLC A MOV R1, A DJNZ R0, INTE ;阶码 MOV A, R4 CLR ACC. MOV R0, A MOV A, #18H CLR C SUBB A, R0 MOV R0, A INTF: CLR C MOV A, R3 RLC A MOV R3, A MOV A, R2 RLC A MOV R2, A MOV A, R1 RLC A MOV R1, A DJNZ R0, INTF MOV A, R3 MOV R7, A MOV A, R2 MOV R6, A MOV A, R1 MOV R5, A RET