冒泡排序(汇编语言)

在数据区,给出了学生人数及汇编语言课程的成绩,请将成绩排序(由大到小或者由小到大)并保存在原数据区。

dseg segment

    db 20

    db 98,61,57,82,89,73,61,58,53,54

    db 84,78,70,64,84,63,76,84,83,86

dseg ends

源程序:(成绩按由小到大的顺序排列)

如果想按由大到小的顺序排列只需要将子程序sort比较两个相邻的数据处

修改为:(供参考

s1: mov ah,[si];把低地址数据存入ah

      mov al,[si+1];把高地址数据存入al

      cmp ah,al;比较相邻两个数据的大小

      ja next;ah大于al则跳转

      mov [si],al

      mov [si+1],ah;否则两者交换

next:inc si

       loop s1

个人心得:解决冒泡排序的关键就是搞清楚两层循环的循环次数,而恰好外层循环的循环次数同样是内层循环的比较次数!这就是解决问题的关键点。

assume cs:cseg, ds:dseg, ss:sseg
sseg segment  stack
    dw 100H dup (?)
sseg ends
dseg segment
    db 20
    db 98,61,57,82,89,73,61,58,53,54
    db 84,78,70,64,84,63,76,84,83,86
dseg ends
cseg segment
 start: mov ax,dseg
        mov ds,ax
        mov ax,sseg
        mov ss,ax
        mov sp,200h
        mov cl,ds:[0]
        mov ch,0      ;cx中存储要排序数的个数
        mov bx,1      ;要排序数的起始偏移地址
        call sort

        mov ax,4c00h
        int 21h

;子程序名:sort
;功    能:对从(DS):(bx)开始的(cx)个字节排序
;入口参数:(DS):(BX)保存数据的起始地址
;        (cx)中是要排序的数据个数
;出口参数:无
sort proc
     push si
     push ax
     sub cx,1;循环次数是排序个数减1

   s:push cx;外层循环次数压入栈,外层循环次数同样是内层循环的比较次数
     mov si,bx;每次外层循环从第一个数开始

  s1:mov ah,[si];把低地址数据存入ah
     mov al,[si+1];把高地址数据存入al
     cmp ah,al;比较相邻两个数据的大小
     jbe next;ah小于等于al则跳转
     mov [si],al
     mov [si+1],ah;否则两者交换
next:inc si
     loop s1

     pop cx
     loop s
     pop ax
     pop si
     ret
sort endp

cseg ends
end start

可以与C语言的冒泡排序进行类比 :

#include<stdio.h>
int main()
{
int i,j,t,
a[10]={123,5,9,11,33,6,9,76,100,3};
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]<a[j+1])
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
for(i=0;i<n;i++)
printf("%d",a[i]);
return 0;
}

流程图:

运行结果:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
冒泡排序是一种简单的排序算法,它通过多次比较和交换相邻元素的方式将最大(或最小)的元素逐渐“冒泡”到数组的末尾。下面是一个使用汇编语言实现的冒泡排序程序的示例: ```assembly section .data array db 5, 2, 8, 1, 9, 3, 7, 4, 6 ; 待排序的数组 length equ $ - array ; 数组长度 section .text global _start _start: mov ecx, length ; 将数组长度存入ecx寄存器 dec ecx ; ecx减1,用于内层循环比较次数 outer_loop: mov esi, 0 ; 内层循环索引初始化为0 inner_loop: mov eax, [array + esi] ; 将当前元素存入eax寄存器 cmp eax, [array + esi + 1] ; 比较当前元素和下一个元素 jg swap ; 如果当前元素大于下一个元素,则跳转到swap标签 continue: inc esi ; 内层循环索引加1 loop inner_loop ; 循环内层循环 dec ecx ; 外层循环次数减1 jnz outer_loop ; 如果外层循环次数不为0,则跳转到outer_loop标签 exit: mov eax, 1 ; 系统调用号1表示退出程序 xor ebx, ebx ; 返回值为0 int 0x80 ; 调用系统中断 swap: xchg eax, [array + esi + 1] ; 交换当前元素和下一个元素 mov [array + esi], eax ; 将交换后的值存回数组 jmp continue ; 跳转到continue标签,继续内层循环 ``` 这段汇编代码使用了两层循环来实现冒泡排序。外层循环控制比较的轮数,内层循环用于比较相邻元素并进行交换。在每一轮内层循环中,如果当前元素大于下一个元素,则进行交换。最后,当所有的轮数都完成后,数组就会按照从小到大的顺序排列。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值