51单片机汇编实现冒泡排序

今天为了复习课本上面的程序,就实地检验了下这个程序,当年可是学过微机原理里的冒泡排序的,结果移植平台后又是如此麻烦,呵呵,网上贴吧,论坛,知道,文库上面拜托你们的程序能不能靠谱点!!!

第一种常见的错误就是程序写的一团糟,天马行空,弄了几个位地址和中间变量,外加两个循环,程序早飞了,真是让我们程序员惭愧啊

第二种错误是由于大多参考课本上题目:将以40H为首地址的N个数据进行排序,然后几十行代码,我怎么能很快知道程序对不呢

.................

鉴于此,特在我们这个绿色空间下贴上两种方法实现的冒泡排序完整版,实验程序已全部在keil下调试通过。(为了纪念下今天高考,大哭,好好加油吧

思路:有序的数列更有利于查找。本程序用的是“冒泡排序”法,算法是将一个数与后面的数相比较,如果比后面的数大,则交换,如此将所有的数比较一遍后,最大的数就会在 数列的最后面。再进行下一轮比较,找出第二大数据,直到全部数据有序。

第一种方法:(缺点是不利于移植,优点是以末尾数字为参照,逻辑简单)

///

;冒泡排序
;十个数从小到大排序


ORG 0000H
MOV 60H,#02H ;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
MOV R0,#60H
MOV R1,#61H


L2: MOV A,@R0
MOV 50H,@R1
CJNE A,50H,NEQ  ;比较60H与61H中数值的大小,做减法。如果60中的内容大则C位(进位为0)如果60中的内容比61中的小C位为1
NEQ:   JNC EXCHANGE ;是0跳转,左操作数<右操作数
LJMP L3
EXCHANGE: XCH A,@R1 ;交换60与61中的内容
XCH A,@R0
L3: INC R1
CJNE R1,#6AH,L2 ;让62到69中的内容逐一与60中的比较,最后60中的内容就是最小值
INC R0
MOV 51H,R0
MOV R1,51H
INC R1 
CJNE R0,#69H,L2 ;让61中的内容与之后的62到69中的内容比较,61中的内容就为第二小值,以此类推,直到剩最后两个数比较完。

SJMP $
END

///

第二种方法(提倡用该方法,只是两重循环,逻辑性较强,不容易看懂,优点是利于移植)

///

;冒泡排序


;十个数从小到大排序
Size   equ   10              ; 数据个数
Array  equ   60h             ; 数据起始地址
Change equ   0               ; 交换标志
ORG 0000H
MOV 60H,#02H ;给60-69H存储单元送初值
MOV 61H,#05H
MOV 62H,#03H
MOV 63H,#07H
MOV 64H,#09H
MOV 65H,#14H
MOV 66H,#13H
MOV 67H,#08H
MOV 68H,#01H
MOV 69H,#12H
SORT:
       MOV   R0, #Array
       MOV   R7, #Size-1
       CLR   Change
GOON:
       MOV   A, @R0
       MOV   R2, A
       INC   R0


       MOV   B, @R0
       CJNE  A, B, NotEqual
       SJMP  Next
NotEqual:
       JC    Next            ; 前小后大, 不交换


       SETB  Change          ; 前大后小, 置交换标志
       XCH   A, @R0          ; 交换
       DEC   R0
       XCH   A, @R0
       INC   R0
Next:
       DJNZ  R7, GOON
       JB    Change, SORT
       LJMP  $


       end 

///

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值