三、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...