Keil MDK5下用ARM指令集汇编实现冒泡排序与选择排序

冒泡排序

C语言代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[5];
	int n=5;
	for (int i=0; i<n; i++)
		cin>>a[i];
	for (int i=0; i<n-1; i++)
		for (int j=0; j<n-1-i; j++){
			if (a[j]>a[j+1])
				swap(a[j],a[j+1]);
		}
	for (int i=0; i<n; i++)
		cout<<a[i]<<' ';
	return 0;
}

ARM汇编实现

	AREA Sort,CODE, READONLY
		CODE32
		ENTRY	
start
		;输入五个立即数
		LDR R0,=0x114514  ;获取存储器起始地址
		MOV R1,#5 
		STR R1,[R0],#4 ;给存储器0x114514地址存数据5R0偏移4
		MOV R1,#1
		STR R1,[R0],#4 ;给存储器0x114518地址存数据1R0偏移4
		MOV R1,#4
		STR R1,[R0],#4 ;给存储器0x11451C地址存数据4R0偏移4
		MOV R1,#7
		STR R1,[R0],#4 ;给存储器0x114520地址存数据7R0偏移4
		MOV R1,#2
		STR R1,[R0]    ;给存储器0x114524地址存数据2
		
	    ;冒泡排序
		LDR R2,=0x114514  ;外循环i
		LDR R8,=0x114524  ;设置i结束边界
		MOV R9,R8
		ADD R9,#4   	  ;设置J结束边界
		
		
	
LOOPI	LDR R3,=0x114514 ;j从0x114514开始迭代
		SUB  R9,#4 ;J边界缩小一位

LOOPJ	LDR R4,[R3] ;R3所指的元素给R4
		LDR R5,[R3,#4] ;R3后一位所指的元素给R5
		BL NEXT	;迭代
		
NEXT	CMP R5,R4 ;比较当前J所指元素和最小值
		BLT UPDATE 	;如果后一个元素比前一个小则交换
		ADD R3,#4 ;R3移到下一个数
		CMP R3,R9 ;比较R3是否遍历到了最后一个地址
		BLT LOOPJ ;如果没有则继续遍历
		
		ADD R2,#4 ;I移动到下一位
		CMP R2,R8
		BLT LOOPI ;回到I
		B OUTPUT  ;输出排序结果
		
UPDATE	MOV R6,R5
		MOV R5,R4
		MOV R4,R6
		STR R4,[R3]
		STR R5,[R3,#4]
		B NEXT

;将排序结果输出到R5~R9
OUTPUT	LDR R0,=0x114514
		LDR R5,[R0],#4
		LDR R6,[R0],#4
		LDR R7,[R0],#4
		LDR R8,[R0],#4
		LDR R9,[R0],#4
		;B start
		end

调试结果

选择排序

C语言代码实现

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[5];
	for (int i=0; i<5; i++)
		cin>>a[i];
	for (int i=0; i<5; i++){
		int v=a[i],p=i;
		for (int j=i+1; j<5; j++){
			if (a[j]<v){
				v=a[j]; p=j;
			}
		}
		swap(a[i],a[p]);
	}
	for (int i=0; i<5; i++)
		cout<<a[i]<<' ';
	return 0;
}

ARM汇编实现

	AREA Sort,CODE, READONLY
		CODE32
		ENTRY	
start
		;输入五个立即数
		LDR R0,=0x114514  ;获取存储器起始地址
		MOV R1,#5 
		STR R1,[R0],#4 ;给存储器0x114514地址存数据5R0偏移4
		MOV R1,#1
		STR R1,[R0],#4 ;给存储器0x114518地址存数据1R0偏移4
		MOV R1,#4
		STR R1,[R0],#4 ;给存储器0x11451C地址存数据4R0偏移4
		MOV R1,#3
		STR R1,[R0],#4 ;给存储器0x114520地址存数据3R0偏移4
		MOV R1,#2
		STR R1,[R0]    ;给存储器0x114524地址存数据2
		
	    ;选择排序
		LDR R2,=0x114514  ;外循环i
		LDR R3,=0x114510  ;内循环j
		MOV R4,#10 ;最小值
		LDR R5,=0x114514  ;最小值地址
		LDR R6,[R2] ;首元素
		LDR R8,=0X114528
		
	
LOOPI	LDR R6,[R2] ;将第I位作为边界
		MOV R4,R6 ;设定边界为最小值
		MOV R5,R2 ;设定边界地址为最小值地址
		MOV  R3,R2 ;J设置起始地址

LOOPJ	LDR R7,[R3] ;R3所指的元素给R7
		BL NEXT	;迭代
		
NEXT	CMP R7,R4 ;比较当前J所指元素和最小值
		BLT UPDATE 	;如果最小则更新
		ADD R3,#4 ;R3移到下一个数
		CMP R3,R8 ;比较R3是否遍历到了最后一个地址
		BLT LOOPJ ;如果没有则继续遍历
		;交换最小值与边界
		MOV R9,R6
		MOV R6,R4
		MOV R4,R9
		;更新交换后的数组
		STR R6,[R2]
		STR R4,[R5]
		
		ADD R2,#4 ;I移动到下一位
		CMP R2,R8
		BLT LOOPI ;回到I
		B OUTPUT  ;输出排序结果
		
UPDATE	MOV R4,R7 ;R7中的值更新未排序区内元素的最小值 
		MOV R5,R3 ;R3寄存器的值更新未排序区内元素的最小值下标
		B NEXT

;将排序结果输出到R5~R9
OUTPUT	LDR R0,=0x114514
		LDR R5,[R0],#4
		LDR R6,[R0],#4
		LDR R7,[R0],#4
		LDR R8,[R0],#4
		LDR R9,[R0],#4
		;B start
		end

调试结果

在这里插入图片描述

  • 4
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值