⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51.asm

📁 单片机定点运算子程序库
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;**********************************************************
;  MCS-51定点运算子程序库及其使用说明

;    1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数
;据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
;(31H)=34H,(32H)=56H。
;    2.运算精度:单次定点运算精度为结果最低位的当量值。
;    3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无
;关的或非消耗性的信息,程序就具有较好的透明性。
;********************************************************************
;(1)  标号:BCDA 功能:多字节BCD码加法
;(2)  标号:BCDB 功能:多字节BCD码减法
;(3)  标号:NEG   功能:多字节BCD码取补
;(4)  标号:BRLN 功能:多字节BCD码左移十进制一位(乘十)
;(5)  标号:MULD 功能:双字节二进制无符号数乘法
;(6)  标号: MUL2 功能:双字节二进制无符号数平方
;(7)  标号:DIVD 功能:双字节二进制无符号数除法
;(8)  标号:D457 功能:双字节二进制无符号数除以单字节二进制数
;(9)  标号: DV31 功能:三字节二进制无符号数除以单字节二进制数
;(10)标号:MULS 功能:双字节二进制有符号数乘法(补码)
;(11)标号:DIVS 功能:双字节二进制有符号数除法(补码)
;(12)标号:SH2   功能:双字节二进制无符号数开平方(快速)
;(13)标号: SH4   功能:四字节二进制无符号数开平方(快速)
;(14)标号:HASC 功能:单字节十六进制数转换成双字节ASCII码
;(15)标号:ASCH 功能:ASCII码转换成十六进制数
;(16)标号: HBCD 功能:单字节十六进制整数转换成单字节BCD码整数
;(17)标号:HB2   功能:双字节十六进制整数转换成双字节BCD码整数
;(18)标号:HBD   功能:单字节十六进制小数转换成单字节BCD码小数
;(19)标号:HBD2 功能:双字节十六进制小数转换成双字节BCD码小数
;(20)标号:BCDH 功能:单字节BCD码整数转换成单字节十六进制整数
;(21)标号:BH2   功能:双字节BCD码整数转换成双字节十六进制整数
;(22)标号:BHD   功能:单字节BCD码小数转换成单字节十六进制小数
;(23)标号:BHD2 功能:双字节BCD码小数转换成双字节十六进制小数
;(24)标号:MM     功能:求单字节十六进制无符号数据块的极值
;(25)标号:MMS   功能:求单字节十六进制有符号数据块的极值
;(26)标号:FDS1 功能:顺序查找(ROM)单字节表格
;(27)标号:FDS2 功能:顺序查找(ROM)双字节表格
;(28)标号:FDD1 功能:对分查找(ROM)单字节无符号增序数据表格
;(29)标号:FDD2 功能:对分查找(ROM)双字节无符号增序数据表格
;(30)标号: DDM1 功能:求单字节十六进制无符号数据块的平均值
;(31)标号:DDM2 功能:求双字节十六进制无符号数据块的平均值
;(32)标号:XR1   功能:求单字节数据块的(异或)校验和
;(33) 标号:XR2   功能:求双字节数据块的(异或)校验和
;(34)标号:SORT 功能:单字节无符号数据块排序(增序)

;**********************************************************
;   (1)  标号: BCDA  功能:多字节BCD码加法

;入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
;出口信息:和在[R0]中,最高位进位在CY中。
;影响资源:PSW、A、R2    堆栈需求:  2字节

BCDA:
        MOV	A,R7   ;取字节数至R2中
	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	;和存回[R0]中
	DJNZ	R2,BCD1	;处理完所有字节
	RET

;  (2) 标号:BCDB  功能:多字节BCD码减法

;入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
;出口信息:差在[R0]中,最高位借位在CY中。
;影响资源:PSW、A、R2、R3    堆栈需求:  6字节

BCDB:
        LCALL	NEG1	;减数[R1]十进制取补
	LCALL	BCDA	;按多字节BCD码加法处理
	CPL	C	;将补码加法的进位标志转换成借位标志
	MOV	F0,C	;保护借位标志
	LCALL	NEG1	;恢复减数[R1]的原始值
	MOV	C,F0    ;恢复借位标志
	RET
