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

主函数由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

MOV R5,R1          ;R5等于要排序的数据数-1

L0      MOV R2,#0

        MOV R3,R1          ;第二层循环    次数R3

        CMP R1,R5            ;R1是不是等于总数-1.如果是就说明这是第一次,R0不必移位

        ADDNE R0,R0,#4      ;除了第一次外都要使R0移位,NE是不等于的意思

        

        

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

汇编与C语言混合 实现的从小到大的冒泡排序的更多相关文章

  1. 从linux0.11中起动部分代码看汇编调用c语言函数

    上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...

  2. 5种语言混合编程:C++、JS、python、Lisp、汇编

    /* 混合C++.JS.python.Lisp.汇编 1种语言,5种语法 */ main { //C++ vector<int> v; v.push(2); putsl(v.size()) ...

  3. 九、ARM 汇编与 C 的混合编程

    9.1 ARM 汇编与 C 的混合编程 9.1.1 内嵌汇编 __asm __asm("指令")例如关闭/打开总中断开关 CPSR __asm //使用 C 中变量名代替寄存器 { ...

  4. [汇编与C语言关系]2. main函数与启动例程

    为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...

  5. 【转载】ANSYS的APDL与C语言混合编程(实例)

    原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...

  6. keil or c51 汇编调用c语言函数 容易忽视的问题

    最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...

  7. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质

    事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一 ...

  8. Java语言与C语言混合编程(2)--在Java中调用C语言本地库

    在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...

  9. Java语言与C语言混合编程(1)--Java native 关键字

    一. 什么是 native Method 简单地讲,一个 native Method 就是一个java调用非java代码的接口.一个 native Method 是这样一个java的方法:该方法的实现 ...

随机推荐

  1. android webview开启html5支持

    最近做的一个小项目需要用到webview.虽然只是一个简单的网页,但是由于以前用的都只是显示本地文件,没有显示网页文件.现在需要显示网页文件,发现许多网站的webapp做的挺不错的,无论是显示还是用户 ...

  2. 十个优秀的C语言学习资源推荐

    学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.-- Boatman Yang 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程序员不得不跟 ...

  3. 教你怎么把安卓应用软件放到系统根目录system/app下

    安卓手机有时候安装的软件多了,用着久了就会出现卡机,死机的现象,流畅度大大的减弱了,实在是影响使用体验.对于这种情况,有的人会经常清理后台程序,可是次数多了,提速的效果也不太明显.那么,到底怎么做才能 ...

  4. 使用SecureRandom类替代Random类

    java.util.Random 产生确定的值可能被恶意的程序预测到. java.security.SecureRandom 产生不确定的随机数不能被预测到. 所以优先使用java.security. ...

  5. ubuntu重置root密码

    from: http://mmicky.blog.163.com/blog/static/150290154201398113034698/ 使用ubuntu的时候忘记了root密码该如何重置?我使用 ...

  6. 【BZOJ】【1042】【HAOI2008】硬币购物

    DP+容斥原理 sigh……就差一点…… 四种硬币的数量限制就是四个条件,满足条件1的方案集合为A,满足条件2的方案集合为B……我们要求的就是同时满足四个条件的方案集合$A\bigcap B\bigc ...

  7. nodeJs入门篇之认识nodejs

    摘要:将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开 ...

  8. 利用 random 与 tertools 模块解决概率问题

    Python 中的 random 与 tertools 模块可以得到伪随机数与排列.组合,下面利用这两个模块求解一些有趣的概率问题. 一.random 与 tertools 模块 random 模块常 ...

  9. 几种CPU架构

    原文链接:http://blog.csdn.net/wyzxg/article/details/5027738 这几天在下载RPM包的时候,总会看见x86,x86-64,IA64,i386,i586等 ...

  10. Codeforces 475D CGCDSSQ(分治)

    题意:给你一个序列a[i],对于每个询问xi,求出有多少个(l,r)对使得gcd(al,al+1...ar)=xi. 表面上是询问,其实只要处理出每个可能的gcd有多少个就好了,当左端点固定的时候,随 ...