📄 float.asm
字号:
;已知:a=-123.4;b=0.7577;c=56.34;d=1.276;
;它们分别存放在30H、33H、36H、39H开始的连续四个浮点单元中。
;用BCD码浮点数表示时,分别为a=831234H;b=007577H;c=025634H;d=011276H。
; 计算 y = Ln √ | Sin (ab/c+d) |
;求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各种运算,
;最后调用FTOB子程序,还原成十进制形式,供输出使用。程序如下:
FLAG DATA 23H ;浮点运算标志
PFA BIT FLAG.7
PFB BIT FLAG.6
PFC BIT FLAG.5
PFD BIT FLAG.4
DTA EQU 30H ;操作数a存放单元首址
DTB DATA 33H ;操作数b存放单元首址
DTC DATA 36H ;操作数c存放单元首址
DTD DATA 39H ;操作数d存放单元首址
Y DATA 3CH ;运算结果y存放单元首址
ORG 0000H
LJMP MAIN
ORG 000bH
LJMP t0serv
ORG 002bH
LJMP t2serv
ORG 0030H
MAIN:
setb tr0
SETB TR1
setb 0C8H.2
setb 0a8h.5
MOV TMOD,#21H
setb ea
setb et0
SETB P1.6
MOV SP,#07H
MOV DTA,#83H ;a=-123.4
MOV DTA+1,#12H
MOV DTA+2,#34H
MOV DTB,#00H ;b=0.7577
MOV DTB+1,#75H
MOV DTB+2,#77H
MOV DTC,#02H ;c=56.34
MOV DTC+1,#56H
MOV DTC+2,#34H
MOV DTD,#01H ;d=1.276
MOV DTD+1,#12H
MOV DTD+2,#76H
LCALL TEST
STOP: LJMP STOP
; 运行结果,Y=804915H,即y=-0.4915,比较精确的结果应该是-0.491437。
TEST: MOV R0,#DTA ;指向BCD码
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#DTB ;指向BCD码浮点操作数b
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#DTC ;指向BCD码浮点操作数c
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#DTD ;指向BCD码浮点操作数d
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1,#DTA ;将a复制到结果存放单元Y中
MOV R0,#Y ;R0保持指向结果存放单元Y
LCALL FMOV ;
MOV R1,#DTB ;指向二进制浮点操作数b
LCALL FMUL ;进行浮点乘法运算
MOV R1,#DTC ;指向二进制浮点操作数c
LCALL FDIV ;进行浮点除法运算
MOV R1,#DTD ;指向二进制浮点操作数d
LCALL FADD ;进行浮点加法运算
LCALL FSIN ;进行浮点正弦运算
LCALL FABS ;进行浮点绝对值运算
LCALL FSQR ;进行浮点开平方运算
LCALL FLN ;进行浮点对数运算
LCALL FTOB ;将结果转换成BCD码浮点数
RET
;以下为浮点子程序库
FSDT: LCALL MVR0
LCALL RLN
LJMP MOV0
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
FCLR: INC R0
INC R0
CLR A
MOV @R0,A
DEC R0
MOV @R0,A
DEC R0
MOV @R0,#41H
RET
FZER: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ ZERO
MOV @R0,#41H
ZERO: RET
FMOV: INC R0
INC R0
INC R1
INC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
MOV A,@R1
MOV @R0,A
RET
FPUS: POP ACC
MOV R2,A
POP ACC
MOV R3,A
MOV A,@R0
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
INC R0
MOV A,@R0
PUSH ACC
DEC R0
DEC R0
MOV A,R3
PUSH ACC
MOV A,R2
PUSH ACC
RET
FPOP: POP ACC
MOV R2,A
POP ACC
MOV R3,A
INC R0
INC R0
POP ACC
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
DEC R0
POP ACC
MOV @R0,A
MOV A,R3
PUSH ACC
MOV A,R2
PUSH ACC
RET
FCMP: MOV A,@R0
XRL A,@R1
JNB ACC.7,CMP2
MOV A,@R0
RLC A
MOV A,#0FFH
RET
CMP2: MOV A,@R1
MOV C,ACC.6
MOV ACC.7,C
MOV B,A
MOV A,@R0
MOV C,ACC.7
MOV F0,C
MOV C,ACC.6
MOV ACC.7,C
CLR C
SUBB A,B
JZ CMP6
RLC A
JNB F0,CMP5
CPL C
CMP5: MOV A,#0FFH
RET
CMP6: INC R0
INC R0
INC R1
INC R1
CLR C
MOV A,@R0
SUBB A,@R1
MOV B,A
DEC R0
DEC R1
MOV A,@R0
SUBB A,@R1
DEC R0
DEC R1
ORL A,B
JZ CMP7
JNB F0,CMP7
CPL C
CMP7: RET
FABS: MOV A,@R0
CLR ACC.7
MOV @R0,A
RET
FSGN: INC R0
MOV A,@R0
INC R0
ORL A,@R0
DEC R0
DEC R0
JNZ SGN
RET
SGN: MOV A,@R0
RLC A
MOV A,#1
JNC SGN1
MOV A,#0FFH
SGN1: RET
FINT: LCALL MVR0
LCALL INT
LJMP MOV0
INT: MOV A,R3
ORL A,R4
JNZ INTA
CLR PFA
MOV R2,#41H
RET
INTA: MOV A,R2
JZ INTB
JB ACC.7,INTB
CLR C
SUBB A,#10H
JC INTD
RET
INTB: CLR A
MOV R4,A
MOV C,PFA
RRC A
MOV R3,A
RL A
MOV R2,A
JNZ INTC
MOV R2,#41H
INTC: RET
INTD: CLR F0
INTE: CLR C
LCALL RR1
ORL C,F0
MOV F0,C
CJNE R2,#10H,INTE
JNB F0,INTF
JNB PFA,INTF
INC R4
MOV A,R4
JNZ INTF
INC R3
INTF: LJMP RLN
FRCP: MOV A,@R0
MOV C,ACC.7
MOV PFA,C
MOV C,ACC.6
MOV ACC.7,C
MOV R5,A
INC R0
MOV A,@R0
MOV R6,A
INC R0
MOV A,@R0
MOV R7,A
DEC R0
DEC R0
ORL A,R6
JNZ RCP
SETB OV
RET
RCP: MOV A,R6
JB ACC.7,RCP2
CLR C
MOV A,R7
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
DEC R5
SJMP RCP
RCP2: MOV R2,#1
MOV R3,#80H
MOV R4,#0
LCALL DIV3
LJMP MOV0
FSQU: MOV A,R0
XCH A,R1
PUSH ACC
LCALL FMUL
POP ACC
MOV R1,A
RET
FSQR: MOV A,@R0
JNB ACC.7,SQR
SETB OV
RET
SQR: INC R0
INC R0
MOV A,@R0
DEC R0
ORL A,@R0
DEC R0
JNZ SQ
MOV @R0,#41H
CLR OV
RET
SQ: MOV A,@R0
MOV C,ACC.6
MOV ACC.7,C
INC A
CLR C
RRC A
MOV @R0,A
INC R0
JC SQR0
MOV A,@R0
RRC A
MOV @R0,A
INC R0
MOV A,@R0
RRC A
MOV @R0,A
DEC R0
SQR0: MOV A,@R0
JZ SQR9
MOV R2,A
INC R0
MOV A,@R0
MOV R3,A
MOV A,R2
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
SJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
SJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -