delete2.asm

来自「单片机程序设计基础 随书光盘」· 汇编 代码 · 共 79 行

ASM
79
字号
;双字节表格的删除算法
FRONT	EQU	2000H	;表格首址存放单元(高字节)。
NUMBH	DATA	30H	;已有元素个数存放单元(高字节)。
NUMBL	DATA	31H	;已有元素个数存放单元(低字节)。
IH	DATA	32H	;待删除元素的序号存放单元(高字节)。
IL	DATA	33H	;待删除元素的序号存放单元(低字节)。

	ORG	000H
	LJMP	TEST
	
	ORG	100H
TEST:	MOV	NUMBH,#0;已有双字节数据160个(任意设定)
	MOV	NUMBL,#0A0H
	MOV	IH,#0	;准备删除序号为128的数据
	MOV	IL,#80H
	LCALL	DELETE	;调用删除算法
STOP:	LJMP	STOP

DELETE:	SETB	C	;初始化失败标志。
	MOV	A,NUMBL
	ORL	A,NUMBH	;表格空否?
	JZ	DELEND	;表格已空,删除失败。
	MOV	DPTR,#FRONT;取表格首址。
	CLR	C
	MOV	A,IL	;按每个数据占两个字节计算偏移量。
	RLC	A
	MOV	R2,A
	MOV	A,IH
	RLC	A
	XCH	A,R2
	ADD	A,DPL	;加偏移量。
	MOV	DPL,A
	MOV	A,R2
	ADDC	A,DPH
	MOV	DPH,A	;得到删除的实际地址。
	SETB	C
	MOV	A,NUMBL	;删除位置超出范围否?
	SUBB	A,IL
	MOV	R3,A
	MOV	A,NUMBH
	SUBB	A,IH
	MOV	R2,A	;保存需要移动元素的个数。
	JC	DELEND	;位置不合理,删除失败。
	ORL	A,R3
	JZ	DEL	;不需要移动元素。
	MOV	A,R3	;计数器检查。
	JZ	MOVS
	INC	R2	;计数器校正。
MOVS:	INC	DPTR	;指针后移一个元素。
	INC	DPTR
	MOVX	A,@DPTR	;读取一个元素。
	MOV	R4,A
	INC	DPTR
	MOVX	A,@DPTR
	MOV	R5,A
	MOV	A,#0FDH	;指针前移一个元素(后退3字节)。
	ADD	A,DPL
	MOV	DPL,A
	MOV	A,#0FFH
	ADDC	A,DPH
	MOV	DPH,A
	MOV	A,R4
	MOVX	@DPTR,A	;存入。
	INC	DPTR
	MOV	A,R5
	MOVX	@DPTR,A
	INC	DPTR
	DJNZ	R3,MOVS
	DJNZ	R2,MOVS	;移完需要移动的元素。
DEL:	MOV	A,NUMBL	;元素个数减一。
	JNZ	DELOK
	DEC	NUMBH
DELOK:	DEC	NUMBL
	CLR	C	;删除成功。
DELEND:	RET		;算法结束。
	END


⌨️ 快捷键说明

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