出了两天差,路上无事,又思考了一下.二楼网友给了例子是很有参考价值的. 但有两个问题,一是不能作为子程序调用,否则可能限入死循环,二是,虽说首地址放在R0中,但大循环每次将R0初始化为#40H,实为首地址为40H,作为子程序调用是不方便的. 以下根据自己原先的设想,综合二楼的长处,给出一个修改办法,请各位帮看看,是否还可以继续求精,谢先!
;排序子程序 ;入口条件,首地址在R3中,数组字节长度在R4中. ;占用工作寄存器R1,R2,R7及累加器A ;出口,给定的数组按升序排列
ORDER: DEC R4 ;最大比较次数 LOOP: MOV A,R4 MOV R2,A MOV A,R3 MOV R1,A ;每次大循环都对地址指针及内循环次数赋值 LP: MOV A,@R1 ;取先一个数 MOV R7,A ;备份下来备用 CLR C INC R1 ;指向下一个数 SUBB A,@R1 ;比较 JC NEXT ;先一个小则跳,大于等于则顺下 ;ADD A,@R1 MOV A,R7 ;取先一个数 XCH A,@R1 ;将先一个放入后一个原先的地址处,后一个备份于A中 ;MOV B,@R1 ;MOV @R1,A DEC R1 ;指针退一 ;MOV @R1,B MOV @R1,A ;将后一个放入先一个原先的地址处 INC R1 ;恢复指针 NEXT: DJNZ R2,LP ;未完则继续 DJNZ R4,LOOP ;外层循环 RET
|