第九章c程序在arm上的優(yōu)化_第1頁(yè)
第九章c程序在arm上的優(yōu)化_第2頁(yè)
第九章c程序在arm上的優(yōu)化_第3頁(yè)
第九章c程序在arm上的優(yōu)化_第4頁(yè)
第九章c程序在arm上的優(yōu)化_第5頁(yè)
已閱讀5頁(yè),還剩42頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C程序在ARM上的優(yōu)化主要內(nèi)容ARM編譯器優(yōu)化C/C++和匯編混合模式編程局部和全局?jǐn)?shù)據(jù)討論第一節(jié) ARM編譯器優(yōu)化

優(yōu)化級(jí)別使用的編譯器優(yōu)化級(jí)別是可選擇的

-O0---DEBUG關(guān)閉大多數(shù)優(yōu)化最好的調(diào)試信息,最少的優(yōu)化

-O1---DEBUGREL多數(shù)優(yōu)化選項(xiàng)許可給一個(gè)滿意的調(diào)試,好的代碼密度

-O2---RELEASE(default)完全的優(yōu)化有限的調(diào)試信息,最好的代碼密度

為代碼大小或運(yùn)行速度的優(yōu)化,可選擇:-Ospace(默認(rèn)的)或-Otime.使用-g

選項(xiàng)可包含源碼級(jí)調(diào)試信息ADS編譯器在所有級(jí)別中執(zhí)行一些簡(jiǎn)單的優(yōu)化i.e.

-O0,-O1,-O2下面是一個(gè)例子:即使用-O0,多余的表達(dá)式也被清除了ATPCS標(biāo)準(zhǔn)中子程序結(jié)果返回規(guī)則結(jié)果為32位整數(shù),R0返回結(jié)果為64位整數(shù),R0,R1返回位數(shù)更多時(shí),用內(nèi)存來(lái)傳遞……自動(dòng)優(yōu)化intf(int*p){return(*p==*p);}armcc-c–O0fMOVr1,r0MOVr0,#1MOVpc,lr注意:在這種情況下,可使用C的關(guān)鍵字volatile強(qiáng)制使用這些變量使用“volatile”intf(volatileint*p){return(*p==*p);}armcc-cfLDRr1,[r0]LDRr0,[r0]CMPr1,r0MOVNEr0,#0MOVEQr0,#1MOVpc,lrintf(int*p){return(*p==*p);}fMOVr0,#1MOVpc,lrarmcc-c這個(gè)代碼用的編譯級(jí)別是:-o2下面是一個(gè)冗余代碼清除的例子,它只用了-o1的優(yōu)化選項(xiàng):冗余代碼的清除intdummy(){inta=10,b=20;intc;c=a+b;return0;}armcc-c-O1dummyMOVr0,#0MOVpc,lr指令編排指令編排在高級(jí)優(yōu)化選項(xiàng)中是有效的(-O1,-O2)指令的重新編排是為了使要運(yùn)行的代碼更適合對(duì)應(yīng)的核為arm9和以后的處理器提高吞吐量(一般可達(dá)到4%),并防止互鎖(interlock)選擇處理器可決定使用的運(yùn)算法則,在默認(rèn)情況下,使用針對(duì)ARM9的優(yōu)化方案(對(duì)ARM7的運(yùn)行沒(méi)有影響)例如:intf(int*p,intx) {return*p+x*3;}

沒(méi)用指令編排(-O0) 使用指令編排(-O1,-O2)

ADDr1,r1,r1,LSL#1 LDRr0,[r0,#0]

