ARM C語言呼叫彙編函式 實現氣泡排序

2022-09-07 09:03:11 字數 2763 閱讀 2489

三、ads除錯

本程式的關鍵是如何使用組合語言實現氣泡排序演算法。可以仿照c語言的**流程,分步驟寫出彙編的**。首先要寫出最內層的**部分,也就是資料交換的彙編**,資料交換可以使用str資料裝載指令實現。之後要考慮內層迴圈的**,可以通過cmp指令控制迴圈次數。最後是編寫最外層的迴圈**,也是使用cmp指令,來控制整個排序的次數。

#include

extern

void

sort

(char

* num,

int count)

;int

main()

;printf

("before: %s\n"

, number)

;sort

(number,10)

;printf

("after: %s\n"

, number)

;return0;

}

c語言中比較重要的是,首先要宣告外部函式sort,也就是由彙編**實現的函式。其**流程為:

初始化1個10位元組的char型別的陣列

在控制台輸出初始化的資料

呼叫彙編函式進行排序

顯示排序後的結果

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語言的氣泡排序流程實現的,其大致流程為:

首先初始化r2,r2用來控制外層迴圈的次數。

陣列個數由r1傳遞進來,然後複製到r8中儲存

外層loop迴圈開始,首先判斷以下外層迴圈次數,如果外層迴圈結束,就直接跳轉至stop結束迴圈。類似於c語言for迴圈裡面的判斷。

如果外層迴圈未結束,那麼外層迴圈要實現的就是分別初始化外層r2和內層r3的迴圈次數。

進入內層迴圈,用r3表示內層迴圈次數,r4表示內層次數加一。

判斷內層迴圈是否已經結束,如果應該結束,就跳轉至外層迴圈。

內層迴圈未結束,就繼續執行,使用ldrb指令將記憶體中的資料裝入暫存器r5和r6。

使用cmp比較r5和r6的數值,如果r5資料交換完成過後,進行下一輪內層迴圈。

結束首先顯示的是一堆彙編**,直接點選執行,讓程式停到主函式入口處。

接下來是初始化資料,單步執行即可。

現在程式已經執行到了sort函式的**行,step in進入該函式。

可以看到,此時r0和r1的數值分別是0x07fffff0和0x0000000a。這兩個數分別表示c語言**中number陣列的首位址,以及number陣列的字元個數。

現在記憶體裡的數值如下:

可以看到,現在前三個數是61、63、62,分別對應acb字元。

第一輪內層迴圈,因為61<63,所以就跳轉到了第二輪內層迴圈。第二輪內層迴圈是,63>63,所以就會進入交換資料的程式片段。

經過交換之後,現在記憶體中的數值已經變成了61、62、63。

下面繼續單步執行,等到第一輪所有的內層迴圈結束之後,資料就變成了下面的效果。

可以看到,最大的資料6a已經跑到了最高的位置0x7fffff9。

接下來的迴圈,因為資料已經拍好了,所以就不會再有資料交換了。如果此時資料還沒有排好,之後的每一輪迴圈,都會將最大的資料放到高的位置,直到迴圈結束。

最後,程式執行的結果如下:

彙編函式執行成功。

0基礎理解C語言呼叫彙編實現求和函式

工程大概長這樣 add10.s routine for the addition of many integers.r0 is the counter of the loop.r2 is the pointer of array element.r3 is the value of array el...

c呼叫彙編函式 1

guang guang laptop temp h ls hello hello.o hello.s main.c main.o hello.s.global hello hello movl 4,eax movl 1,ebx movl hello,ecx movl 30,edx int 0x80 ...

c程式呼叫彙編函式

c程式呼叫彙編函式 程式例項 按鍵控制led燈 main.c static int printf const char format,int const char format,0xc3e11ad0 void start led key.s define gpm4con 0x110002e0 def...