嵌入式汇编语言设计——冒泡排序

1:C语言例子 

冒泡排序

#define N 5
int main(void)
{   int a[N] = {9,5,3,1,7};
    int  i, j, t;
    for (i = 0; i < N-1; i++) 
    {  for (j = 0; j < N - i - 1; j++)
        {   if (a[j] > a[j + 1]) 
            {   t = a[j];
                a[j] = a[j + 1];
                a[j + 1] = t;  }
        }
    }
}

汇编程序转换

AREA  main , CODE  READONLY 
N           EQU           5  //    define N = 5 
ENTRY                                ; 程序入口
        CODE32                       ; 32位数据的ARM指令集		
Start  
     MOV      r1  , #N         ; //r1 = 5 ;
	 SUBr1    r1  , #1         ; //减去 1 后 r1 = 4 ;  N - 1 
	 MOV      r2  , #0         ;  // r2 = 0  也就是i变量 
	 LOOPi   //大循环i     
	    
     LDR   r0  , = a       // r0 = a
     MOV   r3  , #0       // r3 = 0   也就是变量j
	 LOOPj  //小循环 j
	         LDR   r4  , [r0]    //将r0处地址数据加载到r4  也就是 r4 = a[i][0]
	         LDR   r5  , [r0 , #4] //下一个数据的地址
    
	CMP r4 , r5         //比较r4 和 r5 的值的大小
	STRGT  r5  , [r0 ]  //  谁大谁就交换位置 ,        r5 = r4 
	STRGT  r4  , [r0 , #4 ]  //  谁大谁就交换位置 ,   r4 = r5  
	
	SUB    r6  ,  r1 , r2    // r6 = N - 1 - i
	ADD    r3  ,  r3 , #1    // r3 = r3 + 1   j++ 
	CMP r6 , r3              // 比较 j 与 N - 1 - i
	
	ADD r0 , r0 , #4    // i =  i + 4 偏移四个位置 
	
	BGT   LOOPj     //跳转小循环就j 
	
	ADD r2 , r2 , #1   //r2 = r2 + 1  i++ 
	CMP r1 , r2        //比较 i 与  N - 1 的值的大小
	BGT LOOPi      //跳出大循环i循环  
	
	STOP  
	       MOV   r0 , #0x18    ; //设置软中断功能号
		LDR   r1 , =0x20026   ; //设置软中断参数
		SWI   0x123456         ; //调用SWI指示完成 
		AREA  Array , DATA , READWRITE
		DCD  9 , 5 ,3 , 1 ,7   //五个数据用于仿真测试
    END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值