ARM編程技巧PPT課件

上傳人:痛*** 文檔編號:199460120 上傳時間:2023-04-11 格式:PPT 頁數(shù):41 大?。?95.50KB
收藏 版權(quán)申訴 舉報 下載
ARM編程技巧PPT課件_第1頁
第1頁 / 共41頁
ARM編程技巧PPT課件_第2頁
第2頁 / 共41頁
ARM編程技巧PPT課件_第3頁
第3頁 / 共41頁

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁未讀,繼續(xù)閱讀

資源描述:

《ARM編程技巧PPT課件》由會員分享,可在線閱讀,更多相關(guān)《ARM編程技巧PPT課件(41頁珍藏版)》請在裝配圖網(wǎng)上搜索。

1、1TMT H E A R C H I T E C T U R E F O R T H E D I G I T A L W O R L DARM編程技巧編程技巧2TM2103v04 C/C+Compiler Hints&TipsAgendanARM 編譯器優(yōu)化編譯器優(yōu)化C/C+和匯編混合模式編程使用ARM編譯器編碼局部和全局?jǐn)?shù)據(jù)討論3TM3103v04 C/C+Compiler Hints&Tips優(yōu)化級別優(yōu)化級別n使用的編譯器優(yōu)化級別是可選擇的使用的編譯器優(yōu)化級別是可選擇的-O0-DEBUGn關(guān)閉大多數(shù)優(yōu)化.n最好的調(diào)試信息,最少的優(yōu)化-O1-DEBUGRELn多數(shù)優(yōu)化選項許可n給一個滿意的調(diào)

2、試,好的代碼密度-O2-RELEASE(default)n完全的優(yōu)化n有限的調(diào)試信息,最好的代碼密度n為代碼大小或運(yùn)行速度的優(yōu)化,可選擇為代碼大小或運(yùn)行速度的優(yōu)化,可選擇:-Ospace(默認(rèn)的默認(rèn)的)或或-Otime.n使用使用-g 選像可包含源碼級調(diào)試信息選像可包含源碼級調(diào)試信息4TM4103v04 C/C+Compiler Hints&TipsnADS 編譯器在所有級別中執(zhí)行一些簡單的優(yōu)化編譯器在所有級別中執(zhí)行一些簡單的優(yōu)化ni.e.-O0,-O1,-O2n下面是一個例子:即使用下面是一個例子:即使用-O0,多余的表達(dá)式也被清除了多余的表達(dá)式也被清除了:nATPCS標(biāo)準(zhǔn)中子程序結(jié)果返回規(guī)

3、則n結(jié)果為32位整數(shù),R0返回n結(jié)果為64位整數(shù),R0,R1返回n位數(shù)更多時,用內(nèi)存來傳遞n自動優(yōu)化自動優(yōu)化int f(int*p)return(*p=*p);armcc-c-O0f MOV r1,r0 MOV r0,#1 MOV pc,lr注意:在這種情況下,可使用C的關(guān)鍵字volatile 強(qiáng)制使用這些變量5TM5103v04 C/C+Compiler Hints&Tips使用使用“volatile”int f(volatile int*p)return(*p=*p);armcc-cf LDR r1,r0 LDR r0,r0 CMP r1,r0 MOVNE r0,#0 MOVEQ r0,#

4、1 MOV pc,lrint f(int*p)return(*p=*p);f MOV r0,#1 MOV pc,lrarmcc-cn這個代碼用的編譯級別是:-o26TM6103v04 C/C+Compiler Hints&Tipsn下面是一個冗余代碼清除的例子,他只用了下面是一個冗余代碼清除的例子,他只用了-o1的優(yōu)化選項的優(yōu)化選項:冗余代碼的清除冗余代碼的清除int dummy()int a=10,b=20;int c;c=a+b;return 0;armcc-c-O1dummy MOV r0,#0 MOV pc,lr7TM7103v04 C/C+Compiler Hints&Tips指令編

