首页 > 代码库 > 汇编语言 实现的从小到大的冒泡排序

汇编语言 实现的从小到大的冒泡排序

汇编实现的从小到大的冒泡排序

主函数由C语言实现,sort函数用汇编语言写

#include <stdio.h>


 int buffer[256];      //数据缓冲区
 int  bufferlen=0;     //数据缓冲区数据个数


extern sort(int *buffer,int bufferlen);    //汇编函数sort接口


//********从键盘录入数据********
int InputDataFromKeyBoard(int *pBuffer)
{
  int nCnt=0;
  int x;
  
 printf("数据输入开始:\n");
 while(1)
  {
   scanf("%d",&x);                //键盘输入整型数==〉x
   pBuffer[nCnt++]=x;             //x存入缓冲区
   if((x==(int)-1)||(nCnt>=256))  //输入数据为-1 结束输入
    {
    nCnt--;
    break;
    }
  }  
  printf("数据输入结束!\n");
  return nCnt;
}


//********向控制台输出buffer数据********
void OutputConsole()
{
  int i;
  printf("输出Buffer数据:\n"); // 向控制台输出数据
  for(i=0;i<bufferlen;i++)
  {  printf("%4d",buffer[i]); }
  printf("\n");


}






//********主函数********
int main()
{


  bufferlen=InputDataFromKeyBoard((int *)buffer);    //从键盘录入数据
  OutputConsole();                                   //将输入数据输出到控制台
  sort((int *)buffer,bufferlen);                     //对输入数据排序
  OutputConsole();                                   //输出排序数据 
 return 0;
}

汇编函数如下:

  EXPORT   sort       ;导出函数sort
   AREA  Exp103,CODE,READONLY
   
   CODE32




sort     ;函数名   
         ;入口参数 
         ;   R0<==buffer数据缓冲区首地址    
         ;   R1<==bufferlen 数据缓冲区数据个数


        SUBS R1,R1,#1      ;第一层循环    次数R1
       
L0      MOV R2,#0
        MOV R3,R1          ;第二层循环    次数R3
        CMP R1,#4
        ADDNE R0,R0,#4      ;除了第一次外都要使R0移位,乘法尤其是*4的那种用左移来实现
        
        
L1      LDR R6,[R0,R2]     ;R6<=[R0+R2]
        ADD R4,R2,#4
        LDR R7,[R0,R4]     ;R7<=[R0+R2+1]
        CMP R6,R7
        BLT L2


        STR R7,[R0,R2]     ;R6<R7交换
        STR R6,[R0,R4]


L2      ADD R2,R2,#4               
        SUBS  R3,R3,#1     ;二层循环控制
        BNE   L1    
        
        SUBS R1,R1,#1      ;一层循环控制
        BNE  L0     
EXIT    MOV PC,LR          ;函数返回    


   END

运行实例

数据输入开始:4 2 6 8 7 -1

数据输入结束!
输出Buffer数据:
   4   2   6   8   7
输出Buffer数据:
   2   4   6   7   8


汇编语言 实现的从小到大的冒泡排序