📄 ¿
字号:
; 定点库程序库整理 1999-5-27 ;
;***************************************************;
;程序功能 程序名称
;01.多字节BCD加法 BCDA
;02.多字节BCD减法 BCDB
;03.多字节BCD求补 BEG
;04.多字节BCD码右移一位(乘10) BRLN
;05.多字节二进制无符号数乘法 MULD
;06.双字节二进制无符号数平方 MUL2
;07.双字节二进制无符号数除法 DIVD
;08.双字节二进制无符号数除以单字节二进制数 D457
;09.三字节二进制无符号数除以单字节二进制数 DV31
;10.双字节二进制有符号数乘法(补码) MULS
;11.双字节二进制有符号数除法(补码) DIVS
;12.双字节二进制无符号数开平方(快速) SH2
;13.四字节二进制无符号数开平方(快速) SH4
;14.单字节十六进制数转换成双字节ASCII码 HASC
;15.ASCII码转换成十六进制数 ASCH
;16.单字节十六进制整数转换成单字节BCD码整数 HBCD
;17.双字节十六进制整数转换成双字节BCD码整数 HB2
;18.单字节十六进制小数转换成单字节BCD码小数 HBD
;19.双字节十六进制小数转换成双字节BCD码小数 HBD2
;20.单字节BCD码整数转换成单字节十六进制整数 BCDH
;21.双字节BCD码整数转换成双字节十六进制整数 BH2
;22.单字节BCD码小数转换成单字节十六进制小数 BHD
;23.双字节BCD码小数转换成双字节十六进制小数 BHD2
;24.求单字节十六进制无符号数据块的极值 MM
;25.求单字节十六进制有符号数据块的极值 MMS
;26.顺序查找(ROM)单字节表格 FDS1
;27.顺序查找(ROM)双字节表格 FDS2
;28.对分查找(ROM)单字节无符号增序数据表格 FDD1
;29.对分查找(ROM)双字节无符号增序数据表格 FDD2
;30.求单字节十六进制无符号数据块的平均值 DDM1
;31.求双字节十六进制无符号数据块的平均值 DDM2
;32.求单字节数据块的(异或)校验和 XR1
;33.求双字节数据块的(异或)校验和 XR2
;34.单字节无符号数据块排序(增序) SORT
;****** [多字节BCD加法] BCDA ********************;
;
;入口条件: 字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息: 和在[R0]中,最高位进位在CY中。
;影响资源: PSW、A、R2 堆栈需求: 2字节 进位在 C 中
;调用子程序: 无
BCDA: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV A,R2
ADD A,R1
MOV R1,A
CLR C
BCD1: DEC R0
DEC R1
MOV A,@R0
ADDC A,@R1
DA A
MOV @R0,A
DJNZ R2,BCD1
RET
;------------------------------------------------;
;****** [多字节BCD减法] BCDB ********************;
;入口条件: 字节数在R7中,被减数在[R0]中,减数在[R1]中。
;出口信息: 差在[R0]中,最高位借位在CY中。
;影响资源: PSW、A、R2、R3 堆栈需求: 6字节
;调用子程序: 1个 NEG 多字节求补程序
BCDB: LCALL NEG1 ;多字节BCD求补
LCALL BCDA ;多字节BCD加法
CPL C
MOV F0,C
LCALL NEG1 ;多字节BCD求补
MOV C,F0
RET
NEG1: MOV A,R0
XCH A,R1
XCH A,R0
LCALL NEG ;多字节BCD求补
MOV A,R0
XCH A,R1
XCH A,R0
RET
;------------------------------------------------;
;****** [多字节BCD求补] NEG *********************;
;入口条件: 字节数在R7中,操作数在[R0]中。
;出口信息: 结果仍在[R0]中。
;影响资源: PSW、A、R2、R3 堆栈需求: 2字节
;调用子程序: 无
NEG: MOV A,R7
DEC A
MOV R2,A
MOV A,R0
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0
MOV @R0,A
INC R0
DJNZ R2,NEG0
MOV A,#9AH
SUBB A,@R0
MOV @R0,A
MOV A,R3
MOV R0,A
RET
;------------------------------------------------;
;****** [多字节BCD码左移十进制一位(乘十)] BRLN **;
;入口条件: 字节数在R7中,操作数在[R0]中。
;出口信息: 结果仍在[R0]中,移出的十进制最高位在R3中。
;影响资源: PSW、A、R2、R3 堆栈需求: 2字节
;调用子程序: 无
BRLN: MOV A,R7
MOV R2,A
ADD A,R0
MOV R0,A
MOV R3,#0
BRL1: DEC R0
MOV A,@R0
SWAP A
MOV @R0,A
MOV A,R3
XCHD A,@R0
MOV R3,A
DJNZ R2,BRL1
RET
;------------------------------------------------;
;****** [双字节二进制无符号数乘法] MULD *********;
;入口条件: 被乘数在R2、R3中,乘数在R6、R7中。
;出口信息: 乘积在R2、R3、R4、R5中。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 2字节
;调用子程序: 无
MULD: MOV A,R3
MOV B,R7
MUL AB
MOV R4,B
MOV R5,A
MOV A,R3
MOV B,R6
MUL AB
ADD A,R4
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2
MOV B,R7
MUL AB
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2
MOV B,R6
MUL AB
ADD A,R3
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;------------------------------------------------;
;****** [双字节二进制无符号数平方] MUL2 *********;
;入口条件: 待平方数在R2、R3中。
;出口信息: 结果在R2、R3、R4、R5中。
;影响资源: PSW、A、B、R2~R5 堆栈需求: 2字节
;调用子程序: 无
MUL2: MOV A,R3
MOV B,A
MUL AB
MOV R4,B
MOV R5,A
MOV A,R2
MOV B,A
MUL AB
XCH A,R3
XCH A,B
XCH A,R2
MUL AB
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2
MU20: XCH A,B
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
;------------------------------------------------;
;****** [双字节二进制无符号数除法] DIVD *********;
;入口条件: 被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息: OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
;影响资源: PSW、A、B、R1~R7 堆栈需求: 2字节
;调用子程序: 无
DIVD: CLR C
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV
RET
DVD1: MOV B,#10H
DVD2: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C
CLR C
SUBB A,R7
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0
JC DVD3
MOV R2,A
MOV A,R1
MOV R3,A
INC R5
DVD3: DJNZ B,DVD2
MOV A,R4
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV
RET
;------------------------------------------------;
;****** [双字节二进制无符号数除以单字节二进制数] D457 ;
;入口条件: 被除数在R4、R5中,除数在R7中。
;出口信息: OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源: PSW、A、R3~R7 堆栈需求: 2字节
;调用子程序: 无
D457: CLR C
MOV A,R4
SUBB A,R7
JC DV50
SETB OV
RET
DV50: MOV R6,#8
DV51: MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DV52
MOV R4,A
DV52: CPL C
MOV A,R3
RLC A
MOV R3,A
DJNZ R6,DV51
MOV A,R4
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
;------------------------------------------------;
;****** [三字节二进制无符号数除以单字节二进制数] DV31 ;
;入口条件: 被除数在R3、R4、R5中,除数在R7中。
;出口信息: OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 2字节
;调用子程序: 无
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV
RET
DV30: MOV R2,#10H
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
JC DM24
MOV R3,A
INC R5
DM24: DJNZ R2,DM23
MOV A,R3
ADD A,R3
JC DM25
SUBB A,R7
JC DM26
DM25: INC R5
MOV A,R5
JNZ DM26
INC R4
DM26: CLR OV
RET
;------------------------------------------------;
;****** [双字节二进制有符号数乘法(补码)] MULS ***;
;入口条件: 被乘数在R2、R3中,乘数在R6、R7中。
;出口信息: 乘积在R2、R3、R4、R5中。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 4字节
;调用子程序: 3个,MDS MULD MDSE
MULS: MOV R4,#0
MOV R5,#0
ACALL MDS ;计算结果的符号和两个操作数的绝对值
ACALL MULD ;计算两个绝对值的乘积
ACALL MDSE ;用补码表示结果
RET
;------------------------------------------------;
;****** [双字节二进制有符号数除法(补码)] DIVS ***;
;入口条件: 被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息: OV=0时商在R2、R3中,OV=1时溢出。
;影响资源: PSW、A、B、R1~R7 堆栈需求: 5字节
;调用子程序: 2个 MDS DIVD
DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值
PUSH PSW
LCALL DIVD ;计算两个绝对值的商
JNB OV,DVS1
POP ACC
RET
DVS1: POP PSW
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果
CLR OV
RET
MDS: CLR F0
MOV A,R6
JNB ACC.7,MDS1
CPL F0
XCH A,R7
CPL A
ADD A,#1
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2
JNB ACC.7,MDS3
CPL F0
MDS2: MOV A,R5
CPL A
ADD A,#1
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R3
CPL A
ADDC A,#0
MOV R3,A
MOV A,R2
CPL A
ADDC A,#0
MOV R2,A
MDS3: CLR OV
RET
;------------------------------------------------;
;****** [双字节二进制无符号数开平方(快速)] SH2 **;
;入口条件: 被开方数在R2、R3中。
;出口信息: 平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 4字节
;调用子程序: 1个 SQRH
SH2: MOV A,R2
ORL A,R3
JNZ SH20
RET
SH20: MOV R7,#0
MOV A,R2
SH22: ANL A,#0C0H
JZ SH33
ACALL SQRH
SH33: CLR C
MOV A,R3
RLC A
MOV F0,C
CLR C
RLC A
MOV R3,A
MOV A,R2
MOV ACC.7,C
MOV C,F0
RLC A
RLC A
MOV R2,A
INC R7
AJMP SH22
;------------------------------------------------;
;****** [四字节二进制无符号数开平方(快速)] SH4 **;
;入口条件: 被开方数在R2、R3、R4、R5中。
;出口信息: 平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
;影响资源: PSW、A、B、R2~R7 堆栈需求: 2字节
;调用子程序: 无
SH4: MOV A,R2
ORL A,R3
ORL A,R4
ORL A,R5
JNZ SH40
RET
SH40: MOV R7,#0
MOV A,R2
SH41: ANL A,#0C0H
JNZ SQRH
MOV R6,#2
SH42: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
DJNZ R6,SH42
INC R7
AJMP SH41
SQRH: MOV A,R2
ADD A,#57H
JC SQR2
ADD A,#45H
JC SQR1
ADD A,#24H
MOV B,#0E3H
MOV R4,#80H
AJMP SQR3
SQR1: MOV B,#0B2H
MOV R4,#0A0H
AJMP SQR3
SQR2: MOV B,#8DH
MOV R4,#0D0H
SQR3: MUL AB
MOV A,B
ADD A,R4
MOV R4,A
MOV B,A
MUL AB
XCH A,R3
CLR C
SUBB A,R3
MOV R3,A
MOV A,R2
SUBB A,B
MOV R2,A
SQR4: SETB C
MOV A,R4
RLC A
MOV R6,A
CLR A
RLC A
MOV R5,A
MOV A,R3
SUBB A,R6
MOV B,A
MOV A,R2
SUBB A,R5
JC SQR5
INC R4
MOV R2,A
MOV R3,B
AJMP SQR4
SQR5: MOV A,R4
XCH A,R2
RRC A
MOV F0,C
MOV A,R3
MOV R5,A
MOV R4,#8
SQR6: CLR C
MOV A,R3
RLC A
MOV R3,A
CLR C
MOV A,R5
SUBB A,R2
JB F0,SQR7
JC SQR8
SQR7: MOV R5,A
INC R3
SQR8: CLR C
MOV A,R5
RLC A
MOV R5,A
MOV F0,C
DJNZ R4,SQR6
MOV A,R7
JZ SQRE
SQR9: CLR C
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
DJNZ R7,SQR9
SQRE: RET
;------------------------------------------------;
;****** [单字节十六进制数转换成双字节ASCII码] HASC
;入口条件: 待转换的单字节十六进制数在累加器A中。
;出口信息: 高四位的ASCII码在A中,低四位的ASCII码在B中。
;影响资源: PSW、A、B 堆栈需求: 4字节
;调用子程序: 1个 HAS1 内部
HASC: MOV B,A
ACALL HAS1
XCH A,B
SWAP A
HAS1: ANL A,#0FH
ADD A,#90H
DA A
ADDC A,#40H
DA A
RET
;------------------------------------------------;
;****** [ASCII码转换成十六进制数] ASCH **********;
;入口条件: 待转换的ASCII码(30H~39H或41H~46H)在A中。
;出口信息: 转换后的十六进制数(00H~0FH)仍在累加器A中。
;影响资源: PSW、A 堆栈需求: 2字节
;调用子程序: 无
ASCH: CLR C
SUBB A,#30H
JNB ACC.4,ASH1
SUBB A,#7
ASH1: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -