📄 zz51.a51
字号:
ORL 09H,#80H
ORL 0DH,#80H ;恢复尾数最高位
MOV 1DH,R5
MOV 1EH,R6
MOV 1FH,R7 ;乘数之尾数送入第3组寄存器
MOV R0,#25 ;右移相加25次
CLR A
MOV R6,A
MOV R7,A ;ACC,R6,R7为部分积累加器
CLR C
LOOP1: JNC M2
ACALL ADD0
ADDC A,R1 ;乘数移出位等于1 ,被乘数往部分积里加1次
M2: ACALL SRA1
XCH A,R5
CPL RS1
ACALL SRA
CPL RS1 ;部分积带进位位整体右移1位
DJNZ R0,LOOP1
MOV R5,A
JB ACC.7,M3 ;查积最高位
MOV A,1DH
RLC A
ACALL H0 ;积最高位为0,积整体算术左移1位
JNB ACC.7,M5
ACALL INC3 ;尾数截去部分四舍五入
CJNE R5,#0,M5
MOV R5,#80H ;调整
SJMP COM2
M5: DJNZ R4,COM2 ;阶码减1为0,为溢出
OV2: LJMP 0FFFFH
M3: MOV A,1DH
JNB ACC.7,COM2
ACALL INC3 ;尾数截去部分四舍五入
COM2: JBC 7EH,DON2 ;配置数符
ANL 0DH,#7FH
DON2: RET
;------------------------------------------------
;清单5 标号:FPDI 功能:浮点除法子程序
;浮点除法规则为:两数相除,阶码相减,尾数相除,阶码调整.
;入口:被除数R0,R1,R2,R3 ;除数R4,R5,R6,R7
;出口:商在R4,R5,R6,R7
;------------------------------------------------
FPDI: MOV A,R4 ;浮点除法子程序
JZ OV3 ;除数为0,溢出
CPL A
INC A
MOV R4,A ;除数阶码求补,为DP子程序准备
MOV A,R0
JNZ D1
AJMP G0 ;被除数为0,商为0
D1: ACALL DP ;商符号,商阶码处理
JZ OV3
JC OV3 ;商阶码等于0或CY=1为溢出
ORL 09H,#80H
ORL 0DH,#80H ;恢复尾数最高位
FPD3: ACALL EXT ;尾数交换
MOV R0,#19H ;左移试商25次,最后1次四舍五入
ACALL SUB0
XCH A,R5
SUBB A,R1 ;试商
JC D2
INC R4 ;够减,商阶码增1
CJNE R4,#0,D3
OV3: LJMP 0FFFFH ;商阶码变为0,则为溢出
D2: ACALL ADD0
ADDC A,R1 ;不够减,恢复被除数
LOOP2: ACALL ADD2
RLC A ;被除数算术左移1位
JC D4 ;有进位(必定够减),转
ACALL SUB0
SUBB A,R1
JNC D3 ;无进位,试商够减,转
ACALL ADD0
ADDC A,R1 ;试商不够减,恢复被除数
SJMP D3
D4: ACALL SUB0
SUBB A,R1
CLR C
D3: DJNZ R0,D5 ;试商25次?
MOV R5,1DH
MOV R6,1EH
MOV R7,1FH ;回送商
JC COM3
ACALL INC3 ;第25次够减,商加1
COM3: JBC 7EH,DON3
ANL 0DH,#7FH ;配置数符
DON3: RET
D5: CPL C ;进位位求反为本位商
CPL RS1
ACALL H0 ;在第3组寄存器中记商
CPL RS1
SJMP LOOP2
;------------------------------------------------
;清单6 标号:FPSQ 功能:浮点数模拟手算开平方子程序
;规则为:阶码折半,调整阶码、尾数,尾数开平方。
;入/出口:R4...R7
;------------------------------------------------
FPSQ: MOV A,R5 ;浮点数开平方子程序
RLC A
MOV 7EH,C ;如为负数,置虚根标志 (7EH=1为虚根)
FPS0: MOV A,R4
JZ DON4 ;0的平方根为0
ORL 0DH,#80H ;尾数恢复为原码
CLR C
RRC A ;阶码逻辑右移1位(折半)
JNC S2
INC A ;阶码为奇数,折半后增1
ACALL INC3
ACALL SRA ;尾数增1后折半
CJNE R5,#0,S2
MOV R5,#80H ;调整
S2: ADD A,#40H ;阶码恢复为移码
MOV R4,A
MOV 1DH,R5
MOV 1EH,R6
MOV 1FH,R7 ;尾数移入第3组寄存器
CLR A
MOV R1,A
MOV R2,A
MOV R3,A ;根尾数存储区清除
MOV R6,A
MOV R7,A ;被开方数尾数扩展区(ACC,R6,R7)清除
MOV R0,#19H ;试根25次,最后1次四舍五入
S3: CLR C
XCH A,1DH
SUBB A,#40H
XCH A,1DH
ACALL SBC0
SUBB A,R1 ;试根
JNC S4
XCH A,1DH
ADD A,#40H
XCH A,1DH
ACALL ADC0
ADDC A,R1 ;不够减,恢复尾数
S4: DJNZ R0,S5
ACALL SAVT ;回送平方根尾数
JC COM4
FQDON: ACALL INC3 ;四舍五入
COM4: ANL 0DH,#7FH ;置数符
DON4: RET
S5: CPL C ;进位位求反为本位根
ACALL LR0 ;记根
CPL RS1
ACALL SHIF
CPL RS1
ACALL ADC2
RLC A
CPL RS1
ACALL SHIF
CPL RS1
ACALL ADC2
RLC A ;被开平方数的尾数算术左移2位
JNC S3
ACALL SAVT
SJMP FQDON
;------------------------------------------------
;清单7 标号:FSQR 功能:浮点数牛顿迭代开平方子程序
;注:牛顿迭代开平方FSQR慢于模拟手算FPSQ开平方.
;------------------------------------------------
FSQR: MOV A,R5 ;浮点数牛顿迭代开平方子程序
RLC A
MOV 7EH,C ;实根/虚根标志
MOV A,R4
JZ SQRT ;0的平方根为0
ANL 0DH,#7FH ;尾数恢复为正数
MOV A,R4
MOV R0,A
CLR C
RRC A
ADDC A,#40H
MOV 1CH,A ;存根的阶码
MOV A,R0
ANL A,#1
SETB ACC.7
MOV R4,A ;变x为x1(0.5≤x1<2)
LCALL LD1 ;存x1
LCALL SRA0
CJNE R4,#80H,FSQR1
ORL 0DH,#40H ;得到首次根r0=(1+x1)/2
FSQR1: MOV B,#3 ;设迭代次数为3
FSQLP: LCALL LD2
LCALL GET1
LCALL FPDI
LCALL GET2
LCALL FPAD
DEC R4 ;计算ri+1=(xi+x1/ri)/2
DJNZ B,FSQLP
MOV R4,1CH ;取回根的阶码
SQRT: RET
;------------------------------------------------
;清单9 标号:LD0 功能:装、存、取浮点数
;------------------------------------------------
LD0: MOV 08H,R4 ;装入浮点数
MOV 09H,R5
MOV 0AH,R6
MOV 0BH,R7
RET
LD1: MOV 30H,R4 ;存浮点数
MOV 31H,R5
MOV 32H,R6
MOV 33H,R7
RET
LD2: MOV 34H,R4 ;存浮点数
MOV 35H,R5
MOV 36H,R6
MOV 37H,R7
RET
LD3: MOV 38H,R4 ;存浮点数
MOV 39H,R5
MOV 3AH,R6
MOV 3BH,R7
RET
LD4: MOV 18H,R4 ;存浮点数
MOV 19H,R5
MOV 1AH,R6
MOV 1BH,R7
RET
GET1: MOV R0,30H ;取浮点数
MOV R1,31H
MOV R2,32H
MOV R3,33H
RET
GET2: MOV R0,34H ;取浮点数
MOV R1,35H
MOV R2,36H
MOV R3,37H
RET
GET3: MOV R0,38H ;取浮点数
MOV R1,39H
MOV R2,3AH
MOV R3,3BH
RET
GET4: MOV R0,18H ;取浮点数
MOV R1,19H
MOV R2,1AH
MOV R3,1BH
RET
INVPI: MOV R0,#86H ;取180/π
MOV R1,#65H
MOV R2,#2EH
MOV R3,#0E0H
RET
G90: MOV R0,#87H ;取浮点数90
MOV R1,#34H
CLR A
MOV R2,A
MOV R3,A
RET
GTOR: ACALL PI18 ;角度化为弧度子程序
AJMP FPMU
RTOG: ACALL INVPI ;弧度化为角度子程序
AJMP FPMU
GHPI: MOV R0,#81H ;取浮点数 π/2
MOV R1,#49H
MOV R2,#0FH
MOV R3,#0DBH
RET
G01: MOV R0,#7DH ;取浮点数0.1
MOV R1,#4CH
MOV R2,#0CCH
MOV R3,#0CDH
RET
G1: MOV R0,#81H ;取浮点数1
CLR A
MOV R1,A
MOV R2,A
MOV R3,A
RET
PI18: MOV R0,#7BH ;取浮点数π/180
MOV R1,#0EH
MOV R2,#0FAH
MOV R3,#35H
RET
GINT: CJNE R4,#81H,$+3 ;将浮点数取整子程序
JNC GINT1
ACALL G0 ;阶码<81H,结果为0
AJMP LD0
GINT1: MOV A,R5
RLC A
MOV 78H,C ;记数符
CJNE R4,#98H,$+3
JNC GOV ;阶码>97H,溢出
ACALL BRK ;分离出整数部分
JNB 78H,GEND ;正数结束
CLR A ;负数求其补
CLR C
SUBB A,R3
MOV R3,A
CLR A
SUBB A,R2
MOV R2,A
CLR A
SUBB A,R1
MOV R1,A
GEND: RET
GOV: LJMP 0FFFFH
BRK: ORL 0DH,#80H ;分解浮点数(正数)为整数,小数两部分
CLR A
MOV R1,A
MOV R2,A
MOV R3,A
LOOP4: ACALL SHIF
ACALL LR0
DEC R4
CJNE R4,#80H,LOOP4 ;左移尾数(阶码-80H)位,移出部分为整数,在R1~R3中
RET
LDD: CLR 7BH ;正整数(最多16位)规格化子程序
MOV R7,#0
MOV R4,#90H
AJMP NOM
G10: MOV R0,#84H ;取浮点数10
MOV R1,#20H
CLR A
MOV R2,A
MOV R3,A
RET
GLN2: MOV R0,#80H ;取浮点数ln 2(=0.693 147 18)
MOV R1,#31H
MOV R2,#72H
MOV R3,#18H
RET
GLN10: MOV R0,#82H ;取浮点数ln 10(=2.302 585 1)
MOV R1,#13H
MOV R2,#5DH
MOV R3,#8EH
RET
INVX: CJNE R4,#0,INV ;计算1/x,x=0为溢出
LJMP 0FFFFH
INV: ACALL G1
AJMP FPDI ;浮点除法子程序
;------------------------------------------------
;清单10 标号:FPLN1 功能:计算奇次多项式值(ln x、sin x、arcsin x 等)子程序
;------------------------------------------------
FPLN1: SETB 7CH ;计算奇次多项式值(ln x、sin x、arcsin x 等)子程序
ACALL LD4 ;存x
ACALL LD0
ACALL FPMU ;计算x·x
SJMP FLN0
FPLN2: CLR 7CH ;计算ex展开式值/cos x
FLN0: ACALL LD1 ;x(或x·x)→t,存t
POP DPH
POP DPL
CLR A
MOVC A,@A+DPTR
MOV R0,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R1,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R3,A ;取an
INC DPTR
PLN: ACALL M1 ;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t
CLR A
MOVC A,@A+DPTR
MOV R0,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R1,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R2,A
INC DPTR
CLR A
MOVC A,@A+DPTR
MOV R3,A ;取ai-1
INC DPTR
ACALL FPLAD ;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t+ai-1
CLR A
MOVC A,@A+DPTR
ACALL GET1
DEC A
JNZ PLN ;1为计算结束符
PEND: JNB 7CH,REND
ACALL GET4
ACALL M1 ;计算奇次多项式值,再乘以x
REND: MOV A,#1
JMP @A+DPTR ;转至结束符的下一地址
;------------------------------------------------
;清单11 标号: LNX,LGAX及LGX 功能:计算对数函数子程序
;------------------------------------------------
LNX: MOV A,R4 ;计算对数函数子程序
JZ OV4
MOV A,R5
JNB ACC.7,LN1
OV4: LJMP 0FFFFH ;x≤0,溢出
LN1: CLR 79H ;阶m的符号
MOV 1CH,R4 ;设x=2m·t, 则ln x=m·ln 2+ln t,先存p=m
MOV R1,#35h
MOV R2,#4
MOV R3,#0f3h ;t与√2/2相比较
LCALL CP3
JNC LN5 ;t≥√2/2转
DEC 1CH ;p=m-1, ln x=(m-1)·ln 2+ln(2t)
CLR 7EH ;(2t-1)为正
MOV A,R5
ORL A,R6
ORL A,R7
MOV R4,A
JZ LN5A ;2t-1=0 勿计算ln(2t)
LCALL LD0
CLR C
LCALL LR0 ;(2t-1)
LCALL SRA0
ORL 0DH,#80H ;2t+1
MOV R4,#7EH ;1/(2t+1)的阶
SJMP LNTLP
LN5: SETB 7EH ;(t-1)为负
CLR C
CLR A
SUBB A,R7
MOV R3,A
CLR A
SUBB A,R6
MOV R2,A
CLR A
SUBB A,R5
ADD A,#80H
MOV R1,A ;计算(t-1)
LCALL SRA0
ORL 0DH,#0C0H ;计算(t+1)
MOV R4,#7FH ;1/(t+1)的阶
LNTLP: CLR C
LCALL LR0 ;(2t-1)或(t-1)规格化
DEC R4 ;调整(2t-1)/(2t+1)或(t-1)/(t+1)的阶
MOV A,R1
JNB ACC.7,LNTLP
LCALL FPD3 ;计算(2t-1)/(2t+1)或(t-1)/(t+1)
LCALL FPLN1 ;计算ln t或ln(2t)
DB 7EH,12H,49H,25H ;0.14285714
DB 7EH,4CH,0CCH,0CDH ;0.2
DB 7FH,2AH,0AAH,0AAH ;0.33333333
DB 81H,0,0,0 ;1
DB 1 ;结束符
INC R4 ;得到ln t
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -