📄 zz51.a51
字号:
LN5A: MOV A,1CH
ADD A,#80H
JZ LN53
JC LN51
CPL A
INC A
CPL 79H ;p为负,取绝对值,记数符
LN51: LCALL LD1
MOV R6,A
MOV R5,#0
LCALL LDD ;|p|规格化
LCALL GLN2 ;取ln2
LCALL FPMU ;计算|p|·ln 2
LCALL GET1 ;取ln t
JNB 79H,LN52
XRL 0DH,#80H ;p<0计算lnt-|p|·ln2
LN52: LCALL FPAD ;p≥0 计算ln t+|p|·ln2
LN53: RET
LGX: ACALL LNX ;先计算ln x
ACALL GLN10 ;取ln 10
ACALL EX
AJMP FPDI ;转计算log10 x=ln x/ln10
LGAX: ACALL LD2 ;存a
ACALL EX
ACALL LNX ;计算ln x
ACALL GET2 ;取a
ACALL LD2 ;存ln x
ACALL EX
ACALL LNX ;计算ln a
ACALL GET2 ;转计算loga x=ln x/lna
AJMP FPDI
;------------------------------------------------
;清单12 标号: DXP 功能:计算...
;------------------------------------------------
DXP: ACALL GLN10 ;先取ln 10
SJMP EXP0 ;转计算x·ln a
AXP: ACALL LD2 ;存x
ACALL EX
ACALL LNX ;计算ln a
ACALL GET2 ;取x
EXP0: ACALL FPMU ;计算x·ln a
EXP: CJNE R4,#68H,E1 ;计算ex子程序
E1: JNC E2
ACALL G0
MOV R4,#81H ;X的阶<68H,取ex=1
RET
E2: MOV A,R5
RLC A
MOV 79H,C ;存数符
ANL 0DH,#7FH ;取绝对值|x|
MOV R0,#87H
MOV R1,#30H
MOV R2,#0fH
MOV R3,#33H
ACALL FPCP ;|x|与88.029 69比较
JC E3 ;|x|<88.029 69,转
JNB 79H,E4
G0: CLR A ;否则,当x<-88.029 69时
MOV R4,A ;ex =0
MOV R5,A
MOV R6,A
MOV R7,A
RET
E4: LJMP 0FFFFH ;x>88.02969时,溢出
E3: MOV 1CH,#0 ;整数部分预清除
MOV R0,#81H
MOV R1,#38H
MOV R2,#0AAH
MOV R3,#3BH ;取log2 e(1/ln 2)
ACALL FPMU ;计算x/ln 2
JNB 79H,$+6
ORL 0DH,#80H
CJNE R4,#81H,$+3
JC E6 ;x/ln 2整数部分为0,转
ACALL BRK ;否则分解该浮点数为整数,小数部分(I和F)
MOV R4,#80H
MOV C,79H
MOV 7BH,C ;x的数符
ACALL NOM ;小数部分规格化为符点数F
MOV A,R3
JNB 79H,EP5
CPL A
INC A ;x为负数时,将整数部分I求负
EP5: MOV 1CH,A ;整数部分送入1CH
E6: ACALL FPLN2 ;计算EXP(F·ln 2)
DB 69H,5AH,92H,9FH ;0.10178086 E-6
DB 6DH,31H,60H,11H ;0.13215487 E-5
DB 70H,7FH,0E5H,0FEH ;0.15252374 E-4
DB 74H,21H,84H,89H ;0.15403530 E-3
DB 77H,2EH,0C3H,0FFH ;0.13333333 E-2
DB 7AH,1DH,95H,5BH ;0.96181290 E-2
DB 7CH,63H,58H,47H ;0.55504109 E-1
DB 7EH,75H,0FDH,0F0H ;0.24022651
DB 80H,31H,72H,18H ;0.69314718
DB 81H,0,0,0 ;1
DB 1 ;结束符
MOV A,R4
ADD A,1CH ;x/ln 2整数部分加入阶码中
MOV R4,A
COM6: RET
SHX: ACALL SUB11 ;计算双曲正弦
ACALL FPSU
JNZ NX48
RET
CHX: ACALL SUB11 ;计算双曲余弦
ACALL FPAD
NX48: DEC R4
RET
SUB11: ACALL EXP
ACALL LD2
ACALL INVX
AJMP GET2
ASHX: ACALL SUB2 ;计算反双曲正弦
ACALL FPAD
ASH: ACALL FPSQ
ACALL GET2
ACALL FPAD
AJMP LNX
ACHX: ACALL SUB2 ;计算反双曲余弦
ACALL EX
ACALL FPSU
SJMP ASH
SUB2: ACALL LD2 ;存x
ACALL LD0
ACALL FPMU ;得x2
AJMP G1 ;取1
;------------------------------------------------
;清单13: 标号COTX 功能:正弦函数及其衍生函数子程序
;------------------------------------------------
COTX: ACALL RTOG ;弧度化为角度
COTX1: ACALL TANX1 ;计算tan x
AJMP INVX ;取倒数为ctan x
TANX: ACALL RTOG ;弧度化为角度
TANX1: ACALL LD2 ;存x
ACALL SINX1 ;计算sin x
ACALL GET2 ;取x
ACALL LD2 ;存sin x
ACALL EX
ACALL COSX1 ;计算cos x
JNZ NX39
LJMP 0FFFFH ;cos x=0,溢出
NX39: ACALL GET2 ;取sin x
AJMP FPDI ;tan x=sin x/cos x
COSX: ACALL RTOG ;余弦函数子程序,先将弧度化为角度
COSX1: ACALL G90 ;取90°
ACALL FPSU
AJMP SINX1 ;cos x=sin(90-x)
SINX: ACALL RTOG ;正弦函数子程序,先将弧度化为角度
SINX1: MOV A,R5 ;x1为角度
RLC A
MOV 79H,C ;存数符
ANL 0DH,#7FH ;x→|x|
NX30: ACALL G90
INC R0
INC R0 ;取360°
ACALL FPCP ;|x|与360°比较
JZ GE0 ;相等,转出
JC NX31 ;|x|<360°.再与180°比较
ACALL EX
ACALL FPSU ;|x|-360°→|x|
SJMP NX30
NX31: DEC R0
ACALL FPCP ;|x|与180°比较
JZ GE0 ;相等,转出
JC NX32 ;|x|<180°,与90°比较
ACALL EX
ACALL FPSU ;|x|-180°→|x|
CPL 79H ;数符求反1次
NX32: ACALL G90
ACALL FPCP ;|x|与90°比较
JC NX36
INC R0
ACALL FPSU ;|x|>90°时,取180°-|x|→|x|
SJMP NX36
GE0: AJMP G0 ;|x|=sin x=0
NX36: ACALL GTOR ;变回弧度
CJNE R4,#79H,$+3 ;阶码<79H时,sin x=x
NX37: JC PP2
ACALL FPLN1 ;计算sin |x|
DB 60H,30H,92H,32H ; 0.16059043 E-9
DB 67H,0D7H,32H,2AH ;-0.25052108 E-7
DB 6EH,38H,0EFH,1CH ; 0.27557309 E-5
DB 74H,0D0H,0DH,1 ;-0.19841270 E-3
DB 7AH,8,88H, 88H ; 0.83333333 E-2
DB 7EH,0AAH,0AAH,0AAH ;-0.16666667
DB 81H,0,0,0 ;1
DB 1 ;结束符
PP2: JNB 79H,DON6
PP3: ORL 0DH,#80H ;配置数符
DON6: RET
;------------------------------------------------
;清单14: 标号:ASINX 功能:反正弦函数及其衍生函数子程序
;------------------------------------------------
ASINX: CJNE R4,#78H,$+3 ;反正弦函数子程序
JC DON6 ;x的阶<78H,acrsin x=x
MOV A,R5
RLC A
MOV 79H,C ;存数符
ANL 0DH,#7FH ;取绝对值
LCALL G1
LCALL FPCP
JZ AA
JC AA1
LJMP 0FFFFH ;|x|>1,溢出
AA: ACALL GHPI
ACALL EX
SJMP PP2 ;|x|=1,arcsin x=±π/2
AA1: CLR 7DH ;|x|<0.5标志
CJNE R4,#80H,AS1;|x|≤0.5
MOV A,R5
ORL A,R6
ORL A,R7
JZ AS1 ;x=0.5,转
SETB 7DH ;x>0.5标志,|x|≤0.5时,y=|x|
CLR A
CLR C
SUBB A,R7
MOV R7,A
CLR A
SUBB A,R6
MOV R6,A
CLR A
SUBB A,R5
ADD A,#80H
MOV R5,A
MOV R4,#7FH ;sqr((1-|x|)/2)的阶最大为7FH
NRMLP: ACALL SHIF
DEC R4
MOV A,R5
JNB ACC.7,NRMLP
ACALL FPS0 ;sqr((1-|x|)/2)→y
AS1: ACALL FPLN1 ;计算arcsin y
DB 7AH,3DH,43H,0C4H ;0.115 518 01 E-1
DB 7AH,64H,0CCH,0CDH ;0.139 648 44 E-1
DB 7BH,0EH,27H,62H ;0.173 527 64 E-1
DB 7BH,37H,45H,0D1H ;0.223 722 59 E-1
DB 7BH,78H,0E3H,8EH ;0.303 819 44 E-1
DB 7CH,36H,0DBH,6EH ;0.446 428 57 E-1
DB 7DH,19H,99H,9AH ;0.075
DB 7EH,2AH,0AAH,0AAH ;0.166 666 67
DB 81H,0,0,0 ;1
DB 1 ;结束符
JNB 7DH,PP20 ;|x|≤0.5,转去配置数符,有arcsin |x|=arcsin y
INC R4
JNB 7FH,AS2
JNB 79H,ACSRT ;7FH=1为计算ACOSX标志,若x>0 则arccos x=2arcsin y
ACALL GHPI
INC R0
SJMP AS3 ;x<0,arccosx=Л-2arcsiny
AS2: ACALL GHPI ;取π/2
ACALL FPSU ;|x|>0.5 arcsin |x|=π/2-2arcsin y
PP20: AJMP PP2 ;转去配置数符
ACOSX: SETB 7FH ;反余弦函数子程序,值为弧度 先建立计算arccosx标志
ACALL ASINX ;计算arcsinx
JNB 79H,ACSRT;如果79H=0且7FH=0,说明arccosx=2arcsiny已计算完毕,返回!
ACALL GHPI ;取 Л/2
AS3: ACALL FPSU ;|x|≤0.5,arccos x=π/2-arcsinx
ACSRT: CLR 7FH
RET
ATANX: CJNE R4,#98H,$+3 ;反正切函数子程序
JC AT1
ACALL GHPI ;x的阶码≥98H时,取π/2
ACALL EX
MOV A,R1
JNB ACC.7,AT2
ORL 0DH,#80H ;arctan x=±π/2
AT2: RET
AT1: CJNE R4,#74H,$+3 ;x的阶码<74H时,arctan x=x
JC AT2
ACALL LD0
ACALL LD1 ;存x
ACALL FPMU ;计算x2
ACALL G1
ACALL FPAD
ACALL FPSQ ;计算√1+x2
ACALL GET1
ACALL FPDI
AJMP ASINX ;转计算arctan x=arcsin(x/√1+x2)
ACTNX: ACALL ATANX ;反余切函数子程序
ACALL GHPI
AJMP FPSU ;arcctan x=π/2-arctan x
ASNX: ACALL ASINX ;反正弦函数,结果以角度表示
AJMP RTOG
ACSX: ACALL ACOSX ;反余弦函数,结果以角度表示
AJMP RTOG
ATNX: ACALL ATANX ;反正切函数,结果以角度表示
AJMP RTOG
ACNX: ACALL ACTNX ;反余切函数,结果以角度表示
AJMP RTOG
;------------------------------------------------
;清单15: 标号:DMST2 功能:函数子程序的演示程序
;------------------------------------------------
;清单16 标号:NP 功能:阶乘子程序
;n! =n(n-1)(n-2). ... .3.2.1,为1至n连续n个自然数的乘积,
;其设计方法如下: (1)n=0或n=1时,置结果n!=1;
; (2) n≥2时,令np=1,t=1,t每增加1后即乘以1次up,并以乘积替np,直到连续乘n-1项为止,结果即为n!
;------------------------------------------------
NP: MOV A,R4 ;阶乘子程序,定点二进制整数n在R4中
JZ GG
ADD A,#0DEH
JNC NX58
LJMP 0FFFFH ;n>33,溢出
NX58: DJNZ R4,NX59
GG: LCALL G1
LJMP SAV0 ;n≤1,n!=1
NX59: MOV 1CH,R4 ;存n
MOV R5,#0
MOV R6,#1 ;取t=1
LCALL LD2 ;存入
LCALL LDD ;t规格化
LCALL LD1 ;存规格化t
L43: LCALL GET2 ;取出t
LCALL SAV0
INC R6 ;t+1→t
LCALL LD2 ;存t
LCALL LDD ;t规格化
LCALL GET1 ;阶段阶乘值
LCALL FPMU ;计算t!
LCALL LD1
DJNZ 1CH,L43 ;t=n时得到n!
RET
;------------------------------------------------
;清单17 标号: CONV1 功能:定点整数二翻十
;------------------------------------------------
CONV1: MOV B,#24 ;定点整数二翻十
CLR A
MOV R5,A ;(R1 R2 R3)→R5 R6 R7
MOV R6,A
MOV R7,A
CV1: CLR C
ACALL LR0
MOV A,R7
ADDC A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
DJNZ B,CV1
RET
CONV2: MOV B,#24 ;定点整数十翻二
CONV21: CLR A
MOV R5,A ;R5 R6 R7←(R1 R2 R3)
MOV R6,A
MOV R7,A
CV2: CLR C
ACALL RR0
ACALL SRA
XCH A,R1
LCALL BB
XCH A,R1
XCH A,R2
LCALL BB
XCH A,R2
XCH A,R3
LCALL BB
XCH A,R3
DJNZ B,CV2
RET
CONV3: MOV B,#24 ;定点小数二翻十
CONV31: CLR A
MOV R1,A ;(R5 R6 R7)→R1 R2 R3 R4
MOV R2,A
MOV R3,A
MOV R4,A
CV3: ACALL SRA0
ACALL RR0
XCH A,R4
RRC A
XCH A,R4
XCH A,R1
LCALL BB
XCH A,R1
XCH A,R2
LCALL BB
XCH A,R2
XCH A,R3
LCALL BB
XCH A,R3
XCH A,R4
LCALL BB
XCH A,R4
DJNZ B,CV3
RET
CONV4: MOV B,#20H ;定点小数十翻二
CONV41: CLR A ;(R4 R5 R6 R7)→R0 R1 R2 R3→R4 R5 R6 R7
MOV R0,A
MOV R1,A
MOV R2,A
MOV R3,A
CV4: MOV A,R7
ADD A,R7
DA A
MOV R7,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
ACALL LR0
XCH A,R0
RLC A
XCH A,R0
DJNZ B,CV4
AJMP SAV0 ;结果转入R4~R7
;------------------------------------------------
;清单18 标号:DTOB1 功能:定点十进制数转为二进制浮点操作数
;入口:定点十进制整数在 R1,R2,R3中,其中R1为高字节
;[如1: R1=00H,R2=00H,R3=01H]
;定点十进制小数在 R4,R5,R6,R7中,其中R4为高位字
;[如0.1: R4=10H,R5=00H,R6=00H,R7=00H]
;数符为7BH位,0表正,1表负
;出口: R4,R5,R6,R7.其中R4为阶码,R5,R6,R7为尾数
;------------------------------------------------
DTOB1: ACALL LD1 ;定点十进制数变二进制浮点数,数符已装入7BH位,0表正,1表负
ACALL CONV2 ;整数部分十翻二
ACALL GET1 ;取出小数部分
ACALL LD1
ACALL SAV0
CALL CONV4 ;小数部分十翻二
ACALL GET1 ;取整数部分
MOV R0,#98H ;预置阶码
LP11: MOV A,R1
JB ACC.7,NX63 ;已规格化,转
ACALL SHIF
XCH A,R4
RLC A
XCH A,R4
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -