资源描述
实验一:冒泡法排序实验一、实验要求实验目的: 掌握控制转移指令的功能,以及冒泡法排序的原理。实验要求: 设 30H 开始的 10 个存储单元中,存放的是无符号数,编写程序实现: 10 个数排序,存放在 50H 开始的单元中。二、实 验原理多重循环即循环嵌套结构。 多重循环程序的设计方法和单重循环是一样的, 只是要分别 考虑各重循环的控制条件。 内循环属于外循环体重的具体处理部分。 在多重嵌套中, 不允许 各个循环体相互交叉, 也不允许从外循环跳入内循环, 否则编译时会出错。 应该注意每次通 过外循环进入内循环式,内循环的初始条件需要重置。三、程序设计1、程序流程图2、程序代码N EQU 10TAB EQU 30HORG 0000HMOV 30H, #1 ;在30H中输入10个随机数MOV 31H, #3MOV 32H, #2MOV 33H, #4MOV 34H, #6MOV 35H, #8MOV 36H, #7MOV 37H, #11MOV 38H, #9MOV 39H, #10SORT: MOV R4, #N-1LOOP1: MOV A,R4 ;冒泡法循环MOV R3, AMOV R0, #TABLOOP2: MOV A, R0MOV B, AINC R0MOV A, R0CLR CMOV R2, ASUBB A, BJNC UNEXCHMOV A, R2UNEXCH50H 中UNEXCH: DJNZ R3, LOOP2 ;如果 AB ,则 A,B 调换位置XCH A, R0 INC R0 MOV R0, ASWITCH: MOV R0, #30HMOV R1, #50HMOV R2, #NPAIXU: MOV A, R0 ;将 30H 中排好的数移动到 MOV R1, AINC R0INC R1DEC R2CJNE R2, #0, PAIXUSJMP $END四、程序验证1、 在 30H 中输入 10 个数,显示如下:0_l:D:0x300:01 302(HQ6070B090A00on00000000000000Of)0000Q0oaD:0x48B:000000000000000000000000000000000-00000L000000LD:Qx60G:00000000000900QQ0000QQ000000000000000000000000D:0x788:00J J00J j:0000FF 7J j00:J 0J J000000Q00000:j00D:0x900:FF000000000000000000000000GO0000FF00000000000000D: 0xA88:000000000Q000000FF000Q00000000000Q000Q0000000000D:OxCO0:00000000000Q00 000000000000000000000000000000000D: OxD-38:00000000000000 000Q00000000000000000000000000000图2 30H单元中存储的10个数2、对30H中的10个数排序,结果如下:.-ddress:D:0x300:0.1020304007oe09OA000000000000000000000000000000D:8:00000000000000000102030406070809OA00000000300000D:0x600: 000000000QO00000000OQ0000QQ0000: j00J 0QQ00QQ0000D:0x?S8:000000000000oo00FF07000000000000000000000000DO00D:0x900:FF000000: J000000:j0000OQ000000FF000000:0000Dt 0xA8a:0000000000000000FF000000000000000000000000000000D:DxCO0:000000000000000000000000000000000000000000000000D:OxDS8:0000 000000000QO00000000000000000000000000003Cflmmand | 園 Memory 1图3对30H中10个数排序后的结果3、将30H中的数转移到50H中,结果如下:D0x500:010203g0070609g000000003000000000000000000000D0x688:0000000000000000000000000000 000000000000000OGD0x800:FF0700000000000000000000OQ000000FF00 j -JQO00QO00QOD0x98s:0000000000000000FF00000000000000000000000000J J00D0xB00:FF000000aoOQ000000000000000000000000000000000000D0xC88:00000000000000000000000000000000000000GO00000000DOxEO0:000000000000000000000000000000003000000000000000DCxFSs:00QO0000000000:3A5A00000000000000?:0000oo00000013 訥bol5 IStack挥 Lou i屛i.kihLMemory 2图4 30H中10个数转移到50H之后的结果结论:程序基本符合实验要求。但第10个数会“丢失”。因为按Loop1、Loop2循循环,第10个数(39H)要跟第11个数(40H)交换,而(40H)=00。故39H中的数会“丢失”。五、实验总结1、 本实验用汇编语言写冒泡法程序,算法基本思路与C语言的冒泡法程序相似,可参 照C语言程序编写汇编语言程序。2、先画算法流程图再写程序有助于理清思路。3、 本实验汇编程序参考了课本P的冒泡法例程。但书上的程序Loop2处有错误:书上的算法是:SUBB A, BJNC UNEXH此时A=(A)-(B)-(cy),存储器 A中的值已经改变,不再是 30H中的某个数。下面算法EXCH中交换A、B的值得到的结果必然是错误的。应在比较完A、B的值后,把A还原到比较前的值。4、算法中 39H 中的数据“丢失”问题还需进一步思考解决。
展开阅读全文