ARM匯編語言程序設計_第1頁
ARM匯編語言程序設計_第2頁
ARM匯編語言程序設計_第3頁
ARM匯編語言程序設計_第4頁
ARM匯編語言程序設計_第5頁
已閱讀5頁,還剩27頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

ARM匯編語言程序設計嵌入式系統底層編程核心技術·從體系結構到程序實戰Contents課程目錄ARM匯編語言程序設計——從體系結構到混合編程的系統學習路徑01ARM體系結構基礎02ARM尋址方式詳解03ARM指令系統04匯編語言偽指令與程序格式05ARM匯編程序設計方法06匯編與C語言混合編程CHAPTER01ARM體系結構基礎從RISC架構理念到寄存器組織,建立底層硬件認知框架ARCHITECTUREARM處理器概述與架構特點ARM基于RISC精簡指令集架構,以低功耗、高代碼執行效率為核心優勢,已成為移動計算與嵌入式系統領域事實上的行業標準架構。01RISC架構設計:采用精簡指令集,大多數指令單周期執行,指令長度固定為32位,硬件解碼簡單高效02Load/Store體系:運算指令只操作寄存器,數據訪存通過獨立的LDR/STR指令完成,實現計算與訪存分離03低功耗優勢:相同性能下功耗遠低于CISC架構,使其成為智能手機、IoT設備等電池供電場景的首選方案04廣泛應用生態:覆蓋Cortex-M、Cortex-R、Cortex-A三大產品線,全球出貨量超2000億顆ARMCortex系列處理器芯片PROCESSORMODESARM處理器七種工作模式ARM處理器設計了7種工作模式以實現權限分級和異常隔離:用戶模式提供最低權限的應用運行環境,其余6種特權模式分別服務于操作系統內核、中斷響應、異常處理等不同場景,通過模式切換保障系統安全與穩定性。用戶與系統模式USER用戶模式:普通應用程序運行的默認模式,無法直接訪問系統資源和特權指令,保障系統安全SYSTEM系統模式:運行操作系統特權任務,與用戶模式共享寄存器組但擁有更高權限中斷與異常模式IRQIRQ模式:響應普通中斷請求時自動切換,擁有獨立的R13_IRQ和R14_IRQ寄存器以保護中斷現場FIQFIQ模式:響應快速中斷請求,擁有R8-R14共7個獨立寄存器,最大限度減少上下文切換開銷SVC管理模式:處理器復位或執行SWI指令時進入,是操作系統內核最常見的運行模式錯誤處理模式ABORT中止模式:數據訪問或指令預取發生異常時進入,用于內存管理和虛擬內存實現UNDEFINED未定義模式:執行處理器無法識別的指令時進入,可用于軟件仿真擴展指令集Chapter06·ARMArchitectureARM寄存器組織與分組機制ARM采用寄存器分組(BankedRegister)機制,共37個物理寄存器在不同工作模式下呈現不同的邏輯視圖。這種設計使異常和中斷發生時無需軟件保存現場即可快速切換,是ARM高效異常響應的硬件基礎。GeneralPurposeR0–R12所有模式共享,用于數據運算、參數傳遞和臨時存儲13個StackPointerR13(SP)每種模式獨立實例,指向棧頂,各模式堆棧互不干擾BankedLinkRegisterR14(LR)保存子程序或異常返回地址,特權模式獨立副本,支持中斷嵌套BankedProgramCounterR15(PC)所有模式共享,指向當前執行指令地址4B/2BStatusRegistersCPSR/SPSRCPSR保存條件標志與中斷禁止位;SPSR自動保存用于異?;謴蚇ZCVARMProcessor·StatusRegisterCPSR狀態寄存器詳解CPSR(當前程序狀態寄存器)是ARM處理器的控制中樞,32位寄存器分為條件標志、中斷控制、處理器狀態和模式編碼四個功能區,直接決定指令的條件執行、中斷響應行為和處理器運行模式。條件標志位Bit31–28N運算結果最高位為1時置位,用于有符號數大小比較Z運算結果為0時置位,CMP指令通過此標志判斷兩數是否相等C加法產生進位或減法產生借位時置位,也用于移位操作V有符號運算結果超出32位表示范圍時置位控制位與模式編碼Bit7–0I/F中斷禁止位:I=1禁止IRQ中斷,F=1禁止FIQ中斷,操作系統內核通過此位實現臨界區保護T狀態位:T=0為ARM狀態(32位指令),T=1為Thumb狀態(16位指令),影響指令解碼寬度M[4:0]模式編碼:5位編碼決定處理器模式,如10000=User、10011=SVC、10001=FIQCHAPTER02ARM尋址方式詳解掌握九種尋址方式,理解操作數的靈活獲取機制尋址方式基本尋址方式:立即、寄存器與移位ARM的三種基本尋址方式構成了指令操作數獲取的基礎:立即尋址將常量直接嵌入指令編碼,寄存器尋址從CPU內部寄存器取值,而ARM獨有的寄存器移位尋址在數據傳輸的同時完成移位運算,體現了RISC架構"一條指令多做功"的設計哲學。立即尋址操作數作為指令的一部分直接編碼,如MOVR0,#0xFF00。ARM采用8位立即數循環右移偶數位的方式擴展可表示范圍,這種編碼方式使得32位指令能夠表示大量常用常量值。MOVR0,#0xFF00寄存器尋址操作數來自CPU內部寄存器,如ADDR0,R1,R2。所有運算操作均在寄存器間完成,無需訪問內存,是訪問速度最快的尋址方式,也是RISC架構的核心特征。R0←R1+R2寄存器移位尋址源寄存器值先經過移位再參與運算,如ADDR0,R1,R2,LSL#3。支持LSL邏輯左移、LSR邏輯右移、ASR算術右移、ROR循環右移四種移位方式。R2LSL#3移位尋址優勢將移位操作與算術運算合并為一條指令執行,顯著減少指令條數,提高代碼密度。更重要的是,這種融合操作不增加額外的執行周期,在單周期內完成。1Cycle/1Instr.MemoryAddressing存儲器尋址方式ARM通過基址偏移組合、前后變址自動索引及多寄存器批量傳輸,實現高效靈活的內存訪問與塊數據搬運?;放c變址尋址基址尋址:有效地址=基址寄存器+偏移量,如LDRR0,[R1,#8]從R1+8地址加載數據,偏移范圍±4095字節前變址尋址:先計算偏移地址再訪存并寫回基址,如LDRR0,[R1,#4]!,常用于數組順序遍歷后變址尋址:先用基址訪存再更新基址,如LDRR0,[R1],#4,適用于循環中逐個處理數據批量與特殊尋址多寄存器尋址:LDM/STM一條指令傳輸最多16個寄存器,如STMDBSP!,{R0-R7}將8個寄存器壓入堆棧堆棧尋址:ARM支持滿遞減(FD)、滿遞增(FA)、空遞減(ED)、空遞增(EA)四種堆棧類型,C語言標準采用滿遞減相對尋址:以PC為基址加偏移,如ADRR0,label實現位置無關跳轉,常用于分支和子程序調用CHAPTER03ARM指令系統系統掌握數據處理、訪存與控制流指令,構建底層編程能力DATATRANSFER數據傳送指令ARM數據傳送指令分為寄存器間傳送和存儲器訪存兩大類。作為Load/Store架構,ARM所有算術邏輯運算只能在寄存器間進行,訪存必須通過專用傳送指令完成。寄存器傳送MOV直接復制到目的寄存器;MVN按位取反后傳送,如MVNR0,#0得到0xFFFFFFFFMOV·MVN加載指令從指定內存地址讀取32位數據到寄存器,支持基址+偏移、前變址、后變址等多種尋址方式LDR存儲指令將寄存器中32位數據寫入指定內存地址,語法與LDR對稱,如STRR5,[R6,#12]STR批量傳送一條指令同時加載或存儲多個寄存器,如LDMIAR7!,{R8-R10}連續加載3個字并自動更新基址LDM·STM半字與字節LDRB/STRB操作8位字節,LDRH/STRH操作16位半字,LDRSB/LDRSH支持符號擴展加載B·H·SB·SHINSTRUCTIONSET算術運算指令ARM算術運算指令覆蓋加減乘及多精度運算場景,通過S后綴統一更新條件標志位,配合CMP比較指令為條件分支提供判斷依據。01ADD/SUB