5、排指令編排n指令編排在高級優(yōu)化選項中是有效的指令編排在高級優(yōu)化選項中是有效的(-O1,-O2).n指令的重新編排是為了使要運(yùn)行的代碼更適合對應(yīng)的核n為arm9和以后的處理器提高吞吐量(一般可達(dá)到4%),并防止互鎖(interlock)n選擇處理器可決定使用的運(yùn)算法則,在默認(rèn)情況下,使用針對ARM9的優(yōu)化方案(對ARM7的運(yùn)行沒有影響)n例如例如:int f(int*p,int x)return*p+x*3;沒用指令編排沒用指令編排(-O0)使用指令編排使用指令編排(-O1,-O2)ADD r1,r1,r1,LSL#1LDR r0,r0,#0LDR r0,r0,#0ADD r1,r1,r1,LS

6、L#1ADD r0,r0,r1;interlock on ARM9ADD r0,r0,r1MOV pc,lrMOV pc,lrarmcc cpu arm7tdmiarmcc cpu arm9tdmi 8TM8103v04 C/C+Compiler Hints&TipsTail-call Optimization嵌套優(yōu)化可避免在函數(shù)級里的不必要的返回在可能的情況下BL 譯碼成B在高級優(yōu)化里有效(-O1,-O2).int main()int x=f();:int f()int y=g();return y;int g()return 10;B gBL f:MOV r0,#10MOV pc,lrBL

7、 f:STR lr,sp,#-4!BL gMOV r1,r0MOV r0,r1LDR pc,sp,#4MOV r0,#10 MOV pc,lr嵌套優(yōu)化嵌套優(yōu)化9TM9103v04 C/C+Compiler Hints&Tips內(nèi)嵌函數(shù)(內(nèi)嵌函數(shù)(inline)n內(nèi)嵌可通過刪除子函數(shù)調(diào)用的開銷來提高性能內(nèi)嵌可通過刪除子函數(shù)調(diào)用的開銷來提高性能n這個這個 inline 關(guān)鍵字顯示哪個函數(shù)將被內(nèi)嵌關(guān)鍵字顯示哪個函數(shù)將被內(nèi)嵌n在高級優(yōu)化選項中,在高級優(yōu)化選項中,ADS 1.2 編譯器默認(rèn)自動內(nèi)嵌編譯器默認(rèn)自動內(nèi)嵌n-Oautoinline(default-O2)n-Ono_autoline(defau

8、lt for-O0,-O1)n哪個函數(shù)是否被內(nèi)嵌取決于:哪個函數(shù)是否被內(nèi)嵌取決于:n他們是否被 _inline標(biāo)示n優(yōu)化的級別n-Otime/-Ospacen函數(shù)被調(diào)用的次數(shù)n如果函數(shù)在別的模塊中不被調(diào)用,一個好的建議是用如果函數(shù)在別的模塊中不被調(diào)用,一個好的建議是用static標(biāo)識函數(shù),否則,標(biāo)識函數(shù),否則,編譯器將在內(nèi)嵌譯碼里把該函數(shù)編譯乘非內(nèi)嵌的編譯器將在內(nèi)嵌譯碼里把該函數(shù)編譯乘非內(nèi)嵌的n加代碼的長度n使調(diào)試信息更復(fù)雜Example.10TM10103v04 C/C+Compiler Hints&TipsInline exampleint bar(int a)a=a+5;return a

9、;int foo(int i)i=bar(i);i=i-2;i=bar(i);i+;return i;bar ADD r0,r0,#5 MOV pc,lrfoo STR lr,sp,#-4!BL bar SUB r0,r0,#2 BL bar ADD r0,r0,#1 LDR pc,sp,#4_inline int bar(int a)a=a+5;return a;int foo(int i)i=bar(i);i=i-2;i=bar(i);i+;return i;foo ADD r0,r0,#5 SUB r0,r0,#2 ADD r0,r0,#5 ADD r0,r0,#1 MOV pc,lr內(nèi)

10、嵌例子內(nèi)嵌例子11TM11103v04 C/C+Compiler Hints&TipsAgendaARM編譯器的優(yōu)化nC/C+和匯編混合模式編程和匯編混合模式編程使用ARM編譯器編碼局部和全局?jǐn)?shù)據(jù)討論12TM12103v04 C/C+Compiler Hints&TipsC和匯編的混合編程和匯編的混合編程nC/C+和匯編能很容易的混合和匯編能很容易的混合:n可實現(xiàn)在c中無法實現(xiàn)的處理器功能n使用新的或不支持的指令n產(chǎn)生更高效的代碼n直接鏈接變量和程序直接鏈接變量和程序n確定符合程序調(diào)用規(guī)范n輸入/輸出相關(guān)的符號n編譯器也可包含內(nèi)嵌匯編編譯器也可包含內(nèi)嵌匯編n大多數(shù)arm指令集都可實現(xiàn)n寄存器操

