实验一:冒泡法排序实验
一、实验要求
实验目的:掌握控制转移指令的功能,以及冒泡法排序的原理。
实验要求:设30H开始的10个存储单元中,存放的是无符号数,编写程序实现:10个数排序,存放在50H开始的单元中。
二、实验原理
多重循环即循环嵌套结构。
多重循环程序的设计方法和单重循环是一样的,只是要分别考虑各重循环的控制条件。
内循环属于外循环体重的具体处理部分。
在多重嵌套中,不允许各个循环体相互交叉,也不允许从外循环跳入内循环,否则编译时会出错。
应该注意每次通过外循环进入内循环式,内循环的初始条件需要重置。
三、程序设计
1、程序流程图
图 1 冒泡法程序流程图2、程序代码
N EQU 10
TAB EQU 30H
ORG 0000H
MOV 30H, #1 ;在30H中输入10个随机数
MOV 31H, #3
MOV 32H, #2
MOV 33H, #4
MOV 34H, #6
MOV 35H, #8
MOV 36H, #7
MOV 37H, #11
MOV 38H, #9
MOV 39H, #10
SORT: MOV R4, #N-1
LOOP1: MOV A,R4 ;冒泡法循环
MOV R3, A
MOV @R0, #TAB
LOOP2: MOV A, @R0
MOV B, A
INC R0
MOV A, @R0
CLR C
MOV R2, A
SUBB A, B
JNC UNEXCH
MOV A, R2
UNEXCH: DJNZ R3, LOOP2 ;如果A<B,顺序执行UNEXCH DJNZ R4, LOOP1
LJMP SWITCH
EXCH: DEC R0 ;如果A>B,则A,B调换位置
XCH A, @R0
INC R0
MOV @R0, A
SWITCH: MOV R0, #30H
MOV R1, #50H
MOV R2, #N
PAIXU: MOV A, @R0 ;将30H中排好的数移动到50H中
MOV @R1, A
INC R0
INC R1
DEC R2
CJNE R2, #0, PAIXU
SJMP $
END
四、程序验证
1、在30H中输入10个数,显示如下:
图 2 30H单元中存储的10个数
2、对30H中的10个数排序,结果如下:
图 3 对30H中10个数排序后的结果
3、将30H中的数转移到50H中,结果如下:
图 4 30H中10个数转移到50H之后的结果
结论:程序基本符合实验要求。
但第10个数会“丢失”。
因为按Loop1、Loop2循循环,第10个数(39H)要跟第11个数(40H)交换,而(40H)=00。
故39H中的数会“丢失”。
五、实验总结
1、本实验用汇编语言写冒泡法程序,算法基本思路与C语言的冒泡法程序相似,可参照C语言程序编写汇编语言程序。
2、先画算法流程图再写程序有助于理清思路。
3、本实验汇编程序参考了课本P 的冒泡法例程。
但书上的程序Loop2处有错误:
书上的算法是:
SUBB A, B
JNC UNEXH
此时A=(A)-(B)-(cy),存储器A中的值已经改变,不再是30H中的某个数。
下面算法
EXCH中交换A、B的值得到的结果必然是错误的。
应在比较完A、B的值后,把A还原到比较前的值。
4、算法中39H中的数据“丢失”问题还需进一步思考解决。