加減法:支持三個操作數格式(如ADDR0,R1,R2),第二個操作數可使用移位形式,實現加法與移位合并02ADC/SBC

帶進位運算:ADC在加法基礎上加上C標志位,SBC減去C標志位反碼,用于實現64位+多精度運算03MUL/MLA

乘法運算:MUL計算Rm×Rs的低32位結果,MLA在乘法基礎上加累加值(R0=R1×R2+R3)04RSB

反向減法:用第二操作數減去第一操作數,RSBR0,R1,#0等價于R0=0?R1,高效實現取負操作05CMP

比較指令:執行Rn?operand2但不保存結果,僅更新N/Z/C/V標志位,是條件分支判斷的核心指令Logical&Shift邏輯運算與移位指令ARM邏輯運算指令提供精確位級操控,移位操作既可獨立使用也可嵌入數據處理指令,是靈活性的典型體現。BitwiseAND位與提取特定位或清除無關位,常用于掩碼操作。例如ANDR0,R0,#0xFF提取寄存器最低字節數據,實現字節級數據隔離。掩碼提取0xFFSetBitsORR位或將指定位置1,用于標志位設置或位組合。例如ORRR0,R0,#(1<<5)將第5位置為高電平,快速配置控制寄存器。置位操作BIT5ToggleEOR異或翻轉指定位,相同為0相異為1。經典應用:不借助臨時變量交換兩數數值,通過三次異或操作完成數據互換。無暫存交換×3ClearBIC位清除將指定位清零,實現按位清除功能。例如BICR0,R0,#0x0F清除最低4位,常用于內存地址對齊和位字段清零。清零對齊對齊Shift四種移位LSL左移補0、LSR右移補0、ASR補符號位、ROR循環右移。移位操作可嵌入數據處理指令的第二操作數,提升指令效率。嵌入操作×4ProgramControlFlow條件執行與分支控制指令ARM獨有的條件執行機制允許幾乎所有指令根據CPSR標志位有條件地執行,配合豐富的條件碼和分支指令,在不增加分支開銷的前提下實現復雜的程序控制流,是ARM代碼高效執行的關鍵設計。條件執行機制0115種條件碼全覆蓋EQ、NE、GT、LT、GE、LE等,滿足等于、不等于、大于、小于等所有比較場景02避免流水線沖刷將簡單if-else轉化為條件指令而非分支跳轉,消除分支預測失敗帶來的性能損失03典型應用模式CMPR0,#0后接MOVEQ/MOVNE,無需分支即可實現零值判斷與符號處理15ConditionCodes分支指令01B無條件跳轉偏移范圍±32MB,適用于循環結構、條件分支的目標地址跳轉,編碼緊湊高效02BL帶鏈接跳轉返回地址自動保存到LR(R14),子程序調用的標準指令,支持嵌套調用與遞歸03BX分支交換根據目標地址最低位自動切換ARM/Thumb狀態,支持函數指針與動態庫調用B·BL·BXMemoryAccessArchitectureLoad/Store指令與內存訪問作為Load/Store架構的核心,ARM的LDR/STR系列指令是CPU與內存交互的唯一通道。通過字/半字/字節三級粒度和符號擴展選項,滿足不同數據類型的訪存需求。三級數據粒度LDR/STR操作32位字,LDRH/STRH操作16位半字,LDRB/STRB操作8位字節,覆蓋所有常見數據類型32/16/8bit符號擴展加載LDRSB加載字節并符號擴展至32位,LDRSH加載半字并符號擴展,用于處理有符號小數據類型LDRSB/LDRSH內存對齊要求ARM狀態要求字訪問4字節對齊、半字2字節對齊,未對齊訪問可能導致DataAbort異常4B/2BAlign字節序模式默認小端序,低字節存低地址,部分網絡協議需要大端序,可通過SETEND指令動態切換Little-EndianSYSTEMPROGRAMMING堆棧操作與狀態寄存器訪問堆棧操作(STM/LDM配合SP)和狀態寄存器訪問(MRS/MSR)是ARM系統級編程的兩大支柱:前者支撐函數調用約定和中斷現場保護,后者實現處理器模式切換和中斷控制,兩者共同構成操作系統內核和Bootloader的編程基礎。01STACKFD滿遞減堆棧(FD)壓棧STMDBSP!先遞減SP再存儲,出棧LDMIASP!先加載再遞增SP,與C語言ABI一致02CONTEXTSAVE現場保護與恢復中斷入口用STMFD保存工作寄存器和LR,返回前用LDMFD恢復,確保被中斷程序不受影響03READCPSRMRS讀取狀態寄存器MRSR0,CPSR將當前程序狀態讀入通用寄存器,用于判斷當前模式和條件標志狀態04WRITECPSRMSR寫入狀態寄存器MSRCPSR_c,#0xD3切換管理模式并禁止IRQ,是操作系統啟動和中斷控制的核心操作CHAPTER04匯編語言偽指令與程序格式掌握段定義、數據分配與程序結構規范,編寫規范的匯編源程序ASSEMBLYDIRECTIVESARM匯編偽指令體系ARM匯編偽指令是控制匯編器行為的編譯時指令,不生成機器碼但定義程序結構。段定義、入口標記、數據分配和符號定義等偽指令共同構成匯編程序的骨架。段定義與控制偽指令01AREA段定義:劃分代碼段(CODE,READONLY)和數據段(DATA,READWRITE),鏈接器按段名合并目標文件02ENTRY入口標記:指定程序執行的起始地址,一個項目只能有一個ENTRY,調試器從此處開始運行03CODE32/CODE16:聲明后續指令為ARM(32位)或Thumb(16位)編碼,影響匯編器的指令解碼方式04END文件結束:標記源文件末尾,匯編器忽略此后的所有內容數據分配與符號定義01DCD/DCW/DCB:分別分配32位字、16位半字、8位字節的存儲空間并可初始化,如xDCD-25定義32位有符號變量02EQU常量定義:為數值或表達式定義符號名,如numEQU29,提高代碼可讀性和可維護性03LTORG文字池:聲明常量池位置,LDRR0,=large_const等大立即數會被匯編器自動放入此處04SPACE/MAP:SPACE分配連續存儲空間,MAP配合FIELD定義結構化數據布局,用于復雜數據組織ARMAssembly完整ARM匯編程序結構示例一個規范的ARM匯編程序由代碼段和數據段組成:代碼段包含AREA聲明、ENTRY入口、CODE32指令聲明、業務邏輯指令和標準退出序列;數據段獨立定義變量存儲空間。01代碼段聲明:AREAARMex,CODE,READONLY定義只讀代碼段,ENTRY標記入口,CODE32指定ARM指令集狀態02業務指令編寫:在標號處編寫核心邏輯,如MOV加載立即數、ADD/SUB執行運算、B/BL實現控制流跳轉03標準退出序列:MOVR0,#0x18+LDRR1,=0x20026+SWI0x123456三指令組合,用于ADS/RVDS調試環境正常退出04數據段定義:AREAData,DATA,READWRITE聲明可讀寫數據段,用DCD/DCW/DCB分配并初始化變量存儲空間ARM匯編程序基本結構模板程序段落關鍵偽指令/指令作用說明代碼段頭AREAname,CODE,READONLY定義只讀代碼段,鏈接器按段名歸類入口聲明ENTRY標記程序執行起始地址指令聲明CODE32/CODE16指定后續指令為ARM或Thumb編碼業務邏輯標號+MOV/ADD/LDR等編寫核心運算和控制流指令退出序列MOVR0,#0x18+SWI通知調試環境程序正常結束數據段AREAData,DATA,READWRITE定義可讀寫數據段,分配變量空間文件結束END標記源文件結尾ARM匯編程序由代碼段和數據段組成,通過AREA、ENTRY等偽指令組織程序結構Chapter05ARM匯編程序設計方法從順序到分支、循環與子程序,掌握底層程序設計的四大結構SEQUENTIALEXECUTION順序程序設計順序程序是ARM匯編最基礎的執行模式,指令按存儲順序逐條執行、PC自動遞增。合理編排指令順序、減少數據依賴和流水線沖突是編寫高效順序程序的關鍵。順序執行機制指令按存儲地址依次取出執行,ARM狀態下PC每次自動加4,無需顯式跳轉即可完成線性計算PC+4典型示例分析MOVR0,#10→MOVR1,#3→ADDR0,R0,R1,三條指令順序完成10+3=13的計算MOV→ADD流水線優化三級流水線(取指-解碼-執行)要求注意數據相關性,避免連續指令間的RAW沖突3-Stage寄存器分配策略合理安排各寄存器用途(如R0作累加器、R1-R3作操作數),避免中間結果被覆蓋R0–R3BranchDesign分支程序設計:符號函數實例分支程序通過CMP比較指令配合條件跳轉實現多路選擇邏輯,每段處理后統一跳轉到出口,是if-else邏輯在匯編層面的標準實現范式。CMP+BranchCMPR2,#0設置條件標志后,BEQ跳轉到相等處理、BGT跳轉到大于處理,未命中則順序執行小于處理Three-wayx>0→MOVR3,#1;x=0→MOVR3,#0;x<0→MOVR3,#-1,三條路徑覆蓋符號函數全部分支Fall-through每個分支處理完畢后用Bstop跳轉到公共出口,防止代碼穿透到下一個分支Store&Exitstop標號處用STRR3,[R1]將結果寫入y變量,隨后執行標準退出序列符號函數分支程序核心指令序列標號指令功能說明compareCMPR2,#0將x的值與0比較,更新N/Z/C/V標志位BEQZEROx=0時跳轉到ZERO標號處理BGTPLUSx>0時跳轉到PLUS標號處理MOVR3,#-1x<0時(默認路徑),將-1存入R3Bstop跳轉到統一出口ZEROMOVR3,#0x=0,將0存入R3Bstop跳轉到統一出口PLUSMOVR3,#1x>0,將1存入R3stopSTRR3,[R1]將結果寫入y變量符號函數通過CMP+條件跳轉實現三分支選擇,每分支處理后統一跳轉出口ARMASSEMBLY循環程序設計:最大值查找實例ARM循環程序由初始化、循環體、循環控制和出口處理四部分組成。以30個無符號數查找最大值為例,通過計數控制(R2遞減至0)和條件比較(R3與R4逐次對比)實現遍歷查找,是計數控制循環在匯編層面的經典實現。循環結構四要素01初始化:LDRR0,=x設置數據指針,LDRR2,=29設置循環計數,LDRR3,[R0]加載首個數據作為初始最大值02循環體:LDRR4,[R0,#4]!加載下一個數據,CMPR3,R4比較大小,MOVLTR3,R4條件更新最大值03循環控制:SUBSR2,R2,#1遞減計數器并更新標志位,BNEcompare未完成則跳回循環體繼續比較04出口處理:循環結束后STRR3,[R1]將最終最大值寫入目標變量y循環優化技巧01倒序計數優化:計數器從N遞減到0而非從0遞增到N,利用SUBS自動設置Z標志省去額外的CMP指令02地址自增技巧:使用LDRR4,[R0],#4后變址尋址,每次加載后自動將指針前移4字節,減少獨立的地址更新指令03條件執行減少分支:用MOVLTR3,R4替代B+MOV的分支模式,將比較和更新合并為一條條件指令,減少流水線沖刷CHAPTER25子程序設計與調用約定ARM子程序設計遵循ATPCS調用標準:BL指令調用并保存返回地址到LR,R0-R3傳遞前4個參數和返回值,R4-R11由被調用者保存。入口壓棧、出口彈棧的現場保護機制確保子程序調用不會破壞調用者的寄存器狀態。調用與返回BLfunc_name調用子程序,返回地址自動存入LR;末尾MOVPC,LR返回調用點。BL指令自動完成跳轉和保存返回地址兩個操作,是ARM匯編中最常用的子程序調用方式。BL→LR參數傳遞規范R0-R3傳遞前4個參數,超出部分通過堆棧傳遞;返回值統一放入R0。這種寄存器傳參方式比純堆棧傳參效率更高,減少了內存訪問次數。R0—R3現場保護入口STMFDSP!保存寄存器和LR,出口LDMFDSP!恢復并返回。滿遞減堆棧操作配合寫回模式,實現高效的多寄存器保存與恢復。STMFD/LDMFD寄存器使用規則R0-R3和R12為調用者保存,R4-R11為被調用者保存,使用前必須壓棧。被調用者保存寄存器若被修改,必須在返回前恢復原值,保證調用者透明。R4—R11嵌套調用支持每次BL調用存入新LR,入口必須先將LR壓棧,否則嵌套調用丟失返回地址。子程序中再次調用其他子程序時,LR的保存是防止返回鏈斷裂的關鍵。NESTEDLRARMAssembly子程序實戰:數組求和函數數組求和子程序綜合展示了ARM子程序設計的核心技巧:參數傳遞、現場保護、后變址遍歷、倒序計數與現場恢復。主程序調用部分01參數準備:LDRR0,=array加載數組首地址到R0,MOVR1,#10將數組長度放入R102調用與接收:BLsum_array調用子程序,返回后R0中即為求和結果,可繼續后續處理或存儲子程序實現部分01現場保護與初始化:STMFDSP!,{R2-R3,LR}保存工作寄存器和返回地址,MOVR2,#0初始化累加器為002循環累加:loop標號處LDRR3,[R0],#4后變址加載元素并推進指針,ADDR2,R2,R3累加,SUBSR1,#1遞減計數03循環控制與返回:BNEloop未完成則繼續循環,MOVR0,R2將結果放入R0,LDMFDSP!,{R2-R3,PC}恢復并返回CHAPTER06匯編與C語言混合編程掌握內聯匯編與外部匯編調用,實現C語言與ARM匯編的高效協作MixedProgrammingC與匯編混合編程兩種方式C與ARM匯編混合編程有兩種模式:內聯匯編適合在C函數中嵌入少量硬件操作指令,編寫便捷但移植性受限;外部匯編文件適合編寫獨立的匯編函數模塊,結構清晰且可獨立優化,是大型嵌入式項目中混合編程的推薦方式。內聯匯編01在C代碼中使用__asm{}關鍵字嵌入匯編指令,如MOVR0,#10;ADDR0,R0,R102適用場景:少量寄存器操作、CPSR讀寫、特殊指令調用(NOP、WFI)及性能熱點微優化03注意事項:編譯器可能無法優化內聯匯編周圍代碼,GCC與ARMCC語法差異較大,移植性受限外部匯編文件調用01匯編端導出:在.s文件中用EXPORTfunc_name導出函數符號,函數體遵循ATPCS調用約定02C端聲明調用:在.c文件中聲明externintfunc_name(inta,intb),像普通C函數一樣調用03鏈接整合:匯編與C文件分別編譯為.o目標文件,鏈接器根據符號名完成函數調用的地址綁定AAPCS·ARMArchitectureATPCS調用標準與實戰示例ATPCS定義了C與匯編之間的標準調用接口:R0-R3傳參、R0返回、R4-R11被調用者保存、堆棧8字節對齊。遵循此標準可實現C和匯編函數的無縫互調。參數傳遞規則前4個整型參數通過R0-R3傳遞,第5個及以后的參數從右向左依次壓入堆棧,浮點參數使用S0-S15/VFP寄存器傳遞。R0–R3前4個整型參數返回值約定32位結果存R0,64位結果存R0(低32位)+R1(高32位),結構體返回值通過隱式指針參數傳遞。32/64bit單寄存器與雙寄存器堆棧對齊要求AAPCS要求公共接口處堆棧8字節對齊(SP最低3位為0),未對齊可能導致LDRD/STRD指令異常。8ByteSP最低3位為零實戰示例C調用匯編加法函數:C端聲明ex

溫馨提示

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

評論

0/150

提交評論