11、作數(shù)可支持任意的c/c+的表達(dá)式n內(nèi)嵌匯編代碼可由編譯器的優(yōu)化器來傳遞13TM13103v04 C/C+Compiler Hints&TipsATPCS(arm/thumb程序調(diào)用規(guī)范)程序調(diào)用規(guī)范)r8r9/sbr10/slr11r12r13/spr14/lrr15/pcr0r1r2r3r4r5r6r7寄存器變量寄存器變量必須保護(hù)必須保護(hù)作為函數(shù)傳遞的參數(shù)值作為函數(shù)傳遞的參數(shù)值Scratch register(corruptible)Stack PointerLink RegisterProgram Counter編譯器使用一套規(guī)則的來設(shè)置寄存器的用法ARM-Thumb Procedure

12、Call Standard or ATPCS(or APCS)CPSR 標(biāo)志位可被函數(shù)調(diào)用所破壞任何和編譯過的代碼交互工作的匯編碼在接口層必 須滿足ATPCS的規(guī)范Register-如果如果 RWPI選項有效,作為棧的基地址選項有效,作為棧的基地址-如果軟件堆棧檢查有效,作為棧的限制值如果軟件堆棧檢查有效,作為棧的限制值-可作為臨時的一個值棧一樣來使用可作為臨時的一個值棧一樣來使用-子程序內(nèi)部調(diào)用的可改寫的寄存器子程序內(nèi)部調(diào)用的可改寫的寄存器-程序計數(shù)器程序計數(shù)器14TM14103v04 C/C+Compiler Hints&Tips在在C程序中調(diào)用匯編程序中調(diào)用匯編n在匯編程序中用在匯編程序

13、中用export name來定義來定義n在在C程序中直接調(diào)用程序中直接調(diào)用,用用EXTERN聲明聲明n正常鏈接正常鏈接extern void mystrcopy(char*d,const char*s);int main(void)const char*src=“Source”;char dest10;.mystrcopy(dest,src);.AREA StringCopy,CODE,READONLY EXPORT mystrcopymystrcopy LDRB r2,r1,#1 STRB r2,r0,#1 CMP r2,#0 BNE mystrcopy MOV pc,lr END這里所有的

14、參數(shù)都是可以用寄存器來傳遞的,所以不需要在匯編程序中使用PUSH/POP來保護(hù)CALL15TM15103v04 C/C+Compiler Hints&Tips內(nèi)嵌匯編內(nèi)嵌匯編n允許使用一些不能由編譯器自動生允許使用一些不能由編譯器自動生成的指令成的指令:nMSR/MRSn新的指令n協(xié)處理器指令n通常在關(guān)聯(lián)的內(nèi)嵌函數(shù)中使用通常在關(guān)聯(lián)的內(nèi)嵌函數(shù)中使用n使用使用C變量代替寄存器變量代替寄存器n不是一個真正的匯編文件n通過優(yōu)化器實現(xiàn)nADS FAQ 入口入口“Using the Inline Assembler”#define Q_Flag 0 x08000000/Bit 27_inline void

15、 Clear_Q_flag(void)int temp;_asm MRS temp,CPSR BIC temp,temp,#Q_Flag MSR CPSR_f,temp_inline int mult16(short a,short b,int c)int temp;_asm SMLABB temp,a,b,c return temp;16TM16103v04 C/C+Compiler Hints&TipsAgenda ARM編譯器的優(yōu)化C/C+和匯編混合模式編程n使用使用ARM編譯器編碼編譯器編碼局部和全局?jǐn)?shù)據(jù)討論17TM17103v04 C/C+Compiler Hints&Tips參數(shù)傳

16、遞參數(shù)傳遞n開始四個字大小的參數(shù)直接使用寄存器的開始四個字大小的參數(shù)直接使用寄存器的R0-R3來傳遞來傳遞(快速且高效的快速且高效的)n更多的信息可參看ATPCSn如果需要更多的參數(shù),將使用堆棧。如果需要更多的參數(shù),將使用堆棧。(需要額外的指令和慢速的存儲器操需要額外的指令和慢速的存儲器操作作)n所以通常限制參數(shù)的個數(shù),使它為所以通常限制參數(shù)的個數(shù),使它為4或更少。或更少。n如果不可避免,把常用的參數(shù)前4個放在R0-R3中Example.18TM18103v04 C/C+Compiler Hints&TipsnParameter Passing(4 parameters)int func1(i

17、nt a,int b,int c,int d)return a+b+c+d;int caller1(void)return func1(1,2,3,4);func1 0 x000000:ADD r0,r0,r1 0 x000004:ADD r0,r0,r2 0 x000008:ADD r0,r0,r3 0 x00000c:MOV pc,lr caller1 0 x000014:MOV r3,#4 0 x000018:MOV r2,#3 0 x00001c:MOV r1,#2 0 x000020:MOV r0,#1 0 x000024:B func1Parameter Passing(4 par

18、ameters)19TM19103v04 C/C+Compiler Hints&TipsParameter Passing(6 parameters)nParameter Passing(6 parameters)func2 0 x000000:STR lr,sp,#-4!0 x000004:ADD r0,r0,r1 0 x000008:ADD r0,r0,r2 0 x00000C:ADD r0,r0,r3 0 x000010:LDMIB sp,r12,r14 0 x000014:ADD r0,r0,r12 0 x000018:ADD r0,r0,r14 0 x00001C:LDR pc,sp

19、,#4 caller2 0 x000020:STMFD sp!,r2,r3,lr 0 x000024:MOV r3,#6 0 x000028:MOV r2,#5 0 x00002C:STMIA sp,r2,r3 0 x000030:MOV r3,#4 0 x000034:MOV r2,#3 0 x000038:MOV r1,#2 0 x00003C:MOV r0,#1 0 x000040:BL func2 0 x000044:LDMFD sp!,r2,r3,pcint func2(int a,int b,intc,int,d,int e,int f)return a+b+c+d+e+f;int

20、 caller2(void)return func1(1,2,3,4,5,6);This code is compiled with“-O2-Ono_autoinline”20TM20103v04 C/C+Compiler Hints&Tips循環(huán)終止循環(huán)終止n在在for(),while()dowhile()的循環(huán)中,用減到的循環(huán)中,用減到0代替加到某個值。代替加到某個值。n比如,用下面的代替比如,用下面的代替:for(loop=1;loop=total;loop+)/(ADD,CMP)代替為:代替為:for(loop=total;loop!=0;loop-)/(SUBS)n盡量減少循環(huán)的次數(shù)

21、盡量減少循環(huán)的次數(shù)n代碼小,且使用更少的寄存器Example.21TM21103v04 C/C+Compiler Hints&TipsLoop TerminationCount upint fact1(int limit)int i;int fact=1;for(i=1;i=60)count=0;modulo ADD r1,r0,#1 MOV r0,#0 x3c BL _rt_udiv MOV r0,r1test_and_reset ADD r0,r0,#1 CMP r0,#0 x3c MOVCS r0,#0 這個代碼用“-O1-Ospace”編譯25TM25103v04 C/C+Compil

22、er Hints&Tips浮點(diǎn)浮點(diǎn)n軟件浮點(diǎn)庫軟件浮點(diǎn)庫(fplib)n默認(rèn):-fpu softvfp(or softfpa)n浮點(diǎn)協(xié)處理器浮點(diǎn)協(xié)處理器nVFP(ARM10 and ARM9)n-fpu vfp(or vfpv1 or vfpv2)nFPA(eg ARM7 500fe)-now obsoleten-fpu fpan軟件浮點(diǎn)仿真軟件浮點(diǎn)仿真(FPE)n通過未定義的異常來捕獲協(xié)處理器指令nVFP(and FPA)實際上是硬件協(xié)處理器和仿真的混合實際上是硬件協(xié)處理器和仿真的混合n要求支持代碼去實現(xiàn)混合運(yùn)算n在AFS 1.3 和以后的版本里有VFP的 支持代碼,在ADS的FPA里.n在

23、在thumb代碼使用代碼使用fp處,處,vfp系統(tǒng)用系統(tǒng)用-fpu softvfp+vfp編譯編譯n使用使用-auto_float_constants 預(yù)防常量被處理為雙精度類型,關(guān)閉警告用預(yù)防常量被處理為雙精度類型,關(guān)閉警告用-Wk.Example.26TM26103v04 C/C+Compiler Hints&Tipsfloat foo(float num1,float num2)float temp,temp2;temp=num1+num2;temp2=num2*num2;return temp2-temp;armcc float.cfoo FADDS s0,s0,s1 FMULS s1

24、,s1,s1 FSUBS s0,s1,s0 MOV pc,lr使用協(xié)處理器指令使用協(xié)處理器指令foo STMFD sp!,r3-r5,lr MOV r4,r1 BL _fadd MOV r5,r0 MOV r0,r4 MOV r1,r4 BL _fmul MOV r1,r5 LDMFD sp!,r3-r5,lr B _fsub使用浮點(diǎn)庫使用浮點(diǎn)庫armcc-fpu vfpv2 float.cFloating point examples27TM27103v04 C/C+Compiler Hints&TipsAgenda ARM 編譯器優(yōu)化C/C+和匯編混合模式編程使用ARM編譯器編碼局部和全局

25、數(shù)據(jù)局部和全局?jǐn)?shù)據(jù)28TM28103v04 C/C+Compiler Hints&Tips變量類型變量類型n全局和靜態(tài)變量保留在全局和靜態(tài)變量保留在RAM里里n需使用loads/stores訪問外部存儲器n局部變量通常放在寄存器中,用來快速且高效的處理局部變量通常放在寄存器中,用來快速且高效的處理n如果編譯器的寄存器分配算法認(rèn)為超過現(xiàn)有的寄存器數(shù)量,將把變量壓入棧中n對局部變量,用對局部變量,用 word-sized(int)代替代替 halfword 和和 byte:n為了確保不受其他條件的影響,可特別指定使用32-bit寄存器變量.29TM29103v04 C/C+Compiler Hin

26、ts&Tipsint wordsize(int a)wordsize 0 x000000:MOV r0,r0,LSL#1 return(a*2);0 x000004:MOV pc,lrshort halfsize(short b)halfsize 0 x000008:MOV r0,r0,LSL#17 return(b*2);0 x00000c:MOV r0,r0,ASR#16 0 x000010:MOV pc,lrchar bytesize(char c)bytesize 0 x000014:MOV r0,r0,LSL#25 return(c*2);0 x000018:MOV r0,r0,LS

27、R#24 0 x00001c:MOV pc,lr變量大小變量大小30TM30103v04 C/C+Compiler Hints&Tips堆棧的用法堆棧的用法nC/C+代碼的堆棧使用代碼的堆棧使用,堆棧用來保留堆棧用來保留:n子程序的返回地址n溢出的局部變量n局部數(shù)組和結(jié)構(gòu)體n注意注意:n函數(shù)越小越好:(更少的變量,更少的溢出);n更少數(shù)量的live變量(比如:函數(shù)里每個點(diǎn)保存的有用的數(shù)據(jù))n避免使用大的局部結(jié)構(gòu)體或數(shù)組(使用malloc/free代替)n避免遞歸31TM31103v04 C/C+Compiler Hints&Tips堆棧使用估計堆棧使用估計n鏈接使用鏈接使用-callgraph

28、n顯示靜態(tài)堆棧的開銷(html文件).n編譯時使用軟件堆棧檢查編譯時使用軟件堆棧檢查n-apcs/swstn在棧結(jié)束點(diǎn)設(shè)置在棧結(jié)束點(diǎn)設(shè)置 watchpointn測試堆棧n定義大的棧定義大的棧n填充某個值,看覆蓋了多少,從而判定棧的使用情況nARMulator映射文件映射文件n拒絕訪問棧下面的區(qū)域,棧溢出將導(dǎo)致一個data abort異常ARMulator模式,跟蹤堆棧的大小,用ARMulator的統(tǒng)計來輸出報告當(dāng)要對堆棧使用情況進(jìn)行估計時,使用worst case32TM32103v04 C/C+Compiler Hints&Tips全局?jǐn)?shù)據(jù)布局全局?jǐn)?shù)據(jù)布局char one;short two

