汇编实现的从小到大的冒泡排序
主函数由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