发布于 2002-05-25 23:47:09
0楼
不应直接要求给程序,应寻求方法才对。
对于数目不多的数排序,可采用“冒泡法”或沉底法。依次对相邻的两个数比较,使较大或较小的数往一个方向移动,一遍比较下来,必有一个最大或最小值产生,再对余下的数作同样的比较,产生次最大或次最小,如此循环直到 只剩一个数,排序结束。
比如你的问题:
4个要比较的数已存至AC0-AC3中。
// 第一遍比较
LDW< AC0,AC1
MOVW AC0,#TEMP
MOVW AC1,AC0
MOVW #TEMP,AC1 // 交换两数,使较小的数往后移动
LDW< AC1,AC2
MOVW AC1,#TEMP
MOVW AC2,AC1
MOVW #TEMP,AC2 // 交换两数,使较小的数继续往后移动
LDW< AC2,AC3
MOVW AC2,#TEMP
MOVW AC3,AC2
MOVW #TEMP,AC3 // 交换两数,AC3中已为最小数
// 第二遍比较,因AC3中已为最小数,不再参加比较
LDW< AC0,AC1
MOVW AC0,#TEMP
MOVW AC1,AC0
MOVW #TEMP,AC1 // 交换两数,使较小的数往后移动
LDW< AC1,AC2
MOVW AC1,#TEMP
MOVW AC2,AC1
MOVW #TEMP,AC2 // 交换两数,AC2中为次最小数
// 第三遍比较
LDW< AC0,AC1
MOVW AC0,#TEMP
MOVW AC1,AC0
MOVW #TEMP,AC1 // 交换两数,使较小的数往后移动
// 只剩AC0,排序结束。
这个过程可以用循环和指针的方式来做,可以减少代码数,但会占用较多CPU时间。在指令空间不紧张的话,不要用循环。