29、;char three;int four;charshortintchare.g.聲明的數(shù)據(jù)Declared alignment12 bytes(4 bytes of padding)Optimal alignment8 bytes(Zero bytes of padding)ADS 1.1+將自動用此風(fēng)格排序shortcharcharintn全局?jǐn)?shù)據(jù)保存在存儲器里,不是寄存器全局?jǐn)?shù)據(jù)保存在存儲器里,不是寄存器n需要load/store指令來訪問n用物理尺寸的邊界對齊nADS 1.2 會優(yōu)化在一個模塊里的全局?jǐn)?shù)據(jù)的布局會優(yōu)化在一個模塊里的全局?jǐn)?shù)據(jù)的布局n用-Ono_data_reorder 將

30、關(guān)閉排序33TM33103v04 C/C+Compiler Hints&Tips不對齊訪問不對齊訪問nARM硬件需要在自然尺寸的邊界訪問內(nèi)存硬件需要在自然尺寸的邊界訪問內(nèi)存nWord訪問在word尺寸nHalfword訪問在halfword尺寸nByte訪問在byte尺寸n不對齊訪問不對齊訪問n遺留代碼n特定協(xié)議需要必須告訴編譯器,讓它產(chǎn)生適當(dāng)?shù)闹噶钚蛄行枰仨毟嬖V編譯器,讓它產(chǎn)生適當(dāng)?shù)闹噶钚蛄衝使用使用 _packed 屬性屬性n可能導(dǎo)致多字節(jié)訪問代替單字節(jié)訪問n用LDM指令的結(jié)果有2 字,轉(zhuǎn)變?yōu)樯蓡巫謓不對齊數(shù)據(jù)的訪問所產(chǎn)生的意外的結(jié)果取決于指令的使用不對齊數(shù)據(jù)的訪問所產(chǎn)生的意外的結(jié)果取

31、決于指令的使用n將是不可預(yù)知的34TM34103v04 C/C+Compiler Hints&Tips指針的對齊指針的對齊n必須非常小心指針的對齊必須非常小心指針的對齊n可能導(dǎo)致程序的失敗memcpy inlinedmemcpy calledmemcpy inlinedunsafelymemcpy called safely#include int*a=(int*)0 x1000;int*b=(int*)0 x2000;char*c=(char*)0 x3001;_packed int*d;void foo(void)memcpy(b,a,12);memcpy(c,a,12);b=(int*)

32、c;memcpy(b,a,12);d=(_packed int*)c;memcpy(void*)d,a,12);STMFD r13!,r4,r14LDR r4,0 x58LDR r1,r4,#0LDR r0,r4,#4LDMIA r1,r2,r3,r12STMIA r0,r2,r3,r12LDR r0,r4,#8LDR r1,r4,#0MOV r2,#0 xcBL _rt_memcpyLDR r0,r4,#8STR r0,r4,#4LDR r1,r4,#0LDMIA r1,r2,r3,r12STMIA r0,r2,r3,r12LDR r0,r4,#8LDR r1,0 x5cMOV r2,#0

33、xcSTR r0,r1,#0LDR r1,r4,#0BL _rt_memcpyLDMFD r13!,r4,pc35TM35103v04 C/C+Compiler Hints&Tips結(jié)構(gòu)的打包結(jié)構(gòu)的打包n在結(jié)構(gòu)里定義打包的元素代替結(jié)構(gòu)的打包在結(jié)構(gòu)里定義打包的元素代替結(jié)構(gòu)的打包n他將幫助減小訪問輸出的結(jié)構(gòu)的開銷nADS FAQ 入口:Aligned v.unaligned accesses and use of _packed_packed struct mystruct int aligned_i;short aligned_s;int unaligned_i;extern struct my