LDRr0,[r0,#0] ADDr1,r1,r1,LSL#1

ADDr0,r0,r1;interlockonARM9 ADDr0,r0,r1

MOVpc,lr MOVpc,lrarmcc–cpuarm7tdmiarmcc–cpuarm9tdmi

嵌套優(yōu)化可避免在函數(shù)級(jí)里的不必要的返回在可能的情況下BL譯碼成B

在高級(jí)優(yōu)化里有效(-O1,-O2)intmain()

{

intx=f();

:

}intf()

{

inty=g();

returny;

}intg()

{

return10;

}BgBLf

:MOVr0,#10

MOVpc,lrBLf

:STRlr,[sp,#-4]!

BLg

MOVr1,r0

MOVr0,r1

LDRpc,[sp],#4MOVr0,#10MOVpc,lr嵌套優(yōu)化內(nèi)嵌函數(shù)(inline)內(nèi)嵌可通過(guò)刪除子函數(shù)調(diào)用的開銷來(lái)提高性能這個(gè)inline

關(guān)鍵字顯示哪個(gè)函數(shù)將被內(nèi)嵌在高級(jí)優(yōu)化選項(xiàng)中,ADS1.2編譯器默認(rèn)自動(dòng)內(nèi)嵌-Oautoinline(default-O2)-Ono_autoinline(defaultfor-O0,-O1)哪個(gè)函數(shù)是否被內(nèi)嵌取決于:它們是否被__inline標(biāo)識(shí)優(yōu)化的級(jí)別-Otime/-Ospace函數(shù)被調(diào)用的次數(shù)intbar(inta){a=a+5;returna;}intfoo(inti){i=bar(i);i=i-2;i=bar(i);i++;returni;}barADDr0,r0,#5MOVpc,lrfooSTRlr,[sp,#-4]!BLbarSUBr0,r0,#2BLbarADDr0,r0,#1LDRpc,[sp],#4__inlineintbar(inta){a=a+5;returna;}intfoo(inti){i=bar(i);i=i-2;i=bar(i);i++;returni;}fooADDr0,r0,#5SUBr0,r0,#2ADDr0,r0,#5ADDr0,r0,#1MOVpc,lr開始四個(gè)字大小的參數(shù)直接使用寄存器的R0-R3來(lái)傳遞(快速且高效的)更多的信息可參看ATPCS如果需要更多的參數(shù),將使用堆棧。(需要額外的指令和慢速的存儲(chǔ)器操作)

所以通常限制參數(shù)的個(gè)數(shù),使它為4或更少。如果不可避免,把常用的參數(shù)前4個(gè)放在R0-R3中參數(shù)傳遞參數(shù)傳遞(4參數(shù))intfunc1(inta,intb, intc,intd){returna+b+c+d;}intcaller1(void){returnfunc1(1,2,3,4);}

func10x000000:ADDr0,r0,r10x000004:ADDr0,r0,r20x000008:ADDr0,r0,r30x00000c:MOVpc,lr

caller10x000014:MOVr3,#40x000018:MOVr2,#30x00001c:MOVr1,#20x000020:MOVr0,#10x000024:Bfunc1ParameterPassing(4parameters)參數(shù)傳遞(6參數(shù))func20x000000:STRlr,[sp,#-4]!0x000004:ADDr0,r0,r10x000008:ADDr0,r0,r20x00000C:ADDr0,r0,r30x000010:LDMIAr4,{r12,r14}0x000014:ADDr0,r0,r120x000018:ADDr0,r0,r140x00001C:LDRpc,{sp},#4

caller20x000020:STMFDsp!,{r2,r3,lr}0x000024:MOVr3,#60x000028:MOVr2,#50x00002C:STMIAr4,{r2,r3}0x000030:MOVr3,#40x000034:MOVr2,#30x000038:MOVr1,#20x00003C:MOVr0,#10x000040:BLfunc20x000044:LDMFDsp!,{r2,r3,pc}intfunc2(inta,intb,intc, int,d,inte,intf){returna+b+c+d+e+f;}intcaller2(void){returnfunc2(1,2,3,4,5,6);}Thiscodeiscompiledwith“-O2-Ono_autoinline”在for(),while()do…while()的循環(huán)中,用減到0代替加到某個(gè)值比如,用下面的代替:

for(loop=1;loop<=total;loop++)//(ADD,CMP)

代替為:

for(loop=total;loop!=0;loop--)//(SUBS)盡量減少循環(huán)的次數(shù)代碼小,且使用更少的寄存器循環(huán)終止Countupintfact1(intlimit){inti;intfact=1;for(i=1;i<=limit;i++){fact=fact*i;}returnfact;}Countdownintfact2(intlimit){inti;intfact=1;for(i=limit;i!=0;i--){fact=fact*i;}returnfact;}fact20x000000:MOVSr1,r00x000004:MOVr0,#10x000008:MOVEQpc,lr0x00000c:MULr0,r1,r00x000010:SUBSr1,r1,#10x000014:BNE0x0c0x000018:MOVpc,lrfact10x000000:MOVr2,#10x000004:MOVr1,#10x000008:CMPr0,#10x00000c:BLT0x200x000010:MULr2,r1,r20x000014:ADDr1,r1,#10x000018:CMPr1,r00x00001c:BLE0x100x000020:MOVr0,r20x000024:MOVpc,lrThiscodeiscompiledwith“-O2-Otime”循環(huán)終止除法操作(1)ARM核不含除法硬件除法通常用一個(gè)運(yùn)行庫(kù)函數(shù)來(lái)實(shí)現(xiàn),運(yùn)行需要很多的周期unsigneddiv(unsigneda,unsignedb){return(b/a);}divB__rt_udivunsigneddiv2(unsignedb){return(b/2);}div2MOVr0,r0,LSR#1MOVpc,lr一些除法操作在編譯時(shí)作為特例來(lái)處理除2操作,被右移代替除法操作(2)在-O1和-O2(使用-Otime),其他的常量將使用一個(gè)標(biāo)準(zhǔn)的乘法序列來(lái)完成例如:實(shí)時(shí)除法程序使用CLZ指令只有V5te體系結(jié)構(gòu)才有效。用下面的辦法來(lái)選擇C-#pragmaimport__use_realtime_divisionAssembler-IMPORT__use_realtime_divisiondiv10MOVr1,r0

LDRr0,=0xCCCCCCCD

UMULLr2,r1,r0,r1

MOVr0,r1,LSR#3

MOVpc,lrunsigneddiv10(unsignedc){return(c/10);}第二節(jié) C/C++和匯編混合模式編程

C和匯編的混合編程C/C++和匯編能很容易的混合可實(shí)現(xiàn)在C中無(wú)法實(shí)現(xiàn)的處理器功能使用新的或不支持的指令產(chǎn)生更高效的代碼直接鏈接變量和程序確定符合程序調(diào)用規(guī)范輸入/輸出相關(guān)的符號(hào)編譯器也可包含內(nèi)嵌匯編大多數(shù)ARM指令集都可實(shí)現(xiàn)寄存器操作數(shù)可支持任意的C/C++的表達(dá)式內(nèi)嵌匯編代碼可由編譯器的優(yōu)化器來(lái)傳遞匯編語(yǔ)言與C/C++的混合編程通常有以下幾種方式:在C/C++代碼中嵌入?yún)R編指令在匯編程序和C/C++的程序之間進(jìn)行變量的互訪匯編程序、C/C++程序間的相互調(diào)用C和匯編的混合編程r8r9/sbr10/slr11r12r13/spr14/lrr15/pcr0r1r2r3r4r5r6r7寄存器變量必須保護(hù)作為函數(shù)傳遞的參數(shù)值Scratchregister(corruptible)StackPointer

LinkRegisterProgramCounterARM-ThumbProcedureCallStandardorATPCS(orAPCS)

編譯器使用一套規(guī)則來(lái)設(shè)置寄存器的用法

CPSR標(biāo)志位可被函數(shù)調(diào)用所破壞任何和編譯過(guò)的代碼交互工作的匯編碼在接口層必須滿足ATPCS的規(guī)范Register-如果RWPI選項(xiàng)有效,作為棧的基地址-如果軟件堆棧檢查有效,作為棧的限制值-可作為臨時(shí)的一個(gè)值棧一樣來(lái)使用-子程序內(nèi)部調(diào)用的可改寫的寄存器-程序計(jì)數(shù)器在C程序中調(diào)用匯編在匯編程序中用exportname來(lái)定義在C程序中直接調(diào)用,用EXTERN聲明正常鏈接externvoidmystrcopy(char*d,constchar*s);intmain(void){constchar*src=“Source”;

chardest[10];...

mystrcopy(dest,src);...}AREAStringCopy,CODE,READONLYEXPORTmystrcopymystrcopyLDRBr2,[r1],#1STRBr2,[r0],#1CMPr2,#0BNEmystrcopyMOVpc,lrEND這里所有的參數(shù)都是可以用寄存器來(lái)傳遞的,所以不需要在匯編程序中使用堆棧來(lái)保護(hù)CALL

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編的語(yǔ)法__asm {指令[;指令]//*注釋*

…… [指令] }

內(nèi)嵌匯編-----------內(nèi)嵌匯編的語(yǔ)法例:使能/禁能IRQ中斷

__inlinevoidenable_IRQ(void){inttmp;

__asm//嵌入?yún)R編代碼

{MRStmp,CPSR//讀取CPSR的值

BICtmp,tmp,#0x80MSRCPSR_c,tmp}}內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編的語(yǔ)法例:使能/禁能IRQ中斷

__inlinevoiddisable_IRQ(void){inttmp;

__asm{MRStmp,CPSRORRtmp,tmp,#0x80MSRCPSR_c,tmp}}內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編的指令用法(1)操作數(shù)內(nèi)嵌的匯編指令中作為操作數(shù)的寄存器和常量可以是C表達(dá)式。(2)物理寄存器內(nèi)嵌匯編中使用物理寄存器有以下限制:不能直接向PC寄存器賦值使用物理寄存器的指令中,不要使用過(guò)于復(fù)雜的C表達(dá)式編譯器可能會(huì)使用R12或R13存放編譯的中間結(jié)果通常內(nèi)嵌的匯編指令中不要指定物理寄存器內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編的指令用法(3)常量。在內(nèi)嵌匯編指令中,常量前面的“#”可以省略。(4)指令展開。內(nèi)嵌的匯編指令中,如果包含常量操作數(shù),則該指令有可能被內(nèi)嵌匯編器展開成幾條指令。(5)標(biāo)號(hào)。C程序中的標(biāo)號(hào)可以被內(nèi)嵌的匯編指令使用。但是只有指令B可以使用C程序中的標(biāo)號(hào),而指令BL則不能使用。內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言(6)內(nèi)存單元的分配。所有的內(nèi)存分配均由C編譯器完成,分配的內(nèi)存單元通過(guò)變量供內(nèi)嵌匯編器使用。內(nèi)嵌匯編器不支持內(nèi)嵌匯編程序中用于內(nèi)存分配的偽指令。-----------內(nèi)嵌匯編的指令用法(7)SWI和BL指令。在內(nèi)嵌的SWI和BL指令中,除了正常的操作數(shù)域外,還必須增加以下3個(gè)可選的寄存器列表:

第1個(gè)寄存器列表中的寄存器用于輸入的參數(shù)。第2個(gè)寄存器列表中的寄存器用于存儲(chǔ)返回的結(jié)果。第3個(gè)寄存器列表中的寄存器的內(nèi)容可能被被調(diào)用的子程序破壞,即這些寄存器是供被調(diào)用的子程序作為工作寄存器。內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編器與armasm匯編器的差異內(nèi)嵌匯編器不支持通過(guò)“.”指示符或PC獲取當(dāng)前指令地址不支持“LDRRn,=expr”偽指令,而使用“MOVRn,expr”指令向寄存器賦值;不支持標(biāo)號(hào)表達(dá)式;不支持ADR和ADRL偽指令;不支持BX指令;不能向PC賦值使用0x前綴代替“&”,表示十六進(jìn)制數(shù)當(dāng)使用8位移位常數(shù)導(dǎo)致CPSR的ALU標(biāo)志更新時(shí),N、Z、C和V標(biāo)志中的C不具有真實(shí)意義內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(1)必須小心使用物理寄存器如R0~R3、PC、LR和CPSR中的N、Z、C和V標(biāo)志位,因?yàn)橛?jì)算匯編代碼中的C表達(dá)式時(shí),可能會(huì)使用這些物理寄存器,并會(huì)修改N、Z、C和V標(biāo)志位。例如:__asm {MOVvar,x ADDy,var,x/y }

計(jì)算x/y時(shí)R0會(huì)被修改。內(nèi)嵌匯編器探測(cè)到隱含的寄存器沖突就會(huì)報(bào)錯(cuò)。內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(2)不要使用寄存器代替變量例如:

intbad_f(intx)//x存放在R0中

{__asm {ADDR0,R0,#1//發(fā)生寄存器沖突,實(shí)際上x的值沒(méi)有變化

} return(x);

}

盡管根據(jù)編譯器的編譯規(guī)則似乎可以確定R0對(duì)應(yīng)x,但這樣的代碼會(huì)使內(nèi)嵌匯編器認(rèn)為發(fā)生了寄存器沖突。內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(3)LDM和STM指令的寄存器列表中只允許使用物理寄存器內(nèi)嵌匯編可以修改處理器模式、協(xié)處理器模式以及FP、SL、SB等APCS寄存器。但是編譯器在編譯時(shí)并不了解這些變化,因此必須保證在執(zhí)行C代碼前恢復(fù)相應(yīng)被修改的處理器模式。內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言-----------內(nèi)嵌匯編注意事項(xiàng)(4)匯編語(yǔ)言中的“,”號(hào)作為操作數(shù)分隔符。如果有C表達(dá)式作為操作數(shù),若表達(dá)式中包含有“,”,則必須使用符號(hào)“(”和“)”將其歸約為一個(gè)匯編操作數(shù)。例如:__asm{ADDx,y,(f(),z)//“f(),z”為一個(gè)帶有“,”的C表達(dá)式

}內(nèi)嵌匯編

如何在C語(yǔ)言內(nèi)嵌匯編語(yǔ)言內(nèi)嵌匯編允許使用一些不能由編譯器自動(dòng)生成的指令:MSR/MRS新的指令協(xié)處理器指令通常在關(guān)聯(lián)的內(nèi)嵌函數(shù)中使用使用C變量代替寄存器不是一個(gè)真正的匯編文件通過(guò)優(yōu)化器實(shí)現(xiàn)ADSFAQ入口“UsingtheInlineAssembler”#defineQ_Flag0x08000000//Bit27__inlinevoidClear_Q_flag(void){inttemp; __asm {

MRStemp,CPSR BICtemp,temp,#Q_Flag MSRCPSR_f,temp }}__inlineintmult16(shorta,

shortb,intc){

inttemp; __asm {

SMLABBtemp,a,b,c } returntemp;}第三節(jié) 局部和全局?jǐn)?shù)據(jù)討論

