汇编与C语言混合 实现的从小到大的冒泡排序
汇编实现的从小到大的冒泡排序
主函数由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语言混合 实现的从小到大的冒泡排序的更多相关文章
- 从linux0.11中起动部分代码看汇编调用c语言函数
上一篇分析了c语言的函数调用栈情况,知道了c语言的函数调用机制后,我们来看一下,linux0.11中起动部分的代码是如何从汇编跳入c语言函数的.在LINUX 0.11中的head.s文件中会看到如下一 ...
- 5种语言混合编程:C++、JS、python、Lisp、汇编
/* 混合C++.JS.python.Lisp.汇编 1种语言,5种语法 */ main { //C++ vector<int> v; v.push(2); putsl(v.size()) ...
- 九、ARM 汇编与 C 的混合编程
9.1 ARM 汇编与 C 的混合编程 9.1.1 内嵌汇编 __asm __asm("指令")例如关闭/打开总中断开关 CPSR __asm //使用 C 中变量名代替寄存器 { ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- 【转载】ANSYS的APDL与C语言混合编程(实例)
原文地址:http://www.cnblogs.com/lyq105/archive/2010/05/04/1727557.html 本文讨论的不是利用C语言为ANSYS写扩展(或者说是用户子程序), ...
- keil or c51 汇编调用c语言函数 容易忽视的问题
最近,在用keil 写一个小程序时,想实践一下从汇编调用 C语言函数,我们都知道C语言调用汇编函数讨论得较多,但反过来,从汇编中调用C语言的函数未见深入分析:在开始的时候,还是忽视了一个问题,就是对现 ...
- C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质
事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结果依旧是正确的.经过半小时的反汇编调试.证明了我的猜想,如今在博客里分享.也是对C语言编译原理的一 ...
- Java语言与C语言混合编程(2)--在Java中调用C语言本地库
在上一篇文章中介绍了Java语言中的native关键字,以及Java语言调用C语言的编译生成本地动态链接库(DLL)实现加法运算的小例子,本文通过一个更加详细的例子,深入讲解Java语言调用C语言的函 ...
- Java语言与C语言混合编程(1)--Java native 关键字
一. 什么是 native Method 简单地讲,一个 native Method 就是一个java调用非java代码的接口.一个 native Method 是这样一个java的方法:该方法的实现 ...
随机推荐
- text-overflow 与 word-wrap:设置使用一个省略标记...标示对象内文本的溢出。
text-overflow 与 word-wrap text-overflow用来设置是否使用一个省略标记(...)标示对象内文本的溢出. 语法: 但是text-overflow只是用来说明文字溢出时 ...
- Python2.x与3.x版本区别
Python的3.0版本,常被称为Python 3000,或简称Py3k.相对于Python的早期版本,这是一个较大的升级. 为了不带入过多的累赘,Python 3.0在设计的时候没有考虑向下相容 ...
- Python python 基本语法
程序1 def buildConnectionString(params): """Build a connection string from a dictionary ...
- Posix线程编程指南(4) 线程终止
线程终止方式 一般来说,Posix的线程终止有两种情况:正常终止和非正常终止.线程主动调用pthread_exit()或者从线程函数中return都将使线程正常退出,这是可预见的退出方式:非正常终止是 ...
- jquery的ajax同步和异步的理解及示例
之前一直在写JQUERY代码的时候遇到AJAX加载数据都需要考虑代码运行顺序问题.最近的项目用了到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里所有的代码停止加载,页面出去 ...
- 深入理解asp.net SessionState
web Form 网页是基于HTTP的,它们没有状态, 这意味着它们不知道所有的请求是否来自同一台客户端计算机,网页是受到了破坏,以及是否得到了刷新,这样就可能造成信息的丢失. 于是, 状态管理就成了 ...
- vuforia 结合 unity3d 开发 AR 的 androidAPP 总结
原地址:https://software.intel.com/zh-cn/blogs/2014/07/09/vuforia-unity3d-ar-androidapp/?utm_campaign=CS ...
- Ogre1.8.1编译时大量warning的问题
本文的编译环境为Windows7_SP1 + VS2010_SP1 :) 当编译Ogre1.8.1的源码时,会出现大量的warning,如图: 虽然没有太大影响,但是程序员都希望自己的程序是没有war ...
- 使用命令行编译、打包、运行WordCount--不用eclipse
1)首先创建WordCount1023文件夹,然后在此目录下使用编辑器,例如vim编写WordCount源文件,并保存为WordCount.java文件 /** * Licensed under th ...
- JAVA 异常对于性能的影响
陶炳哲 - MAY 12, 2015 在对OneAPM的客户做技术支持时,我们常常会看到很多客户根本没意识到的异常.在消除了这些异常之后,代码运行速度与以前相比大幅提升.这让我们产生一种猜测,就是在代 ...