8086汇编冒泡排序子程序设计程序

发布时间:2026/7/1 14:51:55

8086汇编冒泡排序子程序设计程序 一、题目需求分析1 任务说明1程序背景① 数据段首字节存放学生人数20其后连续20个字节为汇编课程成绩数据。② 需自主编写sort冒泡排序子程序对现有成绩数组进行升序排序排序结果直接覆盖存储在原数据内存区域。2子程序规范① 入口参数DS:BX为待排序成绩数组首地址CX为待排序数据总个数。② 出口参数无采用原地排序方式直接修改原数组数据。③ 排序算法采用标准冒泡排序算法实现成绩从小到大升序排列。3主程序预置逻辑① 读取数据段偏移地址0处的数据获取学生总人数并送入CX寄存器。② 对BX寄存器赋值为1指向第一个有效成绩的存储地址。③ 调用自定义sort排序子程序完成数组排序执行完成后正常退出程序。2 冒泡排序原理1外层循环控制排序轮次① 包含n个元素的数组最多需要执行n-1轮冒泡排序。② 每一轮排序都会将当前未排序区域内的最大值通过相邻比较交换冒泡到末尾完成末尾元素有序。2内层循环完成相邻元素比较交换① 从数组起始位置开始依次两两比较相邻字节数据。② 若前一个数据大于后一个数据立即交换两个内存单元的值实现升序排序规则。3就地存储① 程序不额外开辟内存空间所有比较、交换操作均在原数据段完成直接覆盖原始数据。二、完整汇编程序assume cs:cseg,ds:dseg,ss:ssegsseg segment stackdw 100H dup (?)sseg endsdseg segmentdb 20 ;数据个数db 98,61,57,82,89,73,61,58,53,54db 84,78,70,64,84,63,76,84,83,86dseg endscseg segmentstart:mov ax, dsegmov ds, axmov cl, ds:[0]mov ch, 0 ;cx 数据总数20mov bx, 1 ;成绩起始偏移地址call sortmov ax, 4c00hint 21h;子程序名sort;功能对从DS:(BX)开始的(cx)个字节升序冒泡排序;入口DS:BX数组首地址CX元素个数;出口数组就地排序无返回参数sort:1保护现场① 保存用到的寄存器BP、SI、DI、AX、DX避免破坏主程序数据。push bppush sipush dipush axpush dx2设置外层循环计数器① 元素个数送入BP外层循环执行次数为数据个数减一。mov bp, cxdec bp ;外层循环次数n-1outer:3内层循环初始化① SI为数组遍历指针每一轮冒泡从头开始比较元素。mov si, bxmov di, cx ;内层循环次数随轮次递减dec diinner:4取出相邻两个数进行比较mov al, [si]mov dl, [si1]cmp al, dljbe no_swap ;前数≤后数无需交换5前数更大交换两个单元的值mov [si], dlmov [si1], alno_swap:inc si ;指针后移比较下一对元素dec dijnz inner ;内层循环未结束则继续比较dec bpjnz outer ;外层循环未结束则开启下一轮冒泡6恢复所有寄存器现场pop dxpop axpop dipop sipop bpretcseg endsend start三、核心代码逻辑说明1 现场保护机制1寄存器占用说明① 子程序运行过程中会修改BP、SI、DI、AX、DX寄存器数值为避免覆盖主程序原始数据进入子程序后统一压栈保存。② 子程序执行完毕后按先进后出原则对应出栈恢复寄存器数据保证主程序运行不受影响。2 双重循环结构1外层循环功能① 外层循环控制整体冒泡轮次n个元素最多执行n-1轮保证全部元素有序。2内层循环功能① 内层循环负责相邻元素两两对比交换每一轮外层循环结束当前最大值自动排序至未排序区域末尾。② 每完成一轮冒泡有序元素数量增加内层循环比较次数逐轮递减减少无效运算。3 内存交换操作1数据交换方式① 借助AL、DL通用寄存器暂存相邻两个内存单元的成绩数据避免数据覆盖丢失。② 直接通过MOV指令修改原数据段内存单元数值实现原地交换无需额外占用内存空间。4 寻址方式1内存寻址规则① BX寄存器固定作为成绩数组的基地址定位数组起始位置。② SI寄存器作为动态偏移指针实现逐字节遍历数组采用寄存器间接寻址方式读取和修改内存数据。四、程序调试验证方案1 调试工具DEBUG1断点调试操作① 将编译链接生成的EXE程序载入DEBUG工具在调用sort子程序的位置设置断点。② 单步进入子程序跟踪SI指针偏移过程实时观察相邻内存单元的数据变化与交换过程。③ 子程序执行完毕后查看数据段DS:01起始的连续20个字节数据验证排序结果。2 人工核对1原始成绩数据① 98,61,57,82,89,73,61,58,53,54,84,78,70,64,84,63,76,84,83,862程序运行后升序结果① 53,54,57,58,61,61,63,64,70,73,76,78,82,83,84,84,84,86,89,983验证结论① 程序排序结果与人工升序排序结果完全一致排序功能准确无误。五、程序优缺点总结1 优点1编程规范严谨① 严格遵循8086汇编子程序编写规范入口出口参数明确寄存器现场完整保护模块化程度高。2内存利用率高① 采用原地冒泡排序算法不额外开辟数据存储空间仅通过寄存器中转数据内存占用极小。3逻辑清晰易懂① 双层循环结构贴合经典冒泡排序原理代码分层清晰注释完整便于理解、调试与修改。4贴合题目要求① 排序结果直接覆盖原数据区完全满足题目就地存储的设计要求。2 可优化方向1优化无效循环① 可增设排序标志位若某一轮冒泡中未发生任何数据交换证明数组已完全有序可提前终止循环提升运行效率。2拓展排序规则① 可通过修改条件跳转指令将升序排序改为降序排序仅需将jbe指令替换为ja指令即可适配更多排序场景。

相关新闻