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

📄 no4a.asm

📁 AVR-AT90S8535,HD8279,等开发的洁净空调专用DDC系统,包括AD/DA,PID计算等.
💻 ASM
字号:
.include "8535def.inc"
.org	0x00

.def	mc16uL	=r9		;被乘数低字节
.def	mc16uH	=r10		;被乘数高字节
.def	mp16uL	=r11		;乘数低字节
.def	mp16uH	=r12		;乘数高字节
.def	m16ua	=r11		;结果 字节 0 (LSB)
.def	m16ub	=r12		;结果 字节 1
.def	m16u2	=r13		;结果 字节 2
.def	m16u3	=r14		;结果 字节 3 (MSB)
.def	mcnt16u	=r21		;循环计数
	rjmp	RESET		;reset handle
.org	0x020

reset:
	clr	mc16uh
	clr	mp16uh
	;ldi	mcnt16u,1
	mov	mc16ul,mcnt16u
	ldi	mcnt16u,50
	mov	mp16ul,mcnt16u
	rcall	mpy16u
	
	mov	mp16ul,m16ua
	mov	mp16uh,m16ub
	ldi	mcnt16u,11
	mov	mc16ul,mcnt16u
	clr	mc16uh
	rcall	div16u
	
	mov	mc16ul,m16ua
	mov	mc16uh,m16ub
	ldi	mcnt16u,10
	mov	mp16ul,mcnt16u
	clr	mp16uh
	rcall	mpy16u
	
	mov	mp16ul,m16ua
	mov	mp16uh,m16ub
	ldi	mcnt16u,3
	mov	mc16ul,mcnt16u
	clr	mc16uh
	rcall	div16u
	
	mov	mc16ul,m16ua
	mov	mc16uh,m16ub
	ldi	mcnt16u,4
	mov	mp16ul,mcnt16u
	clr	mp16uh
	rcall	mpy16u
	
	mov	mp16ul,m16ua
	mov	mp16uh,m16ub
	ldi	mcnt16u,31
	mov	mc16ul,mcnt16u
	clr	mc16uh
	rcall	div16u
	
	mov	mc16ul,m16ua
	mov	mc16uh,m16ub
	ldi	mcnt16u,2
	mov	mp16ul,mcnt16u
	clr	mp16uh
	rcall	mpy16u
	
	nop
	nop

mpy16u:	clr	m16u3		;清2.3
	clr	m16u2
	ldi	mcnt16u,16	;
	lsr	mp16uH
	ror	mp16uL
m16u_1:	brcc	noad8		;C清零转
	add	m16u2,mc16uL	;加被乘数到2
	adc	m16u3,mc16uH	;加被乘数到3
noad8:	ror	m16u3		;带进位右循环
	ror	m16u2		;带进位右循环
	ror	m16ub		;带进位右循环
	ror	m16ua		;带进位右循环
	dec	mcnt16u		;计数减1
	brne	m16u_1		;不为零转
	ret

.def	drem16uL=r13		;余数  低位
.def	drem16uH=r14		;余数  高位
.def	dres16uL=r11		;  商  低位
.def	dres16uH=r12		;  商  高位
.def	dd16uL	=r11		;被除数 低位
.def	dd16uH	=r12		;被除数 高位
.def	dv16uL	=r9		;除数   低位
.def	dv16uH	=r10		;除数   高位
.def	dcnt16u	=r21		

;***** Code

div16u:	clr	drem16uL		;清除余数低位
	sub	drem16uH,drem16uH	;清除余数高位
	ldi	dcnt16u,17		;循环计数
d16u_1:	rol	dd16uL			;带进位左移
	rol	dd16uH
	dec	dcnt16u			;decrement counter
	brne	d16u_2			;不为0转
	ret				;return
d16u_2:	rol	drem16uL		;shift dividend into remainder
	rol	drem16uH
	sub	drem16uL,dv16uL		;remainder = remainder - divisor
	sbc	drem16uH,dv16uH	;
	brcc	d16u_3			;if result negative
	add	drem16uL,dv16uL		;restore remainder
	adc	drem16uH,dv16uH
	clc				;clear carry to be shifted into result
	rjmp	d16u_1			;else
d16u_3:	sec				;set carry to be shifted into result
	rjmp	d16u_1

⌨️ 快捷键说明

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