不排序,或排序混乱:

;-----------------------------------------------------------------------------
;功能:双字节无符号数据块排序(增序);使用工作寄存器组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