?? qins.asm
字號:
;拋物線插值算法。
X EQU 30H ;插值點x和y存放單元的首址。
X0 EQU 33H ;節點0的橫坐標x0存放單元的首址。
Y0 EQU 36H ;節點0的函數值y0存放單元的首址。
X1 EQU 39H ;節點1的橫坐標x1存放單元的首址。
Y1 EQU 3CH ;節點1的函數值y1存放單元的首址。
X2 EQU 3FH ;節點2的橫坐標x2存放單元的首址。
Y2 EQU 42H ;節點2的函數值y2存放單元的首址。
TEMP EQU 45H ;用于保存節點x1值的臨時單元的首址。
TEMPX EQU 48H ;用于保存插值點x的臨時單元的首址。
FLAG DATA 23H ;浮點運算標志
PFA BIT FLAG.7
PFB BIT FLAG.6
PFC BIT FLAG.5
PFD BIT FLAG.4
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV DPTR,#DATS ;將一組測試數據調入。
MOV R0,#X
MOV R2,#21 ;七個浮點數。
TEST1: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R2,TEST1
LCALL QINS ;調用拋物線插值算法。
STOP: LJMP STOP ;結果為 2.913 ( 02H 0BAH 72H )。
DATS: DB 01H,0C9H,58H ;插值點的x坐標( 1.573 )。
DB 01H,0C0H,00H ;第一節點的坐標( x0 = 1.5 )。
DB 02H,0A2H,4EH ;第一節點的坐標( y0 = 2.536 )。
DB 01H,0CCH,0CDH ;第二節點的坐標( x1 = 1.6 )。
DB 02H,0C2H,0D1H ;第二節點的坐標( y1 = 3.044 )。
DB 01H,0D9H,9AH ;第三節點的坐標( x2 = 1.7 )。
DB 02H,0DFH,2BH ;第三節點的坐標( y2 = 3.487 )。
QINS: MOV TEMPX,X ;保存插值點x的值。
MOV TEMPX+1,X+1
MOV TEMPX+2,X+2
LCALL LINSS ;調用線性插值算法,求得L01。
MOV R0,#X1 ;交換“節點”L01和節點2的坐標數據。
MOV R1,#X2
MOV R7,#6
EX: MOV A,@R0
XCH A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,EX
LCALL LINSS ;調用線性插值算法,求得L02。
MOV R0,#X0 ;將“節點”L01的坐標數據放到節點0的位置上。
MOV R1,#X2
MOV R7,#6
MOVS: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R7,MOVS
LCALL LINS ;調用線性插值算法,最終插值結果y在原x處。
RET
LINSS: MOV TEMP,X1 ;保存x1的值。
MOV TEMP+1,X1+1
MOV TEMP+2,X1+2
LCALL LINS ;調用線性插值算法。
MOV Y1,X ;將結果放入原y1位置。
MOV Y1+1,X+1
MOV Y1+2,X+2
MOV X1,TEMP ;恢復x1的值。
MOV X1+1,TEMP+1
MOV X1+2,TEMP+2
MOV X,TEMPX ;恢復x的值。
MOV X+1,TEMPX+1
MOV X+2,TEMPX+2
RET
LINS: MOV R0,#X
MOV R1,#X0
LCALL FSUB ;x-x0 → x
MOV R0,#Y1
MOV R1,#Y0
LCALL FSUB ;y1-y0 → y1
MOV R0,#X1
MOV R1,#X0
LCALL FSUB ;x1-x0 → x1
MOV R0,#X
MOV R1,#Y1
LCALL FMUL ;(x-x0)×(y1-y0)→ x
MOV R1,#X1
LCALL FDIV ;(x-x0)×(y1-y0)÷(x1-x0)→ x
MOV R1,#Y0
LCALL FADD ;(x-x0)×(y1-y0)÷(x1-x0)+y0 → x
RET
;以下是浮點運算子程序庫:
FADD: CLR F0
SJMP AS
FSUB: SETB F0
AS: LCALL MVR1
MOV C,F0
RRC A
XRL A,@R1
MOV C,ACC.7
ASN: MOV PFB,C
XRL A,@R0
RLC A
MOV F0,C
LCALL MVR0
LCALL AS1
MOV0: INC R0
INC R0
MOV A,R4
MOV @R0,A
DEC R0
MOV A,R3
MOV @R0,A
DEC R0
MOV A,R2
MOV C,PFA
MOV ACC.7,C
MOV @R0,A
CLR ACC.7
CLR OV
CJNE A,#3FH,MV01
SETB OV
MV01: MOV A,@R0
RET
MVR0: MOV A,@R0
MOV C,ACC.7
MOV PFA,C
MOV C,ACC.6
MOV ACC.7,C
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
INC R0
MOV A,@R0
MOV R4,A
DEC R0
DEC R0
RET
MVR1: MOV A,@R1
MOV C,ACC.7
MOV PFB,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC R1
MOV A,@R1
MOV R6,A
INC R1
MOV A,@R1
MOV R7,A
DEC R1
DEC R1
RET
AS1: MOV A,R6
ORL A,R7
JZ AS2
MOV A,R3
ORL A,R4
JNZ EQ1
MOV A,R6
MOV R3,A
MOV A,R7
MOV R4,A
MOV A,R5
MOV R2,A
MOV C,PFB
MOV PFA,C
AS2: RET
EQ1: MOV A,R2
XRL A,R5
JZ AS4
JB ACC.7,EQ3
MOV A,R2
CLR C
SUBB A,R5
JC EQ4
EQ2: CLR C
MOV A,R6
RRC A
MOV R6,A
MOV A,R7
RRC A
MOV R7,A
INC R5
ORL A,R6
JNZ EQ1
MOV A,R2
MOV R5,A
SJMP AS4
EQ3: MOV A,R2
JNB ACC.7,EQ2
EQ4: CLR C
LCALL RR1
ORL A,R3
JNZ EQ1
MOV A,R5
MOV R2,A
AS4: JB F0,AS5
MOV A,R4
ADD A,R7
MOV R4,A
MOV A,R3
ADDC A,R6
MOV R3,A
JNC AS2
LJMP RR1
AS5: CLR C
MOV A,R4
SUBB A,R7
MOV B,A
MOV A,R3
SUBB A,R6
JC AS6
MOV R4,B
MOV R3,A
LJMP RLN
AS6: CPL PFA
CLR C
MOV A,R7
SUBB A,R4
MOV R4,A
MOV A,R6
SUBB A,R3
MOV R3,A
RLN: MOV A,R3
ORL A,R4
JNZ RLN1
MOV R2,#0C1H
RET
RLN1: MOV A,R3
JB ACC.7,RLN2
CLR C
LCALL RL1
SJMP RLN
RLN2: CLR OV
RET
RL1: MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
DEC R2
CJNE R2,#0C0H,RL1E
CLR A
MOV R3,A
MOV R4,A
MOV R2,#0C1H
RL1E: CLR OV
RET
RR1: MOV A,R3
RRC A
MOV R3,A
MOV A,R4
RRC A
MOV R4,A
INC R2
CLR OV
CJNE R2,#40H,RR1E
MOV R2,#3FH
SETB OV
RR1E: RET
FMUL: LCALL MVR0
MOV A,@R0
XRL A,@R1
RLC A
MOV PFA,C
LCALL MUL0
LJMP MOV0
MUL0: LCALL MVR1
MUL1: MOV A,R3
ORL A,R4
JZ MUL6
MOV A,R6
ORL A,R7
JZ MUL5
MOV A,R7
MOV B,R4
MUL AB
MOV A,B
XCH A,R7
MOV B,R3
MUL AB
ADD A,R7
MOV R7,A
CLR A
ADDC A,B
XCH A,R4
MOV B,R6
MUL AB
ADD A,R7
MOV R7,A
MOV A,B
ADDC A,R4
MOV R4,A
CLR A
RLC A
XCH A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
MOV A,B
ADDC A,R3
MOV R3,A
JB ACC.7,MUL2
MOV A,R7
RLC A
MOV R7,A
LCALL RL1
MUL2: MOV A,R7
JNB ACC.7,MUL3
INC R4
MOV A,R4
JNZ MUL3
INC R3
MOV A,R3
JNZ MUL3
MOV R3,#80H
INC R2
MUL3: MOV A,R2
ADD A,R5
MD: MOV R2,A
JB ACC.7,MUL4
JNB ACC.6,MUL6
MOV R2,#3FH
SETB OV
RET
MUL4: JB ACC.6,MUL6
MUL5: CLR A
MOV R3,A
MOV R4,A
MOV R2,#41H
MUL6: CLR OV
RET
FDIV: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ DIV1
MOV @R0,#41H
CLR OV
RET
DIV1: INC R1
MOV A,@R1
INC R1
ORL A,@R1
DEC R1
DEC R1
JNZ DIV2
SETB OV
RET
DIV2: LCALL MVR0
MOV A,@R0
XRL A,@R1
RLC A
MOV PFA,C
LCALL MVR1
LCALL DIV3
LJMP MOV0
DIV3: CLR C
MOV A,R4
SUBB A,R7
MOV A,R3
SUBB A,R6
JC DIV4
LCALL RR1
SJMP DIV3
DIV4: CLR A
XCH A,R0
PUSH ACC
CLR A
XCH A,R1
PUSH ACC
MOV A,R2
PUSH ACC
MOV B,#10H
DIV5: CLR C
MOV A,R1
RLC A
MOV R1,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R4
RLC A
MOV R4,A
XCH A,R3
RLC A
XCH A,R3
MOV F0,C
CLR C
SUBB A,R7
MOV R2,A
MOV A,R3
SUBB A,R6
ANL C,/F0
JC DIV6
MOV R3,A
MOV A,R2
MOV R4,A
INC R1
DIV6: DJNZ B,DIV5
MOV A,R6
CLR C
RRC A
SUBB A,R3
CLR A
ADDC A,R1
MOV R4,A
CLR A
ADDC A,R0
MOV R3,A
POP ACC
MOV R2,A
POP ACC
MOV R1,A
POP ACC
MOV R0,A
MOV A,R2
CLR C
SUBB A,R5
LCALL MD
LJMP RLN
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -