📄 insert2.asm
字号:
;双字节表格的插入算法
FRONT EQU 2000H ;表格首址。
MAXH DATA 30H ;元素个数最大值存放单元(高字节)。
MAXL DATA 31H ;元素个数最大值存放单元(低字节)。
NUMBH DATA 32H ;已有元素个数存放单元(高字节)。
NUMBL DATA 33H ;已有元素个数存放单元(低字节)。
IH DATA 34H ;待插入元素的序号存放单元(高字节)。
IL DATA 35H ;待插入元素的序号存放单元(低字节)。
XH DATA 36H ;待插入元素的数值存放单元(高字节)。
XL DATA 37H ;待插入元素的数值存放单元(低字节)。
ORG 0000H
LJMP TEST
ORG 100H
TEST: MOV MAXH,#1 ;最大数据个数为384个
MOV MAXL,#80H
MOV NUMBH,#0 ;已有数据个数为160个(任意设定)
MOV NUMBL,#0A0H
MOV IH,#0 ;准备在序号为128的位置
MOV IL,#80H
MOV XH,#5AH ;插入双字节数据5AA5H
MOV XL,#0A5H
LCALL INSERT ;调用插入算法
STOP: LJMP STOP ;X将插入到2100H和2101H单元中
INSERT: SETB C ;计算MAX-NUMB-1
MOV A,MAXL
SUBB A,NUMBL
MOV A,MAXH
SUBB A,NUMBH ;表格满否?
JC INSEND ;表格已满,插入失败。
MOV DPTR,#FRONT;取表格首址。
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 ;得到插入的实际地址。
CLR C
MOV A,NUMBL ;插入位置超出范围否?
SUBB A,IL
MOV R3,A
MOV A,NUMBH
SUBB A,IH
MOV R2,A ;保存需要移动元素的个数。
JC INSEND ;位置不合理,插入失败。
ORL A,R3
JZ INST ;不需要移动元素。
MOV A,R3 ;按每移动一个数据偏移两个字节计算。
RLC A
MOV R4,A
MOV A,R2
RLC A
XCH A,R4
ADD A,DPL
MOV DPL,A
MOV A,R4
ADDC A,DPH
MOV DPH,A ;指向新表尾位置。
MOV A,R3 ;计数器检查。
JZ MOVS
INC R2 ;计数器校正。
MOVS: MOV A,#0FEH ;指针前移一个元素。
ADD A,DPL
MOV DPL,A
MOV A,#0FFH
ADDC A,DPH
MOV DPH,A
MOVX A,@DPTR ;读取一个元素。
MOV R4,A
INC DPTR
MOVX A,@DPTR
XCH A,R4
INC DPTR
MOVX @DPTR,A ;存入后一个位置。
INC DPTR
MOV A,R4
MOVX @DPTR,A
MOV A,#0FDH ;指针前移一个元素。
ADD A,DPL
MOV DPL,A
MOV A,#0FFH
ADDC A,DPH
MOV DPH,A
DJNZ R3,MOVS
DJNZ R2,MOVS ;移完需要移动的元素。
INST: MOV A,XH ;取待插入元素的数值。
MOVX @DPTR,A ;插入到指定位置。
INC DPTR
MOV A,XL
MOVX @DPTR,A
MOV A,NUMBL ;元素个数加一。
INC A
MOV NUMBL,A
JNZ INSOK
INC NUMBH
INSOK: CLR C ;插入成功。
INSEND: RET ;算法结束。
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -