資源描述:
《arm匯編語言與嵌入式c語言混合編程————內(nèi)嵌匯編》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、ARM匯編語言與嵌入式C語言混合編程————內(nèi)嵌匯編在嵌入式程序設(shè)計(jì)中,有些場合(如對具體的硬件資源進(jìn)行訪問)必須用匯編語言來實(shí)現(xiàn),可以采用在嵌入式C語言程序中嵌入?yún)R編語言或嵌入式C語言調(diào)用匯編語言來實(shí)現(xiàn)。內(nèi)嵌匯編內(nèi)嵌的匯編指令與通常的ARM指令有所區(qū)別,是在嵌入式C程序中嵌入一段匯編代碼,這段匯編代碼在形式上表現(xiàn)為獨(dú)立定義的函數(shù)體,遵循過程調(diào)用標(biāo)準(zhǔn)。1.語法格式在嵌入式C程序中內(nèi)嵌匯編使用關(guān)鍵字“__asm”。在ARM開發(fā)工具編譯環(huán)境下與GNUARM編譯環(huán)境下的內(nèi)嵌匯編在格式上略有差別。(1)ARM開發(fā)工具編譯環(huán)境下內(nèi)嵌匯編語法格式在ARM開
2、發(fā)工具編譯環(huán)境下的內(nèi)嵌匯編語言程序段,可以直接引用C語言中的變量定義。具本的語法格式如下:__asm{指令;[指令]指令;[指令]//注釋…[指令]}示例:/*main.c*/void__main(void){intvar=0xAA;__asm//內(nèi)嵌匯編標(biāo)識{MOVR1,varCMPR1,#0xAA}while(1);}(2)GNUARM環(huán)境下內(nèi)嵌匯編語法格式在GNUARM編譯環(huán)境下內(nèi)嵌匯編語言程序段,不能直接引用C語言中的變量定義。如果有多條匯編指令需要嵌入,則可用“”將它們歸為一條語句。具本的語法格式如下:__asm(“指令;[指令;]
3、指令;[指令;]…[指令;]”);示例:/*main.c*/void__main(void){intvar=0xAA;__asm("MOVR5,#0xAA;/*注意:這里不要直接使用C代碼中提供的變量*/MOVR6,#0xBB;CMPR1,#0;");while(1);}ARM匯編語言調(diào)用嵌入式C語言(匯編程序調(diào)用C程序)2010-04-1514:50這里要特別注意參數(shù)的傳遞規(guī)則,程序設(shè)計(jì)時(shí)要嚴(yán)格遵守ATPCS。在GNUARM編譯環(huán)境下,匯編程序中要使用.extern偽操作聲明將要調(diào)用的C程序;在ARM—ADS開發(fā)工具編譯環(huán)境下,匯編
4、程序中要使用IMPORT偽操作聲明將要調(diào)用的C程序。示例解析(1)在GNUARM編譯環(huán)境下設(shè)計(jì)程序,用ARM匯編語言調(diào)用C語言實(shí)現(xiàn)20!的階乘操作,并將64位結(jié)果保存到寄存器R0、R1中,其中R1中存放高32位結(jié)果。首先建立匯編源文件start.s/*start.s*/.global_start.externFactorial@聲明Factorial是一個(gè)外部函數(shù).equNi,20@要計(jì)算的階乘數(shù).text_start:MOVR0,#Ni@將參數(shù)裝入R0BLFactorial@調(diào)用Factorial,并通過R0傳遞參數(shù)Stop:BStop.en
5、d然后建立C語言源文件factorial.c/*factorial.c*/longlongFactorial(charN){chari;longlongNx=1;for(i=1;i<=N;i++)Nx=Nx*i;returnNx;//通過R0,R1返回結(jié)果}(2)在ARM—ADS開發(fā)工具編譯環(huán)境下設(shè)計(jì)程序,用ARM匯編語言調(diào)用C語言實(shí)現(xiàn)20!的階乘操作,并將64位結(jié)果保存到寄存器R0、R1中,其中R1中存放高32位結(jié)果。首先建立匯編源文件start.s/*start.s*/IMPORTFactorial;聲明Factorial是一個(gè)外部函數(shù)Ni
6、EQU20;要計(jì)算的階乘數(shù)AREAFctrl,CODE,READONLY;聲明代碼FctrlENTRY;標(biāo)識程序入口startMOVR0,#Ni;將參數(shù)裝入R0BLFactorial;調(diào)用Factorial,并通過R0傳遞參數(shù)/*注:在此處觀察結(jié)果*/StopBStopEND;文件結(jié)束然后建立C語言源文件factorial.c/*factorial.c*/longlongFactorial(charN){chari;longlongNx=1;for(i=1;i<=N;i++)Nx=Nx*i;returnNx;//通過R0,R1返回結(jié)果}程序運(yùn)行
7、結(jié)果如下:R0=0x82B40000R1=0x21C3677C嵌入式C語言調(diào)用ARM匯編語言(C程序調(diào)用匯編程序)2010-04-1514:56C程序調(diào)用匯編程序也要特別注意參數(shù)的傳遞規(guī)則,程序設(shè)計(jì)時(shí)要嚴(yán)格遵守ATPCS。在GNUARM編譯環(huán)境下,在匯編程序中要使用.global偽操作聲明匯編程序?yàn)槿值暮瘮?shù),可被外部函數(shù)調(diào)用,同時(shí)在C程序中要用關(guān)鍵字extern聲明要調(diào)用的匯編語言程序。在ARM開發(fā)工具編譯環(huán)境下,匯編程序中要使用EXPORT偽操作聲明本程序可以被其他程序調(diào)用。同時(shí)也要在C程序中要用關(guān)鍵字extern聲明要調(diào)用的匯編語言程序。
8、示例解析(1)在GNUARM編譯環(huán)境下設(shè)計(jì)程序,用用C語言調(diào)用ARM匯編語言C語言實(shí)現(xiàn)20的階乘(20!)操作,并將64位結(jié)果保存到0xFFFFFFF