主题:这段程序错在哪里?
不排序,或排序混乱:
;-----------------------------------------------------------------------------
;功能:双字节无符号数据块排序(增序);使用工作寄存器组3。
;入口条件:数据块的首址在 R0 中,双字节数据总个数在 R7 中。
;出口信息:完成排序(增序),数据块的首址仍在 R0 中
;占用资源: A、PSW、R0、R2、R3、R4、R5、R6、R7
;-----------------------------------------------------------------------------
D_SORT: MOV A,R7
MOV R5,A ;比较次数初始化
;MOV P2,#0FFH
D_SORT_LP1:
CLR F0 ;交换标志初始化
MOV A,R5 ;取上遍比较次数
DEC A ;本遍比上遍减少一次
MOV R5,A ;保存本遍次数
MOV R2,A ;复制到计数器中
JZ D_SORT_EX ;若为零,排序结束
MOV A,R0 ;保存数据指针
MOV R6,A
D_SORT_LP2:
MOVX A,@R0 ;读取一个数据的高位
MOV R3,A
INC R0 ;指向该数据的低位
MOVX A,@R0 ;读取该数据的低位
MOV R4,A
CLR C
INC R0 ;指向下一个数据的高位
INC R0 ;指向下一个数据的低位
MOVX A,@R0 ;读取下一个数据的低位
XCH A,R4
CJNE A,4,$+3 ;@R0 ;低位比较(两个数据的大小)
XCH A,R4 ;比较完,再交换回来
MOV A,R3
DEC R0 ;指向下一个数据的高位
MOVX A,@R0 ;读取下一个数据的高位
XCH A,R3
CJNE A,3,$+3 ;@R0 ;高位比较(两个数据的大小)
XCH A,R3 ;比较完,再交换回来
JNC D_SORT_JMP1 ;顺序正确(增序或相同),不必交换
SETB F0 ;设立交换标志
MOVX A,@R0 ;将两个数据高位交换位置
DEC R0 ;指向上一个数据的低位
DEC R0 ;指向上一个数据的高位
MOVX @R0,A
INC R0 ;指向上一个数据的低位
INC R0 ;指向下一个数据的高位
INC R0 ;指向下一个数据的低位
MOVX A,@R0 ;将两个数据的低位交换位置
DEC R0 ;指向下一个数据的高位
DEC R0 ;指向上一个数据的低位
MOVX @R0,A
INC R0 ;指向下一个数据的高位
MOV A,R3
MOVX @R0,A ;保存上一个数据的高位,完成高位交换
INC R0 ;指向下一个数据的低位
MOV A,R4
MOVX @R0,A ;保存上一个数据的低位,完成低位交换
DEC R0
D_SORT_JMP1:
DJNZ R2,D_SORT_LP2;完成本遍的比较次数
MOV A,R6 ;恢复数据首址
MOV R0,A
JB F0,D_SORT_LP1;本遍若进行过交换,则需继续排序
D_SORT_EX:
RET