说明此程序清单的格式与注解以书中为准.docx
《说明此程序清单的格式与注解以书中为准.docx》由会员分享,可在线阅读,更多相关《说明此程序清单的格式与注解以书中为准.docx(201页珍藏版)》请在冰豆网上搜索。
说明此程序清单的格式与注解以书中为准
说明:
此程序清单的格式与注解以书中为准。
程序清单:
清单1
ORG2000H
ADD0:
CLRC;双精度加法子程序
ADC0:
XCHA,R7;双精度带进位位加法子程序
ADDCA,R3
XCHA,R7
XCHA,R6
ADDCA,R2
XCHA,R6
RET
ADD1:
CLRC;双精度加法子程序
ADC1:
XCHA,R7;双精度带进位位加法子程序
ADDCA,R5
XCHA,R7
XCHA,R6
ADDCA,R4
XCHA,R6
RET
ADD2:
CLRC;双精度加法子程序
ADD2:
XCHA,R7;双精度带进位位加法子程序
RLCA
XCHA,R7
XCHA,R6
RLCA
XCHA,R6
RET
SUBO:
CLRC;双精度减法子程序
SBCO:
XCHA,R7;双精度带进位位减法子程序
SUBBA,R3
XCHA,R7
XCHA,R6
SUBBA,R2
XCHA,R6
RET
SUB1:
CLRC;双精度减法子程序
SBC1:
XCHA,R7;双精度带进位位减法子程序
SUBBA,R5
XCHA,R7
XCHA,R6
SUBBA,R2
XCHA,R6
RET
EX:
XCHA,R0;两浮点数交换子程序
XCHA,R4
XCHA,R0
EXT:
XCHA,R1;两浮点数的尾数交换子程序
XCHA,R5
XCHA,R1
EXX:
XCHA,R2;双字节交换
XCHA,R6
XCHA,R2
XCHA,R3
XCHA,R7
XCHA,R3
RET
SAVO:
MOVR4,08H;第1操作数(浮点数)装入0CH~0FH中
SAVT:
MOVR5,09H
MOVR6,0AH
MOVR7,0BH
RET
DP:
MOVA,R5;取存积(商)数符,计算积(商)的阶码子程序
XRLA,R1
RLCA
MOV7EH,C;存积(商)数符
MOVA,R0
ADDA,R4;阶码相加(除数阶码已变为补码)
JNCDP1
ADDA,#80H;有进位,和再加上80H,如有进位,为溢出
MOVR4,A
RET
DP1:
SUBBA,#80H;无进位,和减去80H,如有借位或差等于0,也为溢出
MOVR4,A
RET
SHIF:
CLRC;尾数算术左移1位子程序
H0:
XCHA,R7;尾数带进位左移1位
RLCA
XCHA,R7
XCHA,R6
RLCA
XCHA,R6
XCHA,R5
RLCA
XCHA,R5
RET
LR0:
XCHA,R3;尾数带进位位左移1位子程序
RLCA
XCHA,R3
XCHA,R2
RLCA
XCHA,R2
XCHA,R1
RLCA
XCHA,R1
RET
SRA0:
CLRC;尾数逻辑右移1位子程序
SRA:
XCHA,R5;尾数带进位位右移1位
SRA1:
RRCA;AR6R7带进位位右移1位,结果在R5R6R7中
XCHA,R5
XCHA,R6
RRCA
XCHA,R6
XCHA,R7
RRCA
XCHA,R7
RET
RRO:
XCHA,R1;尾数带进位位右移1位子程序
RRCA
XCHA,R1
XCHA,R2
RRCA
XCHA,R2
XCHA,R3
RRCA
XCHA,R3
RET
INC3:
INCR7;尾数增1子程序
CJNER7,#0,RET0
INCR6
CJNER6,#0,RET0
INCR5
RET0:
RET清单2
FPCP:
MOVA,R1;被减数x1与减数x2比较大小子程序
XRLA,R5
JNBACC.7,CP1;两数同号,转CP1
CP0:
MOVA,R1
CLRC
SUBBA,R5;异号,比较尾数高位字节即可
RET
CP1:
MOVA,R1
JNBACC.7,CP2;正数与正数相比较,转CP2
ACALLCP2
JZCP4;除非两数相等,不然转CP4
CPLC;负数与负数比较对CY的影响与正数相比恰恰相反
RET
CP2:
MOVA,R4;先比较两数的阶
CLRC
SUBBA,R0
JNZCP4;不等,即可定下大小关系
CP3:
MOVA,R5
SUBBA,R1;阶相等时,由尾数相比较定大小
JNZCP4
MOVA,R6;依高位字节到低位字节的顺序比较
SUBBA,R2
JNZCP4
MOVA,R7;只有阶码和尾数对应相等时,两数才相等
SUBBA,R3;比较结果ACC=0,两数相等,不然CY=1时x1>x2,
CP4:
RET;CY=0时,x1>x2程序清单:
清单3
FPSU:
XRL0DH,#80H;浮点减法子程序,减数数符求反后为加数
FPAD:
MOVA,R0;浮点加法子程序
JZDON;被加数等于0,加数为和
FPLAD:
MOVA,R4
JZSAV0;加数等于0,被加数为和
NX2:
MOVA,R1
RLCA
MOV7AH,C;存被加数数符
MOVA,R5
RLCA
MOV7BH,C;存加数数符
ORL09H,#80H
ORL0DH,#80H;恢复尾数最高位
CLRC
MOVA,R4
SUBBA,R0;加数阶减去被加数的阶
JNCNX3
CPLA
INCA
MOVR4,A;阶差为负,取绝对值
ADDA,#0E7H
JCEXAD;|阶差|≥24,取被加数为和
ACALLSRA0;右移加数尾数,对阶
DJNZR4,$-2
MOVA,R0
MOVR4,A;被加数的阶(大阶)为和的阶
JNCGOON
ACALLINC3;尾数欲截去部分四舍五入
SJMPGOON
NX3:
MOVR0,A
JZGOON;阶差为0,不对阶
ADDA,#0E7H
JCCOM;阶差≥24,取加数为和
LOOP:
CLRC
ACALLRR0
DJNZR0,LOOP;右移被加数尾数,对阶
JNCGOON
INCR3
CJNER3,#0,GOON
INCR2
CJNER2,#0,GOON
INCR1;对尾数截去部分四舍五入
GOON:
MOVA,2FH
ADDA,#4;判断两数符是否相同
JNBACC.3,SAMS;同号,转SAMS
ACALLSUB0;异号,尾数相减,以加数作为被减数
MOVA,R5
SUBBA,R1
MOVR5,A
JNCNOM
CPL7BH;不够减,加数数符求反
CLRC
CLRA
SUBBA,R7
MOVR7,A
CLRA
SUBBA,R6
MOVR6,A
CLRA
SUBBA,R5
MOVR5,A;差求补
NOM:
MOVA,R5
ORLA,R6
ORLA,R7
JZDON0;差为0,取阶码为0
NX5:
MOVA,R5
JBACC.7,COM
ACALLSHIF
DJNZR4,NX5;左规检查
OV1:
LJMP0FFFFH;阶码变为0,为溢出(可用LJMP指令引导处理溢出,下同)
SAMS:
ACALLADD0;同号,执行加法
MOVA,R5
ADDCA,R1
MOVR5,A
JNCCOM
ACALLSRA;有进位,右规1次
INCR4
MOVA,R4
JZOV1
COM:
JBC7BH,DON
COMA:
ANL0DH,#7FH;配置数符
DON:
RET
EXAD:
ACALLSAV0;取被加数为和
JNB7AH,COMA;置数符
RET
DON0:
MOVR4,A;取浮点数0的阶码
RET程序清单:
清单4
FPMU:
MOVA,R0;浮点乘法子程序
JZM0
MOVA,R4
JNZM1
M0:
AJMPG0;乘数中有为0者,积为0
M1:
ACALLDP;积符,积阶处理
JZOV2
JCOV2;积阶处理结果,为0或CY=1为溢出
ORL09H,#80H
ORL0DH,#80H;恢复尾数最高位
MOV1DH,R5
MOV1EH,R6
MOV1FH,R7;乘数之尾数送入第3组寄存器
MOVR0,#25;右移相加25次
CLRA
MOVR6,A
MOVR7,A;ACC,R6,R7为部分积累加器
CLRC
LOOP1:
JNCM2
ACALLADD0
ADDCA,R1;乘数移出位等于1,被乘数往部分积里加1次
M2:
ACALLSRA1
XCHA,R5
CPLRS1
ACALLSRA
CPLRS1;部分积带进位位整体右移1位
DJNZR0,LOOP1
MOVR5,A
JBACC.7,M3;查积最高位
MOVA,1DH
RLCA
ACALLH0;积最高位为0,积整体算术左移1位
JNBACC.7,M5
ACALLINC3;尾数截去部分四舍五入
CJNER5,#0,M5
MOVR5,#80H;调整
SJMPCOM2
M5:
DJNZR4,COM2;阶减1为0,为溢出
OV2:
LJMP0FFFFH
M3:
MOVA,1DH
JNBACC.7,COM2
ACALLINC3;尾数截去部分四舍五入
COM2:
JBC7EH,DON2;配置数符
ANL0DH,#7FH
DON2:
RET程序清单:
清单5
FPDI:
MOVA,R4;浮点除法子程序
JZOV3;除数为0,溢出
CPLA
INCA
MOVR4,A;除数阶码求补,为DP子程序准备
MOVA,R0
JNZD1
AJMPG0;被除数为0,商为0
D1:
ACALLDP;商符号,商阶处理
JZOV3
JCOV3;商阶等于0或CY=1为溢出
ORL09H,#80H
ORL0DH,#80H;恢复尾数最高位
FPD3:
ACALLEXT;尾数交换
MOVR0,#19H;左移试商25次,最后1次四舍五入
ACALLSUB0
XCHA,R5
SUBBA,R1;试商
JCD2
INCR4;够减,商阶增1
CJNER4,#0,D3
OV3:
LJMP0FFFFH;商阶变为0,则为溢出
D2:
ACALLADD0
ADDCA,R1;不够减,恢复被除数
LOOP2:
ACALLADD2
RLCA;被除数算术左移1位
JCD4;有进位(必定够减),转
ACALLSUB0
SUBBA,R1
JNCD3;无进位,试商够减,转
ACALLADD0
ADDCA,R1;试商不够减,恢复被除数
SJMPD3
D4:
ACALLSUB0
SUBBA,R1
CLRC
D3:
DJNZR0,D5;试商25次?
MOVR5,1DH
MOVR6,1EH
MOVR7,1FH;回送商
JCCOM3
ACALLINC3;第25次够减,商加1
COM3:
JBC7EH,DON3
ANL0DH,#7FH;配置数符
DON3:
RET
D5:
CPLC;进位位求反为本位商
CPLRS1
ACALLH0;在第3组寄存器中记商
CPLRS1
SJMPLOOP2程序清单:
清单6
FPSQ:
MOVA,R5;浮点数开平方子程序,先置实根标志
RLCA
MOV7EH,C;负数,改为虚根标志
FPS0:
MOVA,R4
JZDON4;0的平方根为0
ORL0DH,#80H;尾数恢复为原码
CLRC
RRCA;阶码逻辑右移1位(折半)
JNCS2
INCA;阶码为奇数,折半后增1
ACALLINC3
ACALLSRA;尾数增1后折半
CJNER5,#0,S2
MOVR5,#80H;调整
S2:
ADDA,#40H;阶码恢复为移码
MOVR4,A
MOV1DH,R5
MOV1EH,R6
MOV1FH,R7;尾数移入第3组寄存器
CLRA
MOVR1,A
MOVR2,A
MOVR3,A;根尾数存储区清除
MOVR6,A
MOVR7,A;被开方数尾数扩展区(ACC,R6,R7)清除
MOVR0,#19H;试根25次,最后1次四舍五入
S3:
CLRC
XCHA,1DH
SUBBA,#40H
XCHA,1DH
ACALLSBC0
SUBBA,R1;试根
JNCS4
XCHA,1DH
ADDA,#40H
XCHA,1DH
ACALLADC0
ADDCA,R1;不够减,恢复尾数
S4:
DJNZR0,S5
ACALLSAVT;回送平方根尾数
JCCOM4
ACALLINC3;四舍五入
COM4:
ANL0DH,#7FH;置数符
DON4:
RET
S5:
CPLC;进位位求反为本位根
ACALLLR0;记根
CPLRS1
ACALLSHIF
CPLRS1
ACALLADC2
RLCA
CPLRS1
ACALLSHIF
CPLRS1
ACALLADC2
RLCA;被开平方数的尾数算术左移2位
SJMPS3
程序清单:
清单7
FSQR:
MOVA,R5;浮点数牛顿迭代开平方子程序,先置实根标志
RLCA
MOV7EH,C;实根/虚根标志
MOVA,R4
JZSQRT;0的平方根为0
ANL0DH,#7FH;尾数恢复为正数
MOVA,R4
MOVR0,A
CLRC
RRCA
ADDCA,#40H
MOV1CH,A;存根的阶码
MOVA,R0
ANLA,#1
SETBACC.7
MOVR4,A;变x为x1(0.5≤x1<2)
LCALLLD1;存x1
LCALLSRA0
CJNER4,#80H,FSQR1
ORL0DH,#40H;得到首次根r0=(1+x1)/2
FSQR1:
MOVB,#3
FSQLP:
LCALLLD2
LCALLGET1
LCALLFPDI
LCALLGET2
LCALLFPAD
DECR4;计算ri+1=(xi+x1/ri)/2
DJNZB,FSQLP
MOVR4,1CH;取回根的阶码
SQRT:
RET基本运算子程序演示程序清单清单8
DMST1:
MOVSP,#70H;基本运算子程序的演示程序
SETBRS0
MOVR1,20H
MOVR2,21H
MOVR3,22H
MOVR4,23H
MOVR5,24H
MOVR6,25H
MOVR7,26H;取第1操作数
LCALLDTOB;转成二进制浮点数
LCALLLD2;存入
MOVR1,27H
MOVR2,28H
MOVR3,29H
MOVR4,2AH
MOVR5,2BH
MOVR6,2CH
MOVR7,2DH;取第2操作数
LCALLDTOB;转成二进制浮点数
LCALLGET2;取第1操作数
LCALLFPAD;调加、减、乘、除、对数函数、指数函数子程序之一
LCALLBTOD;转换成十进制浮点数
SJMP$程序清单:
清单9
LD0:
MOV08H,R4;装入浮点数
MOV09H,R5
MOV0AH,R6
MOV0BH,R7
RET
LD1:
MOV30H,R4;存浮点数
MOV31H,R5
MOV32H,R6
MOV33H,R7
RET
LD2:
MOV34H,R4;存浮点数
MOV35H,R5
MOV36H,R6
MOV37H,R7
RET
LD3:
MOV38H,R4;存浮点数
MOV39H,R5
MOV3AH,R6
MOV3BH,R7
RET
LD4:
MOV18H,R4;存浮点数
MOV19H,R5
MOV1AH,R6
MOV1BH,R7
RET
GET1:
MOVR0,30H;取浮点数
MOVR1,31H
MOVR2,32H
MOVR3,33H
RET
GET2:
MOVR0,34H;取浮点数
MOVR1,35H
MOVR2,36H
MOVR3,37H
RET
GET3:
MOVR0,38H;取浮点数
MOVR1,39H
MOVR2,3AH
MOVR3,3BH
RET
GET4:
MOVR0,18H;取浮点数
MOVR1,19H
MOVR2,1AH
MOVR3,1BH
RET
INVPI:
MOVR0,#86H;取180/π
MOVR1,#65H
MOVR2,#2EH
MOVR3,#0E0H
RET
G90:
MOVR0,#87H;取浮点数90
MOVR1,#34H
CLRA
MOVR2,A
MOVR3,A
RET
GTOR:
ACALLPI18;角度化为弧度子程序
AJMPFPMU
RTOG:
ACALLINVPI;弧度化为角度子程序
AJMPFPMU
GHPI:
MOVR0,#81H;取浮点数π/2
MOVR1,#49H
MOVR2,#0FH
MOVR3,#0DBH
RET
G01:
MOVR0,#7DH;取浮点数0.1
MOVR1,#4CH
MOVR2,#0CCH
MOVR3,#0CDH
RET
G1:
MOVR0,#81H;取浮点数1
CLRA
MOVR1,A
MOVR2,A
MOVR3,A
RET
PI18:
MOVR0,#7BH;取浮点数π/180
MOVR1,#0EH
MOVR2,#0FAH
MOVR3,#35H
RET
GINT:
CJNER4,#81H,$+3;将浮点数取整子程序
JNCGINT1
ACALLG0;阶码<81H,结果为0
AJMPLD0
GINT1:
MOVA,R5
RLCA
MOV78H,C;记数符
CJNER4,#98H,$+3
JNCGOV;阶码>97H,溢出
ACALLBRK;分离出整数部分
JNB78H,GEND;正数结束
CLRA;负数求其补
CLRC
SUBBA,R3
MOVR3,A
CLRA
SUBBA,R2
MOVR2,A
CLRA
SUBBA,R1
MOVR1,A
GEND:
RET
GOV:
LJMP0FFFFH
BRK:
ORL0DH,#80H;分解浮点数(正数)为整数,小数两部分
CLRA
MOVR1,A
MOVR2,A
MOVR3,A
LOOP4:
ACALLSHIF
ACALLLR0
DECR4
CJNER4,#80H,LOOP4;左移尾数(阶码-80H)位,移出部分为整数,在R1~R3中
RET
LDD:
CLR7BH;正整数(最多16位)规格化子程序
MOVR7,#0
MOVR4,#90H
AJMPNOM
G10:
MOVR0,#84H;取浮点数10
MOVR1,#20H
CLRA
MOVR2,A
MOVR3,A
RET
GLN2:
MOVR0,#80H;取浮点数ln2(=0.69314718)
MOVR1,#31H
MOVR2,#72H
MOVR3,#18H
RET
GLN10:
MOVR0,#82H;取浮点数ln10(=2.3025851)
MOVR1,#13H
MOVR2,#5DH
MOVR3,#8EH
RET
INVX:
CJNER4,#0,INV;计算1/x,x=0为溢出
LJMP0FFFFH
INV:
ACALLG1
AJMPFPDI程序清单:
清单10
FPLN1:
SETB7CH;计算奇次多项式值(lnx、sinx、arcsinx等)子程序
ACALLLD4;存x
ACALLLD0
ACALLFPMU;计算x·x
SJMPFLN0
FPLN2:
CLR7CH;计算ex展开式值/cosx
FLN0:
ACALLLD1;x(或x·x)→t,存t
POPDPH
POPDPL
CLRA
MOVCA,@A+DPTR
MOVR0,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR1,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR2,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR3,A;取an
INCDPTR
PLN:
ACALLM1;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t
CLRA
MOVCA,@A+DPTR
MOVR0,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR1,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR2,A
INCDPTR
CLRA
MOVCA,@A+DPTR
MOVR3,A;取ai-1
INCDPTR
ACALLFPLAD;计算(…((an·t+an-1)·t+an-2)·t+…+ai)·t+ai-1
CLRA
MOVCA,@A+DPTR
ACALLGET1
DECA
JNZPLN;1为计算结束符
PEND:
JNB7CH,REND
ACALLGET4
ACALLM1;计算奇次多项式值,再乘以x
REND:
MOVA,#1
JMP@A+DPTR;转至结束符的下一地址LNX,LGAX及LGX子程序清单如下:
清单11
LNX:
MOVA,R4;计算对数函数子程序
JZOV4
MOVA,R5
JNBACC.7,LN1
OV4:
LJMP0FFFFH;x≤0,溢出
LN1:
CLR79H;阶m的符号
MOV1CH,R4;设x=2m·t,则lnx=m·ln2+lnt,先存p=m
MOVR1,#35h
MOVR2,#4
MOVR3,#0f3h;t与2〖〗2相比较
LCALLCP3
JNCLN5;t≥2〖〗2转
DEC1CH;p=m-1,lnx=(m-1)·ln2+ln(2t)
CLR7EH;(2t-1)为正
MOVA,R5
ORLA,R6
ORLA,R7
MOVR4,A
JZLN5A;2t-1=0勿计算ln(2t)
LCALLLD0
CLRC
LCALLLR0;(2t-1)
LCALLSRA0
ORL0DH,#80H;2t+1
MOVR4,#7EH;1/(2t+1)的阶
SJMPLNTLP
LN5:
SETB7EH;(t-1)为负
CLRC
CLRA
SUBBA,R7
MOVR3,A
CLRA
SUBBA,R6
MOVR2,A
CLRA
SUBBA,R5
ADDA,#80H
MOVR1,A;计算(t-1)
LCALLSRA0
ORL0DH,#0C0H;计算(t+1)
MOVR4,#7FH;1/(t+1)的阶
LNTLP:
CLRC
LCALLLR0;(2t-1)或(t-1)规格化
DECR4;调整(2t-1)/(2t+1)或(t-1)/(t+1)的阶
MOVA,R1
JNBACC.7,LNTLP
LCALLFPD3;计算(2t-1)/(2t+1)或(t-1)/(t+1)
LCALLFPLN1;计算lnt或ln(2t)
DB7EH,12H,49H,25H;0.14285714
DB7EH,4CH,0CCH,0CDH;0.2
DB7FH,2AH,0AAH,0AAH;0.33333333
DB81H,0,0,0;1
DB1;结束符
INCR4;得到lnt
LN5A:
MOVA,1CH
ADDA,#80H
JZLN53
JCLN51
CPLA
INCA
CPL79H;p为负,取绝对值,记数符
LN51:
LCALLLD1
MOVR6,A
MOVR5,#0
LCALLLDD;|p|规格化
LCALLGLN2;取ln2
LCALLFPMU;计算|p|·ln2
LCALLGET1;取lnt
JNB79H,LN52
XRL0DH,#80H;p<0计算lnt-|p|·ln2
LN52:
LCALLFPAD;p≥0计算lnt+|p|·ln2
LN53:
RET
LGX:
ACALLLNX;先计算lnx
ACALLGLN10;取ln10
ACALLEX
AJMPFPDI;转计算log