?? MCS-51浮點運算子程序庫及其使用說明.txt
字號:
EXP2: MOV A,R2 ;將指數復制到第二工作區
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
MOV C,1FH
MOV 1EH,C
LCALL INT ;對第一區取整
MOV A,R3
JZ EXP4
EXP3: CLR C ;使尾數高字節R3對應一個字節整數
RRC A
INC R2
CJNE R2,#8,EXP3
EXP4: MOV R3,A
JNB 1FH,EXP5
CPL A ;并用補碼表示
INC A
EXP5: PUSH ACC ;暫時保存之
LCALL RLN ;重新規格化
CPL 1FH
SETB F0
LCALL AS1 ;求指數的小數部分
LCALL MOV0 ;回傳指數的小數部分
LCALL FPLN ;通過多項式計算指數的小數部分的冪
DB 77H,0B1H,0C9H;1.3564×10-3
DB 7AH,0A1H,68H;9.8514×10-3
DB 7CH,0E3H,4FH;0.055495
DB 7EH,0F5H,0E7H;0.24014
DB 0,0B1H,72H;0.69315
DB 1,80H,0 ;1.00000
DB 40H ;結束
POP ACC ;取出指數的整數部分
ADD A,R2 ;按補碼加到冪的階碼上
MOV R2,A
CLR 1FH ;冪的符號為正
LJMP MOV0 ;將冪傳回[R0]中
(24)標號: DTOF 功能:雙字節十六進制定點數轉換成格式化浮點數
入口條件:雙字節定點數的絕對值在[R0]中,數符在位1FH中,整數部分的位數在A中。
出口信息:轉換成格式化浮點數在[R0]中(三字節)。
影響資源:PSW、A、R2、R3、R4、位1FH 堆棧需求: 6字節
DTOF: MOV R2,A ;按整數的位數初始化階碼
MOV A,@R0 ;將定點數作尾數
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
LCALL RLN ;進行規格化
LJMP MOV0 ;傳送結果到[R0]中
(25) 標號: FTOD 功能:格式化浮點數轉換成雙字節定點數
入口條件:格式化浮點操作數在[R0]中。
出口信息:OV=1時溢出,OV=0時轉換成功:定點數的絕對值在[R0]中(雙字節),數符
在位1FH中,F0=1 時為整數,CY=1時為一字節整數一字節小數,否則為純小數。
影響資源:PSW、A、B、R2、R3、R4、位1FH 堆棧需求: 6字節
FTOD: LCALL MVR0 ;將[R0]傳送到第一工作區
MOV A,R2
JZ FTD4 ;階碼為零,純小數
JB ACC.7,FTD4;階碼為負,純小數
SETB C
SUBB A,#10H
JC FTD1
SETB OV ;階碼大于16,溢出
RET
FTD1: SETB C
MOV A,R2
SUBB A,#8 ;階碼大于8否?
JC FTD3
FTD2: MOV B,#10H ;階碼大于8,按雙字節整數轉換
LCALL FTD8
SETB F0 ;設立雙字節整數標志
CLR C
CLR OV
RET
FTD3: MOV B,#8 ;按一字節整數一字節小數轉換
LCALL FTD8
SETB C ;設立一字節整數一字節小數標志
CLR F0
CLR OV
RET
FTD4: MOV B,#0 ;按純小數轉換
LCALL FTD8
CLR OV ;設立純小數標志
CLR F0
CLR C
RET
FTD8: MOV A,R2 ;按規定的整數位數進行右規
CJNE A,B,FTD9
MOV A,R3 ;將雙字節結果傳送到[R0]中
MOV @R0,A
INC R0
MOV A,R4
MOV @R0,A
DEC R0
RET
FTD9: CLR C
LCALL RR1 ;右規一次
SJMP FTD8
(26) 標號: BTOF 功能:浮點BCD碼轉換成格式化浮點數
入口條件:浮點BCD碼操作數在[R0]中。
出口信息:轉換成的格式化浮點數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節
BTOF: INC R0 ;判斷是否為零。
INC R0
MOV A,@R0
MOV R7,A
DEC R0
MOV A,@R0
MOV R6,A
DEC R0
ORL A,R7
JNZ BTF0
MOV @R0,#41H;為零,轉換結束。
RET
BTF0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存數符。
CLR 1FH ;以絕對值進行轉換。
MOV C,ACC.6 ;擴充階碼為八位。
MOV ACC.7,C
MOV @R0,A
JNC BTF1
ADD A,#19 ;是否小于1E-19?
JC BTF2
MOV @R0,#41H;小于1E-19時以0計。
INC R0
MOV @R0,#0
INC R0
MOV @R0,#0
DEC R0
DEC R0
RET
BTF1: SUBB A,#19
JC BTF2
MOV A,#3FH ;大于1E19時封頂。
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
INC R0
MOV @R0,#0FFH
INC R0
MOV @R0,#0FFH
DEC R0
DEC R0
RET
BTF2: CLR A ;準備將BCD碼尾數轉換成十六進制浮點數。
MOV R4,A
MOV R3,A
MOV R2,#10H ;至少兩個字節。
BTF3: MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
JNB ACC.7,BTF3;直到尾數規格化。
MOV A,R6 ;四舍五入。
ADD A,#0B0H
CLR A
ADDC A,R4
MOV R4,A
CLR A
ADDC A,R3
MOV R3,A
JNC BTF4
MOV R3,#80H
INC R2
BTF4: MOV DPTR,#BTFL;準備查表得到十進制階碼對應的浮點數。
MOV A,@R0
ADD A,#19 ;計算表格偏移量。
MOV B,#3
MUL AB
ADD A,DPL
MOV DPL,A
JNC BTF5
INC DPH
BTF5: CLR A ;查表。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
LCALL MUL1 ;將階碼對應的浮點數和尾數對應的浮點數相乘。
MOV C,1DH ;取出數符。
MOV 1FH,C
LJMP MOV0 ;傳送轉換結果。
(27) 標號: FTOB 功能:格式化浮點數轉換成浮點BCD碼
入口條件:格式化浮點操作數在[R0]中。
出口信息:轉換成的浮點BCD碼仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1DH~1FH 堆棧需求:6字節
FTOB: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ FTB0
MOV @R0,#41H
RET
FTB0: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C
CLR ACC.7
MOV @R0,A
LCALL MVR0
MOV DPTR,#BFL0;絕對值大于或等于1時的查表起點。
MOV B,#0 ;十的0次冪。
MOV A,R2
JNB ACC.7,FTB1
MOV DPTR,#BTFL;絕對值小于1E-6時的查表起點。
MOV B,#0EDH ;十的-19次冪。
ADD A,#16
JNC FTB1
MOV DPTR,#BFLN;絕對值大于或等于1E-6時的查表起點。
MOV B,#0FAH ;十的-6次冪。
FTB1: CLR A ;查表,找到一個比待轉換浮點數大的整數冪。
MOVC A,@A+DPTR
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
MOV A,#1
MOVC A,@A+DPTR
MOV R6,A
MOV A,#2
MOVC A,@A+DPTR
MOV R7,A
MOV A,R5 ;和待轉換浮點數比較。
CLR C
SUBB A,R2
JB ACC.7,FTB2;差為負數。
JNZ FTB3
MOV A,R6
CLR C
SUBB A,R3
JC FTB2
JNZ FTB3
MOV A,R7
CLR C
SUBB A,R4
JC FTB2
JNZ FTB3
MOV R5,B ;正好是表格中的數。
INC R5 ;冪加一。
MOV R6,#10H ;尾數為0·1000。
MOV R7,#0
SJMP FTB6 ;傳送轉換結果。
FTB2: INC DPTR ;準備表格下一項。
INC DPTR
INC DPTR
INC B ;冪加一。
SJMP FTB1 ;
FTB3: PUSH B ;保存冪值。
LCALL DIV3 ;相除,得到一個二進制浮點數的純小數。
FTB4: MOV A,R2 ;取階碼。
JZ FTB5 ;為零嗎?
CLR C
LCALL RR1 ;右規。
SJMP FTB4
FTB5: POP ACC ;取出冪值。
MOV R5,A ;作為十進制浮點數的階碼。
LCALL HB2 ;轉換尾數的十分位和百分位。
MOV R6,A
LCALL HB2 ;轉換尾數的千分位和萬分位。
MOV R7,A
MOV A,R3 ;四舍五入。
RLC A
CLR A
ADDC A,R7
DA A
MOV R7,A
CLR A
ADDC A,R6
DA A
MOV R6,A
JNC FTB6
MOV R6,#10H
INC R5
FTB6: INC R0 ;存放轉換結果。
INC R0
MOV A,R7
MOV @R0,A
DEC R0
MOV A,R6
MOV @R0,A
DEC R0
MOV A,R5
MOV C,1DH ;取出數符。
MOV ACC.7,C
MOV @R0,A
RET
HB2: MOV A,R4 ;尾數擴大100倍。
MOV B,#100
MUL AB
MOV R4,A
MOV A,B
XCH A,R3
MOV B,#100
MUL AB
ADD A,R3
MOV R3,A
JNC HB21
INC B
HB21: MOV A,B ;將整數部分轉換成BCD碼。
MOV B,#10
DIV AB
SWAP A
ORL A,B
RET
BTFL: DB 41H,0ECH,1EH ;1.0000E-19
DB 45H,93H,93H ;1.0000E-18
DB 48H,0B8H,78H ;1.0000E-17
DB 4BH,0E6H,96H ;1.0000E-16
DB 4FH,90H,1DH ;1.0000E-15
DB 52H,0B4H,25H ;1.0000E-14
DB 55H,0E1H,2EH ;1.0000E-13
DB 59H,8CH,0BDH ;1.0000E-12
DB 5CH,0AFH,0ECH ;1.0000E-11
DB 5FH,0DBH,0E7H ;1.0000E-10
DB 63H,89H,70H ;1.0000E-9
DB 66H,0ABH,0CCH ;1.0000E-8
DB 69H,0D6H,0C0H ;1.0000E-7
BFLN: DB 6DH,86H,38H ;1.0000E-6
DB 70H,0A7H,0C6H ;1.0000E-5
DB 73H,0D1H,0B7H ;1.0000E-4
DB 77H,83H,12H ;1.0000E-3
DB 7AH,0A3H,0D7H ;1.0000E-2
DB 7DH,0CCH,0CDH ;1.0000E-1
BFL0: DB 1,80H,00H ;1.0000
DB 4,0A0H,00H ;1.0000E1
DB 7,0C8H,00H ;1.0000E2
DB 0AH,0FAH,00H ;1.0000E3
DB 0EH,9CH,40H ;1.0000E4
DB 11H,0C3H,50H ;1.0000E5
DB 14H,0F4H,24H ;1.0000E6
DB 18H,98H,97H ;1.0000E7
DB 1BH,0BEH,0BCH ;1.0000E8
DB 1EH,0EEH,6BH ;1.0000E9
DB 22H,95H,03H ;1.0000E10
DB 25H,0BAH,44H ;1.0000E11
DB 28H,0E8H,0D5H ;1.0000E12
DB 2CH,91H,85H ;1.0000E13
DB 2FH,0B5H,0E6H ;1.0000E14
DB 32H,0E3H,60H ;1.0000E15
DB 36H,8EH,1CH ;1.0000E16
DB 39H,31H,0A3H ;1.0000E17
DB 3CH,0DEH,0BH ;1.0000E18
DB 40H,8AH,0C7H ;1.0000E19
(28) 標號: FCOS 功能:浮點余弦函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節
FCOS: LCALL FABS ;COS(-X) = COS X
MOV R5,#1 ;常數1.5708(π/2)
MOV R6,#0C9H
MOV R7,#10H
CLR 1EH
LCALL MVR0
CLR F0
LCALL AS1 ;x+(π/2)
LCALL MOV0 ;保存結果,接著運行下面的FSIN程序
(29) 標號: FSIN 功能:浮點正弦函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆棧需求: 6字節
FSIN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量的符號
CLR ACC.7 ;統一按正數計算
MOV @R0,A
LCALL MVR0 ;將[R0]傳送到第一工作區
MOV R5,#0 ;系數0.636627(2/π)
MOV R6,#0A2H
MOV R7,#0FAH
CLR 1EH
LCALL MUL1 ;相乘,自變量按(π/2)規一化
MOV A,R2 ;將結果復制到第二區
MOV R5,A
MOV A,R3
MOV R6,A
MOV A,R4
MOV R7,A
LCALL INT ;第一區取整,獲得象限信息
MOV A,R2
JZ SIN2
SIN1: CLR C ;將浮點象限數轉換成定點象限數
LCALL RR1
CJNE R2,#10H,SIN1
MOV A,R4
JNB ACC.1,SIN2
CPL 1DH ;對于第三、四象限,結果取反
SIN2: JB ACC.0,SIN3
CPL 1FH ;對于第一、三象限,直接求規一化的小數
SJMP SIN4
SIN3: MOV A,R4 ;對于第二、四象限,準備求其補數
INC A
MOV R4,A
JNZ SIN4
INC R3
SIN4: LCALL RLN ;規格化
SETB F0
LCALL AS1 ;求自變量歸一化等效值
LCALL MOV0 ;回傳
LCALL FPLN ;用多項式計算正弦值
DB 7DH,93H,28H;0.07185
DB 41H,0,0 ;0
DB 80H,0A4H,64H;-0.64215
DB 41H,0,0 ;0
DB 1,0C9H,2;1.5704
DB 41H,0,0 ;0
DB 40H ;結束
MOV A,@R0 ;結果的絕對值超過1.00嗎?
JZ SIN5
JB ACC.6,SIN5
INC R0 ;絕對值按1.00封頂
MOV @R0,#80H
INC R0
MOV @R0,#0
DEC R0
DEC R0
MOV A,#1
SIN5: MOV C,1DH ;將數符拼入結果中
MOV ACC.7,C
MOV @R0,A
RET
(30) 標號: FATN 功能:浮點反正切函數
入口條件:操作數在[R0]中。
出口信息:結果仍在[R0]中。
影響資源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆棧需求:7字節
FATN: MOV A,@R0
MOV C,ACC.7
MOV 1DH,C ;保存自變量數符
CLR ACC.7 ;自變量取絕對值
MOV @R0,A
CLR 1CH ;清求余運算標志
JB ACC.6,ATN1;自變量為純小數否?
JZ ATN1
SETB 1CH ;置位求余運算標志
LCALL FRCP ;通過倒數運算,轉換成純小數
ATN1: LCALL FPLN ;通過多項式運算,計算反正切函數值
DB 0FCH,0E4H,91H;-0.055802
DB 7FH,8FH,37H;0.27922
DB 0FFH,0EDH,0E0H;-0.46460
DB 7BH,0E8H,77H;0.028377
DB 0,0FFH,68H;0.9977
DB 72H,85H,0ECH;3.1930×10-5
DB 40H ;結束
JNB 1CH,ATN2;需要求余運算否?
CPL 1FH ;準備運算標志
MOV C,1FH
MOV F0,C ;常數1.5708(π/2)
MOV R5,#1
MOV R6,#0C9H
MOV R7,#10H
LCALL AS1 ;求余運算
LCALL MOV0 ;回傳
ATN2: MOV A,@R0 ;拼入結果的數符
MOV C,1DH
MOV ACC.7,C
MOV @R0,A
RET
(31) 標號: RTOD 功能:浮點弧度數轉換成浮點度數
入口條件:浮點弧度數在[R0]中。
出口信息:轉換成的浮點度數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
RTOD: MOV R5,#6 ;系數(180/π)傳送到第二工作區
MOV R6,#0E5H
MOV R7,#2FH
SJMP DR ;通過乘法進行轉換
(32) 標號: DTOR 功能:浮點度數轉換成浮點弧度數
入口條件:浮點度數在[R0]中。
出口信息:轉換成的浮點弧度數仍在[R0]中。
影響資源:PSW、A、B、R2~R7、位1EH、1FH 堆棧需求:6字節
DTOR: MOV R5,#0FBH;系數(π/180)傳送到第二工作區
MOV R6,#8EH
MOV R7,#0FAH
DR: LCALL MVR0 ;將[R0]傳送到第一工作區
CLR 1EH ;系數為正
LCALL MUL1 ;通過乘法進行轉換
LJMP MOV0 ;結果傳送到[R0]中
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -