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

📄 postz.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 ASM
字号:
;普通树的后根遍历算法(利用子指针数组)。
STACK	EQU	1FH	;用户堆栈所在页面。
BOTTOM	EQU	00H	;用户堆栈栈底单元。
TOP	DATA	3EH	;用户堆栈栈顶指针。
TREE	EQU	20H	;普通树存放的片外RAM页面。
POINT1	EQU	21H	;第一指针存储在21H页面。
POINT2	EQU	22H	;第二指针存储在22H页面。
POINT3	EQU	23H	;第三指针存储在23H页面。
OUT	EQU	24H	;被访问节点信息输出存放在24H页面。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	SP,#5FH	;设置足够大的系统堆栈空间。
	MOV	DPTR,#DATS;将普通树的节点数组存放到片外RAM中。
	MOV	P2,#TREE
	MOV	R0,#0
	MOV	R2,#19
COPY:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R2,COPY
	MOV	DPTR,#Z1;将普通树的第一指针数组存放到片外RAM中。
	MOV	P2,#POINT1
	MOV	R0,#0
	MOV	R2,#19
COPY1:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R2,COPY1
	MOV	DPTR,#Z2;将普通树的第二指针数组存放到片外RAM中。
	MOV	P2,#POINT2
	MOV	R0,#0
	MOV	R2,#19
COPY2:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R2,COPY2
	MOV	DPTR,#Z3;将普通树的第三指针数组存放到片外RAM中。
	MOV	P2,#POINT3
	MOV	R0,#0
	MOV	R2,#19
COPY3:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R2,COPY3
	MOV	DPH,#OUT;指向输出存放节点信息的片外RAM页面。
	MOV	DPL,#0
	MOV	R2,#0
	CLR	A
CLEAR:	MOVX	@DPTR,A	;初始化输出区。
	INC	DPTR
	DJNZ	R2,CLEAR
	MOV	P2,#TREE;指向树节点信息存放页面。
	MOV	R0,#0
	MOV	DPH,#OUT;指向输出存放节点信息的片外RAM页面。
	MOV	DPL,#0
	MOVX	A,@R0	;读取普通树的有效节点总数。
	MOVX	@DPTR,A	;存放到输出区的00H单元。
	INC	R0	;指向根节点。
	INC	DPTR	;指向输出区第一个存放位置。
	JZ	STOP	;如果是空树,则结束访问。
	LCALL	SETNULL	;初始化用户堆栈。
	LCALL	POST	;从全树的根节点出发,调用后根遍历算法。
STOP:	LJMP	STOP	;遍历顺序为LMNHIEFBCOPQJRKGDA。

DATS:	DB	12H,41H,42H,43H	;普通树的节点数组。
	DB	44H,45H,46H,47H
	DB	48H,49H,4AH,4BH
	DB	4CH,4DH,4EH,4FH
	DB	50H,51H,52H
Z1:	DB	00H,02H,05H,00H	;普通树的第一指针数组。
	DB	07H,08H,00H,0AH
	DB	0CH,00H,0FH,12H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H
Z2:	DB	00H,03H,06H,00H	;普通树的第二指针数组。
	DB	00H,09H,00H,0BH
	DB	0DH,00H,10H,00H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H
Z3:	DB	00H,04H,00H,00H	;普通树的第三指针数组。
	DB	00H,00H,00H,00H
	DB	0EH,00H,11H,00H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H

POST:	MOV	P2,#TREE;指向树节点信息存放页面。
	MOVX	A,@R0	;读取当前节点。
	JZ	POSTEND	;是虚节点则返回。
	MOV	P2,#POINT1;取第一指针所在页面。
	MOVX	A,@R0	;读取第一个子节点的地址。
	JZ	POST1	;一个子节点也没有,返回当前节点。
	XCH	A,R0	;存放第一子节点地址,并取当前访问节点的编号。
	LCALL	DPUSH	;将当前节点编号压入用户堆栈进行保护。
	LCALL	POST	;然后按后根遍历算法访问第一子树(递归调用)。
	LCALL	DPOP	;取出保存的节点编号。
	MOV	R0,A
	MOV	P2,#POINT2;取第二指针所在页面。
	MOVX	A,@R0	;读取第二个子节点的地址。
	JZ	POST1	;没有子节点,返回当前节点。
	XCH	A,R0	;存放第二子节点地址,并取当前访问节点的编号。
	LCALL	DPUSH	;将当前节点编号压入用户堆栈进行保护。
	LCALL	POST	;然后按前根遍历算法访问第二子树(递归调用)。
	LCALL	DPOP	;取出保存的节点编号。
	MOV	R0,A
	MOV	P2,#POINT3;取第三指针所在页面。
	MOVX	A,@R0	;读取第三个子节点的地址。
	JZ	POST1	;没有子节点,返回当前节点。
	XCH	A,R0	;存放第三子节点地址,并取当前访问节点的编号。
	LCALL	DPUSH	;将当前节点编号压入用户堆栈进行保护。
	LCALL	POST	;然后按前根遍历算法访问第三子树(递归调用)。
	LCALL	DPOP	;取出保存的节点编号。
	MOV	R0,A
POST1:	MOV	P2,#TREE;指向树节点信息存放页面。
	MOVX	A,@R0	;读取当前节点。
	MOVX	@DPTR,A	;完成最后访问根节点的目的。
	INC	DPTR	;调整输出指针。
POSTEND:RET		;返回。

SETNULL:MOV	A,#BOTTOM;初始化空栈,取栈底单元位置。
	MOV	TOP,A	;使栈顶指针指向栈底。
	RET		;设置好空栈。

DPUSH:	INC	TOP	;新栈顶。
	PUSH	DPH
	PUSH	DPL
	MOV	DPH,#STACK;取堆栈所在页面。
	MOV	DPL,TOP	;取栈顶单元位置。
	MOVX	@DPTR,A	;数据压入栈顶。
	POP	DPL
	POP	DPH
	RET		;结束。

DPOP:	PUSH	DPH
	PUSH	DPL
	MOV	DPH,#STACK;取堆栈所在页面。
	MOV	DPL,TOP	;取栈顶单元。
	MOVX	A,@DPTR	;取出栈顶元素。
	DEC	TOP	;指向新的栈顶。
	POP	DPL
	POP	DPH
	RET		;结束。
	END



⌨️ 快捷键说明

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