NEG1:
        MOV	A,R0	;[R1]十进制取补子程序入口
	XCH	A,R1	;交换指针
	XCH	A,R0
	LCALL	NEG	;通过[R0]实现[R1]取补

	MOV	A,R0
	XCH	A,R1	;换回指针
	XCH	A,R0
	RET

;  (3)标号:NEG  功能:多字节BCD码取补

;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中。
;影响资源:PSW、A、R2、R3    堆栈需求:  2字节

NEG:
        MOV	A,R7	;取(字节数减一)至R2中
	DEC	A
	MOV	R2,A
	MOV	A,R0	;保护指针
	MOV	R3,A
NEG0:
        CLR	C
	MOV	A,#99H
	SUBB	A,@R0	;按字节十进制取补
	MOV	@R0,A	;存回[R0]中
	INC	R0	;调整数据指针
	DJNZ	R2,NEG0	;处理完(R2)字节

	MOV	A,#9AH	;最低字节单独取补
	SUBB	A,@R0
	MOV	@R0,A
	MOV	A,R3	;恢复指针
	MOV	R0,A
	RET

; (4)标号:BRLN  功能:多字节BCD码左移十进制一位(乘十)

;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中,移出的十进制最高位在R3中。
;影响资源:PSW、A、R2、R3    堆栈需求:  2字节

BRLN:
        MOV	A,R7	;取字节数至R2中
   	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

;  (5)标号:MULD  功能:双字节二进制无符号数乘法

;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7    堆栈需求:2字节

MULD:
        MOV	A,R3	;计算R3乘R7
	MOV	B,R7

	MUL	AB
	MOV	R4,B	;暂存部分积
	MOV	R5,A
	MOV	A,R3	;计算R3乘R6
	MOV	B,R6
	MUL	AB
	ADD	A,R4	;累加部分积
	MOV	R4,A
	CLR	A
	ADDC	A,B
	MOV	R3,A
	MOV	A,R2	;计算R2乘R7
	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	;计算R2乘R6
	MOV	B,R6
	MUL	AB
	ADD	A,R3	;累加部分积
	MOV	R3,A
	MOV	A,R2
	ADDC	A,B
	MOV	R2,A
	RET

; (6)标号: MUL2 功能:双字节二进制无符号数平方

;入口条件:待平方数在R2、R3中。
;出口信息:结果在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R5    堆栈需求:  2字节

MUL2:   MOV	A,R3	;计算R3平方
	MOV	B,A
	MUL	AB
	MOV	R4,B	;暂存部分积
	MOV	R5,A
	MOV	A,R2	;计算R2平方
	MOV	B,A
	MUL	AB
	XCH	A,R3	;暂存部分积,并换出R2和R3
	XCH	A,B
	XCH	A,R2
	MUL	AB	;计算2×R2×R3
	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

;(7) 标号: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	;计算(R2R3-R6R7)
	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	;计算完十六位商(R4R5)
	MOV	A,R4	;将商移到R2R3中

	MOV	R2,A
	MOV	A,R5
	MOV	R3,A
	CLR	OV	;设立成功标志
	RET

; (8)  标号: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	;求平均值(R4R5/R7-→R3)
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

;(9)标号: 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	 ;求R3R4R5/R7-→R4R5
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              ;商在R4R5中


; (10)标号:MULS  功能:双字节二进制有符号数乘法(补码)

;入口条件:被乘数在R2、R3中,乘数在R6、R7中。
;出口信息:乘积在R2、R3、R4、R5中。
;影响资源:PSW、A、B、R2~R7    堆栈需求:4字节

MULS:
        MOV	R4,#0	;清零R4R5
	MOV	R5,#0
	LCALL	MDS	;计算结果的符号和两个操作数的绝对值
	LCALL	MULD	;计算两个绝对值的乘积
	SJMP	MDSE	;用补码表示结果

;(11)标号:DIVS 功能:双字节二进制有符号数除法(补码)

;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
;出口信息:OV=0时商在R2、R3中,OV=1时溢出。
;影响资源:PSW、A、B、R1~R7    堆栈需求:  5字节

DIVS:	LCALL	MDS	;计算结果的符号和两个操作数的绝对值
	PUSH	PSW	;保存结果的符号
	LCALL	DIVD	;计算两个绝对值的商
	JNB	OV,DVS1	;溢出否?
	POP	ACC	;溢出,放去结果的符号,保留溢出标志
	RET

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -