//无符号数插入排序
TEMP EQU 30H
PREV_NUM EQU 31H
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
//测试数据准备2100H~2109H填入0AH~01H
MOV DPTR, #2100H
MOV R7, #10
TEST_LOOP1:
MOV A, R7
MOVX @DPTR, A
INC DPTR
DJNZ R7, TEST_LOOP1
MOV R7, #9
MOV PREV_NUM,#1
MOV DPTR, #2101H //从第2个数开始
INSERT_LOOP1:
MOVX A, @DPTR
MOV TEMP, A //将当前数移入TEMP空间
PUSH DPL //保护此时的DPTR
PUSH DPH
MOV R6, PREV_NUM
INSERT_LOOP2:
DEC DPL //指针前移一位
MOVX A, @DPTR //将指针指向的数A
//如果当前数比指针指向的数小,就要将指针指向的数后移一位
//如果当前数比指针指向的数大或相等,不进行移数操作,当前数覆盖指针指向的数的后一个数(插入)
CJNE A, TEMP, N_EQU
//相等同样执行插入操作
LJMP INSERT
CONTINUE_THIS_INSERT:
DJNZ R6, INSERT_LOOP2
//如果移数移到头了,就把当前数插入到第一个位置上
DEC DPL
LJMP INSERT
NEXT_INSERT:
INC PREV_NUM
POP DPH
POP DPL
INC DPTR
DJNZ R7, INSERT_LOOP1
DONE:
SJMP $
N_EQU:
JC INSERT //A<TEMP C=1即当前数比指针指向的数大
//当前数比指针指向的数小,就要将指针指向的数后移一位
INC DPL
MOVX @DPTR, A
DEC DPL
LJMP CONTINUE_THIS_INSERT
//不进行移数操作,当前数覆盖指针指向的数的后一个数(插入)
INSERT:
INC DPL
MOV A, TEMP
MOVX @DPTR, A
LJMP NEXT_INSERT//插入之后直接进行取下一个TEMP数
END
8051汇编实现排序——插入排序
最新推荐文章于 2023-03-05 20:51:50 发布