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

📄 netlen.asm

📁 在定时器中断中做LED的PWM输出 AT89C2051实现A/D转换的C51程序 单片机开发系统 指令系统 程序设计 定时与中断 系统扩展 接口技术 串行口
💻 ASM
字号:
;网络中顶点间最短距离算法(利用邻接矩阵)。
;
;网络结构:
;              A
;            / | \
;        4 /   |   \ 7
;        /     |     \
;      B      6|       C
;      | \ 9   |   8 / |
;      |   \   |   /   |
;      |     \ | /     |
;     8|       D       |5
;      |     / | \ 3   | 
;      |  5/   |   \   | 
;      | /     |     \ | 
;      E      4|       F 
;       \      |      /
;         \    |    /  
;        2  \  |  / 9
;              G
;
;从节点A出发的最短距离与路径:
;              A
;            / | \
;        4 /   |   \ 7
;        /     |     \
;      B=4    6|      C=7
;              |        
;              |        
;              |        
;             D=6         
;            / | \ 3     
;         5/   |   \     
;        /     |     \   
;      E=11   4|     F=9
;              |       
;              |       
;              |     
;             G=10
;
;从节点B出发的最短距离与路径:
;             A=4
;            /   \
;        4 /       \ 7
;        /           \
;      B             C=11
;      | \ 9            
;      |   \            
;      |     \          
;     8|      D=9         
;      |         \ 3     
;      |           \     
;      |             \   
;     E=8            F=12
;       \             
;         \            
;        2  \        
;           G=10
;
;从节点C出发的最短距离与路径:
;             A=7
;            /   \
;        4 /       \ 7
;        /           \
;      B=11            C
;                  8 / |
;                  /   |
;                /     |
;             D=8      |5
;            / |       | 
;         5/   |       | 
;        /     |       | 
;      E=13   4|      F=5 
;              |       
;              |       
;              |     
;             G=12
;
;从节点D出发的最短距离与路径:
;             A=6
;              |  
;              |      
;              |      
;      B=9    6|     C=8
;        \ 9   |   8 /  
;          \   |   /    
;            \ | /      
;              D         
;            / | \ 3     
;         5/   |   \     
;        /     |     \   
;      E=5    4|     F=3
;              |       
;              |       
;              |     
;             G=4
;
;
;从节点E出发的最短距离与路径:
;             A=11
;              |  
;              |      
;              |      
;     B=8     6|     C=13
;      |       |   8 /  
;      |       |   /    
;      |       | /      
;     8|      D=5         
;      |     /   \ 3     
;      |  5/       \     
;      | /           \   
;      E             F=8
;       \              
;         \            
;        2  \        
;            G=2
;
;
;从节点F出发的最短距离与路径:
;             A=9
;              |   
;              |      
;              |      
;      B=12   6|      C=5
;        \ 9   |       |
;          \   |       |
;            \ |       |
;             D=3      |5
;            / | \ 3   | 
;         5/   |   \   | 
;        /     |     \ | 
;      E=8    4|       F 
;              |       
;              |       
;              |    
;             G=7
;
;
;从节点G出发的最短距离与路径:
;             A=10
;              |  
;              |      
;              |      
;     B=10    6|     C=12
;      |       |   8 /  
;      |       |   /    
;      |       | /      
;     8|      D=4      
;      |       | \ 3     
;      |       |   \     
;      |       |     \   
;     E=2     4|     F=7
;       \      |       
;         \    |       
;        2  \  |     
;              G
;
NET	EQU	20H	;网络存放的片外RAM页面(顶点总数不超过13)。
LEN	EQU	0E0H	;距离数组起始地址。
POINT	EQU	0F0H	;父指针数组起始地址。
N	DATA	3EH	;顶点总数加一存放单元。
K	DATA	3FH	;起始顶点编号存放单元。

	ORG	0000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	DPTR,#NETDAT;将网络邻接矩阵拷贝到片外RAM中。
	MOV	P2,#NET
	MOV	R0,#0
	MOV	R2,#80H
COPY:	CLR	A
	MOVC	A,@A+DPTR
	MOVX	@R0,A
	INC	DPTR
	INC	R0
	DJNZ	R2,COPY
	MOV	DPH,#NET;指向网络存放的片外RAM页面。
	MOV	DPL,#0
	MOVX	A,@DPTR	;读取网络顶点总数。
	INC	A
	MOV	N,A	;保存网络顶点总数。
	MOV	K,#1	;以编号为1的顶点作为起点。
TEST1:	LCALL	MINLEN	;求解其它顶点到起点的最短距离。
	INC	K	;换一个顶点作为起点。
	MOV	A,K
	CJNE	A,N,TEST1
STOP:	LJMP	STOP

MINLEN:	MOV	DPH,#NET;指向网络存放的片外RAM页面。
	MOV	DPL,#0
	MOVX	A,@DPTR	;读取网络顶点总数。
	MOV	R7,A	;保存网络顶点总数。
	MOV	R6,A
CLEAR:	MOV	A,DPL	;指向访问标志数组(竖向分布)。
	ADD	A,#10H
	MOV	DPL,A
	CLR	A
	MOVX	@DPTR,A	;初始化访问标志。
	DJNZ	R6,CLEAR
	MOV	P2,#NET	;指向网络的存放页面。
	MOV	A,K	;读取起始顶点编号,作为生成树根节点编号。
	MOV	R2,A
	SWAP	A
	MOV	R1,A	;根节点标志单元。
	MOV	A,#1
	MOVX	@R1,A	;将根节点设置为已访问。
	MOV	R0,#LEN	;准备初始化距离数组。
	MOV	A,R7
	MOV	R6,A	;控制范围。