變量類型全局和靜態(tài)變量保留在RAM里需使用load/store訪問(wèn)外部存儲(chǔ)器局部變量通常放在寄存器中,用來(lái)快速且高效的處理如果編譯器的寄存器分配算法認(rèn)為超過(guò)現(xiàn)有的寄存器數(shù)量,將把變量壓入棧中對(duì)局部變量,用word-sized(int)代替halfword和byte:為了確保不受其他條件的影響,可特別指定使用32-bit寄存器變量intwordsize(inta) wordsize{ 0x000000:MOVr0,r0,LSL#1return(a*2); 0x000004:MOVpc,lr} shorthalfsize(shortb) halfsize{ 0x000008:MOVr0,r0,LSL#17return(b*2); 0x00000c:MOVr0,r0,LSR#16} 0x000010:MOVpc,lr

charbytesize(charc) bytesize{ 0x000014:MOVr0,r0,LSL#25return(c*2); 0x000018:MOVr0,r0,LSR#24} 0x00001c:MOVpc,lr

變量類型堆棧的用法C/C++代碼的堆棧使用,堆棧用來(lái)保留:子程序的返回地址‘溢出’的局部變量局部數(shù)組和結(jié)構(gòu)體注意:函數(shù)越小越好(更少的變量,更少的‘溢出’);避免使用大的局部結(jié)構(gòu)體或數(shù)組(使用malloc/free代替)避免遞歸全局?jǐn)?shù)據(jù)布局charone;shorttwo;charthree;intfour;charshortintchare.g.聲明的數(shù)據(jù)Declaredalignment12bytes(4bytesofpadding)Optimalalignment8bytes(Zerobytesofpadding)ADS將自動(dòng)用此風(fēng)格排序shortcharcharint全局?jǐn)?shù)據(jù)保存在存儲(chǔ)器里,不是寄存器需要load/store指令來(lái)訪問(wèn)用物理尺寸的邊界對(duì)齊ADS會(huì)優(yōu)化在一個(gè)模塊里的全局?jǐn)?shù)據(jù)的布局用-Ono_data_reorder將關(guān)閉排序不對(duì)齊訪問(wèn)ARM硬件需要在自然尺寸的邊界訪問(wèn)內(nèi)存Word訪問(wèn)在word尺寸Halfword訪問(wèn)在halfword尺寸Byte訪問(wèn)在byte尺寸不對(duì)齊訪問(wèn)遺留代碼特定協(xié)議 需要必須告訴編譯器,讓它產(chǎn)生適當(dāng)?shù)闹噶钚蛄惺褂胈_packed

屬性可能導(dǎo)致多字節(jié)訪問(wèn)代替單字節(jié)訪問(wèn)用LDM指令的結(jié)果有2字,轉(zhuǎn)變?yōu)樯蓡巫植粚?duì)齊數(shù)據(jù)的訪問(wèn)所產(chǎn)生的意外的結(jié)果取決于指令的使用將是不可預(yù)知的結(jié)構(gòu)的壓縮在結(jié)構(gòu)里定義壓縮的元素代替結(jié)構(gòu)的壓縮將幫助減小訪問(wèn)輸出的結(jié)構(gòu)的開銷__packedstructmystruct{intaligned_i;shortaligned_s;intunaligned_i;};externstructmystructS;shortintU_intU_intstructmystruct{intaligned_i;shortaligned_s;__packedintunaligned_i;};externstructmystructS;PREFER... _packed限定的數(shù)據(jù)為1字節(jié)對(duì)齊不實(shí)現(xiàn)字節(jié)對(duì)齊調(diào)整很高的訪問(wèn)代價(jià),不會(huì)節(jié)省存儲(chǔ)空間優(yōu)化的指針基地址externinta;externintb;voidfoo(intx,inty)

{

a=x;

b=y;}baLDRr2,[pc,#12]STRr0,[r2,#0]LDRr3,[pc,#8]STRr1,

溫馨提示

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

評(píng)論

0/150

提交評(píng)論