📄 delete2.asm
字号:
;双字节表格的删除算法
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -