如何使用彙編語言實現冒泡排序?

                                                      怎麼使用彙編語言實現冒泡排序

   我們先想想C語言裏是怎麼實現的冒泡排序

       
#include<stdio.h>
int main()
{
    int arr[10];
    int brr[10];
    int a,c,d,s,i;
    for(a=0; a<10; a++)
        scanf("%d",&arr[a]);
    for (c=0; c<9; c++)
    {
        for(d=0; d<9-c; d++)
        {
            if(arr[d]>arr[d+1])
            {
                s=arr[d];
                arr[d]=arr[d+1];
                arr[d+1]=s;
            }
        }
    }
    for(i=0; i<10; i++)
        printf("%d\n",arr[i]);
    return 0;
}

我麼可以仿照C語言來實現我們的排序
首先cx值爲外層循環變量,進入第二層循環時,cx的值入棧,保留其值。
再將cx的值置爲內層循環次數的值。完成雙層循環。
具體實現如下


Assume cs:code,ds:data,ss:stack
  data segment
    dw 123h,5h,9h,11h,33h,6h,9h,76h;數據段初始化
    dw 100h,3h,6 dup(0);[14]內存存放外層已經循壞了多少次
  data ends
  stack segment;棧段初始化
  dw 0,0,0,0,0,0,0,0
  stack ends
  code segment;代碼段
  start:
  mov ax,data
  mov ds,ax
  mov ax,stack
  mov ss,ax
  mov sp,10h
  mov cx,9
  mov bx,0
  mov dx,0
  L:  ;外層循壞,固定爲9次
   push cx;外層循壞cx值入棧
   mov ax,9
   sub ax,word ptr ds:[14h];內層循壞次數9-ds:[14]次
   mov cx,ax;將循壞次數mov到cx中
   mov ax,0
   mov bx,0
  s:;內存循壞開始,每次將第da:[14]+1大的數放到最後面
   mov ax,ds:[bx];取出第一個數值
   mov dx,ds:[bx+2];取出第二個數值
   cmp ax,dx;進行比較
   jna next;如果ax<=dx就轉到next,否則就繼續
   push ax;實現兩個數的交換
   push dx
   pop  ds:[bx]
   pop  ds:[bx+2]
   next:nop
   add bx,2;將bx往後移一個字
 loop s
   pop cx;外層循壞cx出棧
   mov ax,0;
   mov ax,word ptr ds:[14h];這裏三行實現ds:[14]計數功能計算外層循壞次數
   inc ax
   mov word ptr ds:[14h],ax
 loop L
  mov ax,4c00h
  int 21h
  code ends
  end start

這樣就大功告成了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章