MINL:	INC	R1	;调整指针。
	INC	R0
	MOVX	A,@R1	;读取到根节点的距离。
	MOVX	@R0,A	;作为该顶点到生成树的初始距离。
	DJNZ	R6,MINL
	MOV	R0,#POINT;准备初始化父指针数组。
	MOV	A,R7	;控制范围。
	MOV	R6,A
	MOV	A,R2	;读取根节点的编号。
MINL1:	INC	R0
	MOVX	@R0,A	;作为其它顶点的父节点。
	DJNZ	R6,MINL1
	MOV	A,R2
	ADD	A,#POINT
	MOV	R0,A	;指向根节点自己的父节点单元。
	MOV	A,#0
	MOVX	@R0,A	;填入0,表示自己是根节点。
	MOV	A,R7
	DEC	A
	MOV	R3,A	;准备就其它顶点扩充到生成树中来。
MINL2:	MOV	R4,#0FFH;初始化距离最小值,准备寻找离起点最近的顶点。
	MOV	R5,#0	;初始化距离最近顶点的编号。
	MOV	R0,#LEN+1;指向距离数组。
	MOV	R1,#10H	;指向标志数组。
	MOV	A,R7	
	MOV	R6,A	;控制寻找范围。
MINL3:	MOVX	A,@R1	;读取一个标志。
	JNZ	MINL4	;该顶点已访问,跳过。
	MOVX	A,@R0	;尚未访问,读取该顶点到起点的距离。
	CLR	C
	SUBB	A,R4	;与当前最小值比较。
	JNC	MINL4	;不是新的最小值。
	MOVX	A,@R0
	MOV	R4,A	;保存新的最小值。
	MOV	A,R0
	ANL	A,#0FH	;取新的最小值对应的顶点编号。
	MOV	R5,A	;保存新的最小值对应的顶点编号。
MINL4:	INC	R0	;调整数组指针。
	MOV	A,R1	;调整标志指针。
	ADD	A,#10H
	MOV	R1,A
	DJNZ	R6,MINL3;查完全部顶点。
	MOV	A,R5	;读取找到的顶点编号。
	SWAP	A
	MOV	R0,A	;指向新顶点的标志单元。
	MOV	A,#1
	MOVX	@R0,A	;设置访问标志,该顶点进入生成树中。
	INC	R0	;指向新顶点的邻接矩阵对应行。
	MOV	DPL,#LEN+1;指向距离数组。
	MOV	R1,#10H	;指向标志数组。
	MOV	A,R7
	MOV	R6,A	;控制调整范围,准备对距离数组进行调整。
MINL6:	MOVX	A,@R1	;读取该顶点的访问标志。
	JNZ	MINL7	;已访问,不需调整。
	MOVX	A,@R0	;读取该顶点到新顶点的距离。
	ADD	A,R4	;加上新顶点到起点的距离。
	JC	MINL7	;太远(假设最大距离不超过255),不需调整。
	MOV	R2,A	;保存之。
	MOVX	A,@DPTR	;读取该顶点到起点的距离。
	SETB	C
	SUBB	A,R2	;进行比较。
	JC	MINL7	;通过新顶点到起点更远,不用调整。
	MOV	A,R2	;取通过新顶点到起点的距离。
	MOVX	@DPTR,A	;作为该顶点到起点新的距离。
	MOV	A,R0	;保存指针。
	MOV	R2,A
	ANL	A,#0FH
	ADD	A,#POINT
	MOV	R0,A	;指向该顶点的父节点编号存放单元。
	MOV	A,R5	;以新顶点作为该顶点的父节点。
	MOVX	@R0,A	;
	MOV	A,R2	;恢复指针。
	MOV	R0,A
MINL7:	INC	R0	;调整指针。
	INC	DPTR
	MOV	A,R1
	ADD	A,#10H
	MOV	R1,A
	DJNZ	R6,MINL6;处理完距离数组的全部单元。
	DJNZ	R3,MINL2;继续查找生成树下一个准备吸收的顶点。
	RET		;全部顶点均已进入生成树,算法结束。

;2000H: 07 41 42 43 44 45 46 47----顶点信息
;邻接矩阵 :
;2010H: 00 00 04 07 06 FF FF FF
;2020H: 00 04 00 FF 09 08 FF FF
;2030H: 00 07 FF 00 08 FF 05 FF
;2040H: 00 06 09 08 00 05 03 04
;2050H: 00 FF 08 FF 05 00 FF 02
;2060H: 00 FF FF 05 03 FF 00 09
;2070H: 00 FF FF FF 04 02 09 00
;
;20E0H: 00 00 00 00 00 00 00 00----距离数组
;20F0H: 00 00 00 00 00 00 00 00----父指针数组
NETDAT:	DB	07H,41H,42H,43H
	DB	44H,45H,46H,47H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,00H,04H,07H
	DB	06H,0FFH,0FFH,0FFH
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,04H,00H,0FFH
	DB	09H,08H,0FFH,0FFH
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,07H,0FFH,00H
	DB	08H,0FFH,05H,0FFH
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,06H,09H,08H
	DB	00H,05H,03H,04H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,0FFH,08H,0FFH
	DB	05H,00H,0FFH,02H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,0FFH,0FFH,05H
	DB	03H,0FFH,00H,09H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	DB	00H,0FFH,0FFH,0FFH
	DB	04H,02H,09H,00H
	DB	00H,00H,00H,00H
	DB	00H,00H,00H,00H
	END

⌨️ 快捷键说明

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