ARM C語言調用匯編函數 實現冒泡排序


 

 

使用冒泡排序將指定數組排序后輸出
排序函數使用匯編語言編寫,C語言調用匯編語言
在控制台顯示排序前后的結果

 

一、問題分析

本程序的關鍵是如何使用匯編語言實現冒泡排序算法。可以仿照C語言的代碼流程,分步驟寫出匯編的代碼。首先要寫出最內層的代碼部分,也就是數據交換的匯編代碼,數據交換可以使用str數據裝載指令實現。之后要考慮內層循環的代碼,可以通過cmp指令控制循環次數。最后是編寫最外層的循環代碼,也是使用cmp指令,來控制整個排序的次數。

二、代碼編寫

2.1 C語言代碼

#include <stdio.h>
extern void sort(char* num, int count);

int main(){

	char number[10] = {'a', 'c', 'b', 'e', 'd', 'f', 'h', 'g', 'j', 'i'};
	printf("Before: %s\n", number);
	sort(number, 10);
	printf("After: %s\n", number);

	return 0;
}

C語言中比較重要的是,首先要聲明外部函數sort,也就是由匯編代碼實現的函數。其代碼流程為:

  1. 初始化1個10字節的char類型的數組
  2. 在控制台輸出初始化的數據
  3. 調用匯編函數進行排序
  4. 顯示排序后的結果

2.2 匯編代碼

	area sort, code, readonly
	global sort
start
	mov r2, #-1				; r2->i, i=-1
	sub r8, r1, #1			; r1->count
loop
	cmp r2, r8				; 控制外層循環
	bge stop
	add r2,r2, #1			; i=i+1
	mov r3, #-1				; r3=j, j=-1
loop0
	add r3, r3, #1			; j=j+1
	add r4, r3, #1			; r4=j+1
	sub r7, r8, r2			; 控制內層循環
	cmp r3, r7
	bge loop
	ldrb r5, [r0, r3]		; r5=a[j]
	ldrb r6, [r0, r4]		; r6=a[j+1]
	cmp r5, r6				; 比較 a[j] 和 a[j+1]
	blt loop0
swap
	strb r5, [r0, r4]		; 交換 a[j] 和 a[j+1]
	strb r6, [r0, r3]
	b loop0
	
stop
	end

匯編語言代碼是仿照的C語言的冒泡排序流程實現的,其大致流程為:

  1. 首先初始化R2,R2用來控制外層循環的次數。
  2. 數組個數由R1傳遞進來,然后復制到R8中保存
  3. 外層LOOP循環開始,首先判斷以下外層循環次數,如果外層循環結束,就直接跳轉至STOP結束循環。類似於C語言for循環里面的判斷。
  4. 如果外層循環未結束,那么外層循環要實現的就是分別初始化外層R2和內層R3的循環次數。
  5. 進入內層循環,用R3表示內層循環次數,R4表示內層次數加一。
  6. 判斷內層循環是否已經結束,如果應該結束,就跳轉至外層循環。
  7. 內層循環未結束,就繼續執行,使用ldrb指令將內存中的數據裝入寄存器R5和R6。
  8. 使用cmp比較R5和R6的數值,如果R5<R6就執行下一輪內層循環,否則就繼續執行代碼,使用數據裝載指令STRB,交換R5和R6的數據內容。
  9. 數據交換完成過后,進行下一輪內層循環。
  10. 結束

三、ADS調試

3.1 運行ADS軟件,進入調試界面

調試1
首先顯示的是一堆匯編代碼,直接點擊運行,讓程序停到主函數入口處。
匯編2
接下來是初始化數據,單步執行即可。
匯編3
現在程序已經運行到了sort函數的代碼行,step in進入該函數。

3.2 匯編函數調試

匯編4
可以看到,此時R0和R1的數值分別是0x07FFFFF0和0x0000000A。這兩個數分別表示C語言代碼中number數組的首地址,以及number數組的字符個數。
現在內存里的數值如下:
內存數據
可以看到,現在前三個數是61、63、62,分別對應acb字符。
第一輪內層循環,因為61<63,所以就跳轉到了第二輪內層循環。第二輪內層循環是,63>63,所以就會進入交換數據的程序片段。
數據交換
經過交換之后,現在內存中的數值已經變成了61、62、63。
內存數據2
下面繼續單步執行,等到第一輪所有的內層循環結束之后,數據就變成了下面的效果。
內存數據3
可以看到,最大的數據6A已經跑到了最高的位置0x7FFFFF9。
接下來的循環,因為數據已經拍好了,所以就不會再有數據交換了。如果此時數據還沒有排好,之后的每一輪循環,都會將最大的數據放到高的位置,直到循環結束。

3.3 執行結果

最后,程序執行的結果如下:
控制台輸出
匯編函數執行成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM