冒泡排序
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 地址存数据5 ,R0 偏移4
MOV R1 , #1
STR R1 , [ R0 ] , #4 ; 给存储器0x114518 地址存数据1 ,R0 偏移4
MOV R1 , #4
STR R1 , [ R0 ] , #4 ; 给存储器0x11451C 地址存数据4 ,R0 偏移4
MOV R1 , #7
STR R1 , [ R0 ] , #4 ; 给存储器0x114520 地址存数据7 ,R0 偏移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 地址存数据5 ,R0 偏移4
MOV R1 , #1
STR R1 , [ R0 ] , #4 ; 给存储器0x114518 地址存数据1 ,R0 偏移4
MOV R1 , #4
STR R1 , [ R0 ] , #4 ; 给存储器0x11451C 地址存数据4 ,R0 偏移4
MOV R1 , #3
STR R1 , [ R0 ] , #4 ; 给存储器0x114520 地址存数据3 ,R0 偏移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
调试结果