34、struct S;shortintU_intU_intstruct mystruct int aligned_i;short aligned_s;_packed int unaligned_i;extern struct mystruct S;PREFER._packed限定的數(shù)據(jù)為限定的數(shù)據(jù)為1字節(jié)對齊字節(jié)對齊不實現(xiàn)字節(jié)對齊調(diào)整不實現(xiàn)字節(jié)對齊調(diào)整很高的訪問代價,不會節(jié)省存儲空間很高的訪問代價,不會節(jié)省存儲空間36TM36103v04 C/C+Compiler Hints&Tips優(yōu)化的指針基地址優(yōu)化的指針基地址extern int a;extern int b;void foo(int x,

35、int y)a=x;b=y;baLDR r2,pc,#12STR r0,r2,#0LDR r3,pc,#8STR r1,r3,#0MOV pc,lrDCD“address of a”DCD“address of b”a 和 b 被定義為外部的注意:在用-o0時無效LDR r2,pc,#8STR r0,r2,#0STR r1,r2,#4MOV pc,lrDCD“base address of a and b”a 和 b 被定義為模塊內(nèi)用的數(shù)據(jù)int a;int b;void foo(int x,int y)a=x;b=y;37TM37103v04 C/C+Compiler Hints&Tips優(yōu)

36、化外部全局指針優(yōu)化外部全局指針n如果全局?jǐn)?shù)據(jù)放在結(jié)構(gòu)體里,每個元素的訪問將自動的在基指針上偏移如果全局?jǐn)?shù)據(jù)放在結(jié)構(gòu)體里,每個元素的訪問將自動的在基指針上偏移n在結(jié)構(gòu)體里的元素將按大小的邊界對齊n編譯器不對結(jié)構(gòu)體重新排列n把數(shù)據(jù)放在多個邏輯結(jié)構(gòu)體內(nèi),代替一個大的結(jié)構(gòu)把數(shù)據(jù)放在多個邏輯結(jié)構(gòu)體內(nèi),代替一個大的結(jié)構(gòu)n#define 將對主應(yīng)用代碼的改變隱藏起來將對主應(yīng)用代碼的改變隱藏起來n#define value mystruct.valueExample.38TM38103v04 C/C+Compiler Hints&Tips外部全局變量外部全局變量extern int a;extern int

37、b;int main(void)return a+b;int a;int b;mainLDR r0,0 x000080c0000080acLDR r1,0 x000080c4000080b0LDR r0,r0,#0000080b4LDR r1,r1,#0000080b8ADD r0,r0,r1000080bcMOV pc,lr000080c0DCD 0 x000083d4000080c4DCD 0 x000083d8extern struct data mystruct;int main(void)return mystruct.a+mystruct.b;struct data int a;i

38、nt b;mystruct;mainLDR r0,0 x000080bc000080acLDR r1,r0,#0000080b0LDR r0,r0,#4000080b4ADD r0,r1,r0000080b8MOV pc,lr000080bcDCD 0 x000083ccAssembler output39TM39103v04 C/C+Compiler Hints&Tips測驗測驗1)默認(rèn)的優(yōu)化級別是什么?默認(rèn)的優(yōu)化級別是什么?2)給)給tail-call優(yōu)化有什么好處優(yōu)化有什么好處3)在函數(shù)調(diào)用時,管理寄存器用法的標(biāo)準(zhǔn)的名字是什么?在函數(shù)調(diào)用時,管理寄存器用法的標(biāo)準(zhǔn)的名字是什么?4)在參數(shù)傳

39、遞時,被推薦的最大的量是多少?在參數(shù)傳遞時,被推薦的最大的量是多少?5)為什么在為什么在arm里要盡可能避免使用除法?里要盡可能避免使用除法?6)_packed的效果是什么?的效果是什么?40TM40103v04 C/C+Compiler Hints&Tips參考參考n需要更多的信息,請看需要更多的信息,請看:nADS 1.2 Compilers and Libraries GuidenSection 2:C and C+CompilersnSection 3:ARM Compiler ReferencenADS 1.2 Developer GuidenChapter 4:Mixing C,C+and Assembly LanguagenApplication Note 34,Writing Efficient CnApplication Note 36,Declaring Global Data in C

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔

相關(guān)搜索

關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!

五月丁香婷婷狠狠色,亚洲日韩欧美精品久久久不卡,欧美日韩国产黄片三级,手机在线观看成人国产亚洲