ARM匯編學(xué)習(xí)
程序1:C語(yǔ)言中嵌套ARM匯編實(shí)現(xiàn)找出三個(gè)數(shù)中的最大值,程序如下:
本文引用地址:http://butianyuan.cn/article/201611/317579.htmtest.c文件:
#include程序2:C語(yǔ)言調(diào)用匯編程序?qū)崿F(xiàn)冒泡排序,程序如下:#define N 3int MAX(int *p,int b){int rmax = 0; //用來(lái)返回最大值int temp = 0; //作為變量交換的中間變量int count = 0; //計(jì)數(shù)器,用來(lái)做循環(huán)控制變量__asm{MOV count,#0loop:LDR temp,[p,count * 4]CMP rmax,temp MOVLT rmax,tempADD count,count,#1CMP count,bBNE loop }return rmax; }int main(){int src[N]={3,6,5};//定義一個(gè)數(shù)組int max = MAX(src,N);return 0;}
main.c如下:
#include#define N 10int array[N] = {10,9,8,11,13,7,3,3,5,4};extern void my_sort(int *p,int B);int main(){my_sort(array,N);return 0;}
asmain.c如下:
AREA ASMAIN,CODE,READONLYCODE32ENTRYEXPORT my_sortmy_sortMOV R2,#4 ;R2<-4MOV R3,#0 ;R3<-0MOV R4,R1 ;將數(shù)組的寬度賦值給R4MOV R5,R0 ;將數(shù)組的基地址賦值給R5MUL R6,R4,R2 ;將數(shù)組的字節(jié)長(zhǎng)度賦值給R6ADD R7,R0,R6 ;將數(shù)組最后的元素的地址賦值給R7outerMOV R5,R0 ;重新將數(shù)組的基地址賦值給R5innerLDR R8,[R5] ;將數(shù)組的前一個(gè)元素賦值給R8LDR R9,[R5,#4] ;將數(shù)組的后一個(gè)元素賦值給R9CMP R8,R9 ;比較前一個(gè)元素和后一個(gè)元素的大小STRGT R8,[R5,#4] ;前一個(gè)元素大于后一個(gè)元素,則將R8的值賦給數(shù)組的后一個(gè)元素STRGT R9,[R5] ;前一個(gè)元素大于后一個(gè)元素,則將R9的值賦給數(shù)組的前一個(gè)元素ADD R5,R5,#4 ;將指向數(shù)組元素的指針下移一個(gè)單位CMP R5,R7 ;比較數(shù)組的指針是否移到數(shù)組的最后一個(gè)元素BLT inner ;若沒(méi)有,則跳轉(zhuǎn)到下一次內(nèi)層循環(huán)SUB R7,R7,#4 ;R7數(shù)組指針前移一個(gè)單位ADD R3,R3,#4 ;R3計(jì)數(shù)器加4CMP R3,R6 ;比較R3和數(shù)組字節(jié)長(zhǎng)度的大小BLT outer ;R3小于數(shù)組的字節(jié)長(zhǎng)度,跳轉(zhuǎn)到下一次外層循環(huán)MOV PC,LR ;從匯編程序返回到C文件程序END
程序3:匯編語(yǔ)言調(diào)用C語(yǔ)言實(shí)現(xiàn)選擇排序,程序如下:
asmain.s如下:
AREA ASMAIN,CODE,READONLYCODE32ENTRYIMPORT my_sortstartLDR R0,=DATA1 ;將數(shù)組的地址傳給my_sort函數(shù)的第一個(gè)參數(shù)MOV R1,#7 ;將數(shù)組的地址傳給my_sort函數(shù)的第二個(gè)參數(shù)BL my_sort ;執(zhí)行my_sort函數(shù)并返回AREA datablock,DATA,READWRITEDATA1 DCD 2,5,10,11,9,7,1END
main.c如下:
#includevoid my_sort(int *p, int B){int max = 0;int tmp = 0;int i = 0;int j = 0;int z = 0;for(i = 0; i < B - 1; i++){for(j = 0; j < B - i; j++){if(max < p[j]){max = p[j];z = i;}}j--;max = 0;tmp = p[z];p[z] = p[j];p[j] = tmp;}}
注:上面的程序我是在MDK環(huán)境下編譯的,如果在ADS1.2環(huán)境下進(jìn)行編譯,還要進(jìn)行一些修改。
評(píng)論