?? float_math.txt
字號(hào):
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
MOV C, ACC.7
MOV PSW.5, C
MOV A, @R0
XRL A, @R1
MOV C, ACC.7
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
MOV ACC.7, 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 C, ACC.7
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.5
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
MOV ACC.7, 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 C, ACC.7
MOV FLAG38, C
XRL A, @R1
JNB ACC.7, F4_ABT
CPL FLAG3A
F4_ABT:MOV A, R0
PUSH ACC
MOV A, @R0
MOV C, ACC.6
MOV ACC.7, C
MOV R0, A
MOV A, R1
PUSH ACC
MOV A, @R1
MOV C, ACC.6
MOV ACC.7, C
MOV R1, A
F4_SDT1:CLR C
MOV A, R0
SUBB A, R1
JZ F4_ABTI
CLR PSW.5
CLR FLAG39
JB ACC.7, 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
SETB PSW.5
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
MOV ACC.7, 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_ABG: CPL PSW.5
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.5
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
JB PSW.5, 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
F4C: JB ACC.7, F4E ; 0E7H
F4D: MOV C, PSW.5
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.5
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
MOV PSW.5, 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
JB PSW.5, 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為底的浮點(diǎn)指數(shù)函數(shù)
;入口條件:操作數(shù)在TMP0中。使用TMP0,TMP1,TMP2
;出口信息:OV=0時(shí),結(jié)果仍在TMP0中,OV=1時(shí),溢出。
;影響資源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節(jié)
;-------------------------------------------
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 ;進(jìn)行加權(quán)運(yùn)算
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 ;尾數(shù)為零,冪為1.000000
MOV R5, #80H
MOV R6, #00H
MOV R7, #00H
CLR OV
RET
EXP2:
MOV R0, #TMP0
MOV A, @R0
MOV R4, A ;將指數(shù)復(fù)制到工作區(qū)
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
JB ACC.6, EXP5
CLR ACC.7
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
JB ACC.7, EXPJ2
MOV A, R1
SJMP EXP6
EXPJ2: MOV A, R1
CPL A
INC A
SJMP EXP6
EXP5: MOV A, #00H
EXP6: PUSH ACC ;暫時(shí)保存之
MOV R0, #TMP1
LCALL F4_STR
MOV R0, #TMP0
MOV R1, #TMP1
LCALL F4_SUB ;求指數(shù)的小數(shù)部分
MOV R0, #TMP0
LCALL F4_STR
PUSH DPH
PUSH DPL
MOV DPTR, #EXP_TABL
MOV TMP2, #41H
MOV TMP2+1, #00H
MOV TMP2+2, #00H
MOV TMP2+3, #00H
PLN1: CLR A ;計(jì)算指數(shù)的小數(shù)部分的冪
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 ;指向下一個(gè)系數(shù)
MOV R0, #TMP2
MOV R1, #TMP1
LCALL F4_ADD ;進(jìn)行代數(shù)加法運(yùn)算
MOV R0, #TMP2
LCALL F4_STR
CLR A ;讀取下一個(gè)系數(shù)的第一個(gè)字節(jié)
MOVC A, @A+DPTR
CJNE A, #40H, PLN2;是結(jié)束標(biāo)志嗎?
POP DPL
POP DPH
POP ACC ;取出指數(shù)的整數(shù)部分
ADD A, R4 ;按補(bǔ)碼加到冪的階碼上
MOV R4, A
MOV A, R4
CLR ACC.7 ;冪的符號(hào)為正
MOV R4, A
RET
PLN2:
MOV R0, #TMP0
MOV R1, #TMP2
LCALL F4_MUL ;進(jìn)行乘法運(yùn)算
MOV R0, #TMP2
LCALL F4_STR
LJMP PLN1 ;繼續(xù)下一項(xiàng)運(yùn)算
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 ;結(jié)束
;-------------------------------------------
; (R4)R5R6R7
;-------------------------------------------
RLN: MOV A, R5 ;浮點(diǎn)數(shù)規(guī)格化
ORL A, R6 ;尾數(shù)為零否?
ORL A, R7
JNZ RLN1
MOV R4, #0C1H ;階碼取最小值
RET
RLN1: MOV A, R5
JB ACC.7, RLN2 ;尾數(shù)最高位為一否?
CLR C ;不為一,左規(guī)一次
LCALL RL1
SJMP RLN ;繼續(xù)判斷
RLN2: CLR OV ;規(guī)格化結(jié)束
RET
RL1: MOV A, R7 ;第一操作數(shù)左規(guī)一次
RLC A ;尾數(shù)擴(kuò)大一倍
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 ;階碼下溢,操作數(shù)以零計(jì)
MOV R6, A
MOV R7, A
MOV R4, #0C1H
RL1E: CLR OV
RET
RR1: MOV A, R5 ;第一操作數(shù)右規(guī)一次
RRC A ;尾數(shù)縮小一半
MOV R5, A
MOV A, R6
RRC A
MOV R6, A
MOV A, R7
RRC A
MOV R7, A
INC R4 ;階碼加一
CLR OV ;清溢出標(biāo)志
CJNE R4, #40H, RR1E ;階碼上溢否?
MOV R4, #3FH ;階碼溢出
SETB OV
RR1E: RET
;-------------------------------------------
; 功能:浮點(diǎn)取整函數(shù)
;入口條件:操作數(shù)在[R0]中。
;出口信息:R4R5R6R7
;-------------------------------------------
FINT:
MOV A, @R0
MOV R4, A ;階存放在R4中
INC R0
MOV A, @R0 ;將尾數(shù)高字節(jié)存放在R5中
MOV R5, A
INC R0
MOV A, @R0 ;將尾數(shù)第二字節(jié)存放在R6中
MOV R4, A
INC R0
MOV A, @R0 ;將尾數(shù)第三字節(jié)存放在R7中
MOV R7, A
DEC R0 ;恢復(fù)數(shù)據(jù)指針
DEC R0
DEC R0
LCALL INT ;在工作寄存器中完成取整運(yùn)算
RET
INT: MOV A, R5
ORL A, R6
ORL A, R7
JNZ INTA
MOV R4, #41H ;尾數(shù)為零,階碼也清零,結(jié)束取整
RET
INTA: MOV A, R4
CLR ACC.7
JZ INTB ;階碼為零否?
JB ACC.6, INTB;階符為負(fù)否?
CLR ACC.6
CLR C
SUBB A, #18H ;階碼小于24否?
JC INTD
RET ;階碼大于24,已經(jīng)是整數(shù)
INTB: CLR A ;絕對(duì)值小于一,取整后正數(shù)為零,負(fù)數(shù)為負(fù)一
MOV R7, A
MOV R6, A
MOV R5, A
MOV R4, #41H
INTC: RET
INTD: CLR F0 ;舍尾標(biāo)志初始化
MOV A, R4
CLR ACC.7
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
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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -