版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
ARM及Thumb指令集ARM指令小節(jié)目錄1.指令格式2.條件碼3.存儲器訪問指令4.數(shù)據(jù)處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令ARM指令長度概述ARM指令長度指令集可以是以下任一種32bits長
(ARM狀態(tài))16bits長
(Thumb狀態(tài))ARM7TDMI支持3種數(shù)據(jù)類型字節(jié)
(8-bit)半字(16-bit)字(32-bit)字必須被排成4個字節(jié)邊界對齊,半字必須被排列成2個字節(jié)邊界對齊
ARM指令長度概述向后兼容:新版本增加指令,并保持指令向后兼容;Load-store結(jié)構(gòu)*load/store–從存儲器中讀某個值,操作完后再將其放回存儲器中只對存放在寄存器的數(shù)據(jù)進行處理對于存儲器中的數(shù)據(jù),只能使用load/store指令進行存取簡單的ARM程序;文件名:TEST1.S
;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試
AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口
CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù)
MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB
ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回
END ;文件結(jié)束使用“;”進行注釋標號頂格寫實際代碼段聲明文件結(jié)束4.2指令集介紹
ARM指令集——指令格式
ARM是三地址指令格式,指令的基本格式如下:4.2指令集介紹ARM指令集——基本指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>號內(nèi)的項是必須的,{}號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù);指令語法目標寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2例:
ARM指令的基本格式如下:4.2指令集介紹ARM指令集——第2個操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r——常數(shù)表達式;Rm——寄存器方式;Rm,shift——寄存器移位方式;4.2指令集介紹ARM指令集——第2個操作數(shù)#immed_8r——常數(shù)表達式該常數(shù)必須對應8位位圖,即一個8位的常數(shù)通過循環(huán)右移偶數(shù)位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)4.2指令集介紹ARM指令集——第2個操作數(shù)Rm——寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R24.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù)(移位操作不消耗額外的時間),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR#n算術(shù)右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。桶形移位器ALU桶形移位器Rd結(jié)果NRmRn4.2指令集介紹桶形移位器操作助記符說明移位操作結(jié)果Y值LSL邏輯左移xLSLyx<<y#0-31orRsLSR邏輯右移xLSRy(unsigned)x>>y#1-32orRsASR算術(shù)右移xASRy(signed)x>>Y#1-32orRsROR算術(shù)左移xRORy((unsigned)x>>y|(x<<32-y))#1-32orRsRRX擴展的循環(huán)右移xRRXy(cflag<<31)|((unsigned)x>>1)none4.2指令集介紹4.2指令集介紹ARM指令集——第2個操作數(shù)LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C4.2指令集介紹ARM指令集——第2個操作數(shù)Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1<<3SUB R1,R1,R2,LSRR3 ;R1=R1-R2>>R3ARM指令目錄1.指令格式2.條件碼3.存儲器訪問指令4.數(shù)據(jù)處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令
ARM指令的基本格式如下:4.2指令集介紹ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
使用條件碼“cond”可以實現(xiàn)高效的邏輯操作(節(jié)省跳轉(zhuǎn)和條件語句),提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標明條件代碼,將默認為無條件(AL)執(zhí)行。操作碼條件助記符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于
1011LTN!=V有符號數(shù)小于
1100GTZ=0,N=V有符號數(shù)大于
1101LEZ=1,N!=V有符號數(shù)小于或等于
1110AL任何無條件執(zhí)行
(指令默認條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表4.2指令集介紹ARM指令集——條件碼C代碼:If(a>b) a++;Else b++;對應的匯編代碼:CMP R0,R1 ;R0(a)與R1(b)比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤1,則R1=R1+1示例:ARM指令可以通過添加適當?shù)臈l件碼前綴來達到條件執(zhí)行的目的。這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性能。
CMPr3,#0CMPr3,#0
BEQskipADDNEr0,r1,r2
ADDr0,r1,r2
skip默認情況下,數(shù)據(jù)處理指令不影響條件碼標志位,但可以選擇通過添加“S”來影響標志位。CMP不需要增加“S”就可改變相應的標志位。
loop
…
SUBSr1,r1,#1
BNEloop條件執(zhí)行及標志位如果Z標志清零則跳轉(zhuǎn)R1減1,并設(shè)置標志位條件碼不等于(Notequal) 無符號的大于或等于無符號的小于負數(shù)(Minus)等于(Equal)溢出(Overflow)沒溢出無符號的大于無符號的小于或大于正數(shù)或零小于(LessThan)大于(GreaterThan)小于等于總是執(zhí)行(Always)大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1測試的標志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V下表為所有可能的條件碼:注意:AL為默認狀態(tài),不需要單獨指出程序狀態(tài)寄存器條件位:N=
NegativeresultfromALUZ=ZeroresultfromALUC=ALUoperationCarriedoutV=ALUoperationoVerflowedQ位:僅ARM5TE/J架構(gòu)支持指示飽和狀態(tài)J位僅ARM5TE/J架構(gòu)支持J=1:處理器處于Jazelle狀態(tài)中斷禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit僅ARMxT架構(gòu)支持T=0:處理器處于ARM狀態(tài)T=1:處理器處于Thumb狀態(tài)Mode位:處理器模式位2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ條件執(zhí)行示例一系列的指令都使用條件指令
if(a==0)func(1); CMPr0,#0
MOVEQr0,#1
BLEQfunc
置標志位,再使用不同的條件碼
if(a==0)x=0;
if(a>0)x=1; CMPr0,#0
MOVEQr1,#0
MOVGTr1,#1
使用條件比較指令
if(a==4||a==10)x=0; CMPr0,#4
CMPNEr0,#10
MOVEQr1,#04.2指令集介紹ARM指令集——存儲器訪問指令
ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現(xiàn)。ARM7處理器是馮?諾依曼存儲結(jié)構(gòu),RAM存儲空間及I/O映射空間統(tǒng)一編址,除對RAM操作以外,對外圍IO、程序數(shù)據(jù)的訪問均要通過加載/存儲指令進行。存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。助記符說明操作條件碼位置LDRRd,addressing加載字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用戶模式加載字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用戶模式加載無符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加載無符號半字數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加載有符號字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加載有符號半字數(shù)據(jù)
Rd←[addressing],addressing索引
LDR{cond}SHARM存儲器訪問指令——單寄存器加載助記符說明操作條件碼位置STRRd,addressing存儲字數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用戶模式存儲字數(shù)據(jù)[addressing]←Rd,
addressing索引STR{cond}TSTRBTRd,addressing以用戶模式存儲字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存儲半字數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}HARM存儲器訪問指令——單寄存器存儲
LDR/STR指令用于對內(nèi)存變量的訪問、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實現(xiàn)了程序散轉(zhuǎn)。所有單寄存器加載/存儲指令可分為“字和無符號字節(jié)加載存儲指令”和“半字和有符號字節(jié)加載存儲指令。LDR和STR——字和無符號字節(jié)加載/存儲指令
LDR指令用于從內(nèi)存中讀取單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數(shù)據(jù)保存到內(nèi)存。指令格式如下:ARM存儲器訪問指令——單寄存器存儲
LDR{cond}{T} Rd,<地址>;將指定地址上的字數(shù)據(jù)讀入RdSTR{cond}{T} Rd,<地址>;將Rd中的字數(shù)據(jù)存入指定地址
LDR{cond}B{T} Rd,<地址>;將指定地址上的字節(jié)數(shù)據(jù)讀入RdSTR{cond}B{T} Rd,<地址>;將Rd中的字節(jié)數(shù)據(jù)存入指定地址其中,T為可選后綴。若指令有T,那么即使處理器是在特權(quán)模式下,存儲系統(tǒng)也將訪問看成是在用戶模式下進行的。T在用戶模式下無效,不能與前索引偏移一起使用T。ARM存儲器訪問指令——單寄存器存儲LDR和STR——字和無符號字節(jié)加載/存儲指令編碼指令執(zhí)行的條件碼I為0時,偏移量為12位立即數(shù),為1時,偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節(jié)訪問,為0表示字訪問W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(L為0)ARM存儲器訪問指令——單寄存器存儲LDR和STR——字和無符號字節(jié)加載/存儲指令
LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存儲器訪問指令——單寄存器存儲LDR和STR——字和無符號字節(jié)加載/存儲指令
LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個無符號的數(shù)值。這個數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數(shù)值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存儲器訪問指令——單寄存器存儲
從尋址方式的地址計算方法分,加載/存儲指令有以下4種格式:零偏移。 如:LDRRd,[Rn]
前索引偏移。 如:LDRRd,[Rn,#0x04]!程序相對偏移。 如:LDRRd,labe1
后索引偏移。 如:LDRRd,[Rn],#-0x04注意:必須保證字數(shù)據(jù)操作的地址是32位對齊的。LDR和STR——字和無符號字節(jié)加載/存儲指令LDR和STR——半字和有符號字節(jié)加載/存儲指令
這類LDR/STR指令可加載有符號半字或字節(jié),可加載/存儲無符號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節(jié)指令相同。ARM存儲器訪問指令——單寄存器存儲
LDR{cond}SBRd,<地址>;將指定地址上的有符號字節(jié)讀入RdLDR{cond}SHRd,<地址>;將指定地址上的有符號半字讀入RdLDR{cond}HRd,<地址>;將指定地址上的半字數(shù)據(jù)讀入RdSTR{cond}HRd,<地址>;將Rd中的半字數(shù)據(jù)存入指定地址注意:1.有符號位半字/字節(jié)加載是指用符號位加載擴展到32位,無符號半字加載是指用零擴展到32位;2.半字讀寫的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;ARM存儲器訪問指令——單寄存器存儲LDR和STR——半字和有符號字節(jié)加載/存儲指令編碼指令執(zhí)行的條件碼I為0時,偏移量為12位立即數(shù),為1時,偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(L為0)S為1表示有符號訪問,為0表示無符號訪問H為1表示半字訪問,為0表示字節(jié)訪問LDR和STR指令應用示例:1.加載/存儲字和無符號字節(jié)指令LDR R2,[R5] ;將R5指向地址的字數(shù)據(jù)存入R2STR R1,[R0,#0x04] ;將R1的數(shù)據(jù)存儲到R0+0x04地址LDRB R3,[R2],#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2=R2-1STRB R0,[R3,-R8ASR#2];R0->[R3-R8/4],存儲R0的最低有效字節(jié)2.加載/存儲半字和有符號字節(jié)指令LDRSBR1,[R0,R3] ;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1,
;高24位用符號擴展LDRHR6,[R2],#2 ;將R2指向地址的半字數(shù)據(jù)存入R6,高16位用0擴展
;讀出后,R2=R2+2STRHR1,[R0,#2]! ;將R1的半字數(shù)據(jù)保存到R0+2地址,
;只修改低2字節(jié)數(shù)據(jù),然后R0=R0+2ARM存儲器訪問指令——單寄存器存儲練習STRR1,[R2,R5]!LDRR5,[R3,#-0X03]STREQR4[R0,R4,LSLR5]STREQR4[R6],#-0X08LDR
R0,[R2]!,-R6LDRNER4,R5,[R3,R6]LDRR4,STARTLDRR1,[R0]!LDR[SP,#-0X04]STRR1,START;(必須保證START處可以存貯數(shù)據(jù))LDRPC,R5LDRPC,[R5]
半字和字節(jié)命令STRBR5,[SP,R3]LDRBR0,[R2],-R5,LSL,#0X02LDRBPC,[R5]STRBR0,[R15,#-0X02]!LDRHNER3,[R5,R8]LDRHR6,[R15,#-0X20]!STRHR0,[R4,R2,LSL#0X02]STRHR0,[PC,#0X08]有符號半字和有符號字節(jié)命令LDRSHR5,[R3-R6]LDRSBR0,[R4],#0X0FFLSRSHR15,[R0-R6]LSRSBR5,[R4,0X101]LDRNESHR6,[SP,#0X06]!STRSHR6,[R6]T后綴指令LDRTR5,[R6,R7]LDRBTR3,[R7],R0STRBTR0,R2,LSL#0X01STRTR7,[R3,#0X02]!LDRTR5,[R7],R3,LSL#0X040SDRTR5,R6,LSL#0X03LDRTR6,START目標寄存器器和基址寄存器是同一寄存器LDRR4,[R4,R3,LSL#2]LDRR4,[R4,R3,LSL#2]!LDRR4,[R4],R3,LSL#2LDRR4,[R3,R4,LSL#2]!STRR4,[R4,R3,LSL#2]!STRR4,[R4,R3,LSL#2]使用R15時的數(shù)據(jù)傳送LDRR15,[R5]LDRR6,[R15]LDRR7,[R15,R7]!STRR15,[R7,R1]STRR0,[R15]STRR0,[R15,R8]STRR0,[R15,#0X4]!助記符說明操作條件碼位置LDM{mode}Rn{!},reglist多寄存器加載reglist←[Rn...],Rn回寫等LDM{cond}{mode}STM{mode}Rn{!},reglist多寄存器存儲[Rn...]←reglist,Rn回寫等STM{cond}{mode}
ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令可以實現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場保護、數(shù)據(jù)復制、常數(shù)傳遞等。ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}cond:指令執(zhí)行的條件;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結(jié)束后,將最后的地址寫回Rn中;reglist
:表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如{R1,R2,R6-R9},寄存器由小到大排列;^:可選后綴。允許在用戶模式或系統(tǒng)模式下使用。它有以下兩個功能:1)若op是LDM且寄存器列表包含R15時,那么除了正常的多寄存器傳送外,還將SPSR也復制到CPSR中。這用于異常處理返回,僅在異常模式下使用。2)數(shù)據(jù)傳入或傳出的是用戶模式下的寄存器,而不是當前模式的寄存器。ARM存儲器訪問指令——多寄存器存取LDM和STM——多寄存器加載/存儲指令編碼指令執(zhí)行的條件碼S對應于指令中的”^”符號P表示前/后變址U表示加/減W表示回寫寄存器列表Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(L為0)ARM存儲器訪問指令——多寄存器存取多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作進行數(shù)據(jù)復制時,先設(shè)置好源數(shù)據(jù)指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲。進行堆棧操作操作時,要先設(shè)置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現(xiàn)堆棧操作。ARM存儲器訪問指令——多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMIBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHARM存儲器訪問指令——多寄存器存取數(shù)據(jù)塊傳送存儲堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數(shù)據(jù)塊傳送指令進行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數(shù)據(jù)塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。堆棧操作(詳見“4.1尋址方式堆棧尋址”)和數(shù)據(jù)塊傳送指令類似,也有4種模式,它們之間的關(guān)系如下表所示:堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆??煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧4.1ARM處理器尋址方式尋址方式分類——堆棧尋址4.1ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲區(qū)棧頂棧底棧區(qū)SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。4.1ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。4.1ARM處理器尋址方式尋址方式分類——堆棧尋址LDMIAR4,{R0,R1,R2,R3,R5}數(shù)據(jù)塊傳送指令STMFDR13!,{R0,R4-R6,R13}LDMIDR4,{R0,R1,R2,R3,R4,R6 }LDMFDSP!,{R12,R15}LDMFDSP!,{R12,R15}^STMIDR0,{R0-R5}STMIAR1,{R0-R5}助記符說明操作條件碼位置SWPRd,Rm,Rn寄存器和存儲器字數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存儲器字節(jié)數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}BARM存儲器訪問指令——寄存器和存儲器交換指令
SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。使用SWP可實現(xiàn)信號量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]
其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于存儲到存儲器中,若Rm與Rd相同,則為寄存器與存儲器內(nèi)容進行互換;Rn為要進行數(shù)據(jù)交換的存儲器地址,Rn不能與Rd和Rm相同。ARM存儲器訪問指令——寄存器和存儲器交換指令SWP和SWPB——寄存器和存儲器交換指令編碼指令執(zhí)行的條件碼B用于區(qū)別無符號字節(jié)(B為1)或字(B為0)Rm源寄存器Rd目標寄存器Rn為基址寄存器SWP指令應用示例:SWP R1,R1,[R0] ;將R1的內(nèi)容與R0指向的存儲單元的內(nèi)容進行互換SWPB R1,R2,[R0] ;將R0指向的存儲單元低字節(jié)數(shù)據(jù)讀取到R1中
;(高24位清零),并將R2的內(nèi)容寫入到該內(nèi)存單元中
;(最低字節(jié)有效)復習單寄存器數(shù)據(jù)傳送
LDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB 帶符號的byteloadLDRSH 帶符號的halfwordload存儲器系統(tǒng)必須支持所有訪問寬度語法:
LDR{<cond>}{<size>}Rd,<address>STR{<cond>}{<size>}Rd,<address>e.g.LDREQB地址訪問LDR/STR訪問的地址由基址寄存器加上偏移量來產(chǎn)生。針對word和無符號byte的訪問,偏移量可以是:一個無符號12-bit立即數(shù)(如0-4095bytes).
LDRr0,[r1,#8]一個寄存器,或再加上移位(由立即數(shù)指定)
LDRr0,[r1,r2]
LDRr0,[r1,r2,LSL#2]可以是從基址寄存器上加或減去偏移量:
LDRr0,[r1,#-8]
LDRr0,[r1,-r2]
LDRr0,[r1,-r2,LSL#2]對于halfword和帶符號的halfword/byte,偏移量可以是:一個無符號8bit立即數(shù)(如0-255bytes).一個寄存器(不能偏移)。可選擇采用pre-indexed或post-indexed方式尋址0x50x5r10x200基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x200原基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x20c更新
基址寄存器通過
STRr0,[r1,#12]!來自動更新基址寄存器PreorPostIndexed尋址?
Pre-indexed:STRr0,[r1,#12]
Post-indexed:STRr0,[r1],#12LDM/STM指令允許一次傳送1到16個寄存器到/從存儲器中。寄存器傳送順序不能被指定最小數(shù)字的寄存器總是被傳送到/從存儲器的最低地址上。
LDMIA r10,{r0,r1,r4}基址寄存器指定存儲器訪問開始的地址
塊傳送指令針對下列情況很有效:從存儲器中搬運一塊數(shù)據(jù)保存或恢復堆棧中的內(nèi)容如果是慢速存儲器,會影響中斷響應時間塊數(shù)據(jù)傳送r1r4r0r10地址增加LDM/STM操作語法:<LDM|STM>{<cond>}<addressing_mode>Rb{!},<寄存器list>4種尋址操作:
LDMIA/STMIA
IncrementAfter(先操作,后增加)
LDMIB/STMIB
IncrementBefore(先增加,后操作)
LDMDA/STMDA
DecrementAfter(先操作,后遞減)
LDMDB/STMDB
DecrementBefore(先遞減,后操作)IAr1地址增加r4r0r1r4r0r1r4r0r1r4r0r10IBDADBLDMxxr10,{r0,r1,r4}STMxxr10,{r0,r1,r4}基址寄存器(Rb)LDMFDsp!,{r4-r7,pc}SP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020r4100100FFr5FF1234r61234A0BEr7A0BE8034pc8034堆棧r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存儲器頂SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆棧操作通過塊傳送指令來完成:STMFD
(Push) 塊存儲-FullDescendingstack[STMDB]LDMFD
(Pop) 塊裝載-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}在寄存器和存儲器之間,由一次存儲器讀和一次存儲器寫組成的原子操作。完成一個字節(jié)或字的交換。語法:SWP{<cond>}{B}Rd,Rm,[Rn]RmRd321temp存儲器RnSWP4.2指令集介紹ARM指令集——分支指令在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn)。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。ARM分支指令——指令編碼分支指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號立即數(shù)(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標地址寄存器,該寄存器裝載跳轉(zhuǎn)地址助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:B{cond}Label
應用示例:
B WAITA ;跳轉(zhuǎn)到WAITA標號處
B 0x1234 ;跳轉(zhuǎn)到絕對地址0x1234處BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2.程序跳轉(zhuǎn)到目標地址Label繼續(xù)執(zhí)行,當子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行應用示例(調(diào)用子程序):
BL Label 助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。指令格式如下:BX{cond}Rm跳轉(zhuǎn)地址Rm[0]跳轉(zhuǎn)后CPSR標志T位處理器狀態(tài)00ARM11Thumb助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對齊,最低2位地址固定為0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標志T置位,且將目標地址的代碼解釋為Thumb代碼;若Rm的位[0]為0,則Rm的位[1]就不能為1
。指令格式如下:BX{cond}Rm應用示例:
ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到R0指定的地址,
;并根據(jù)R0的最低位來切換處理器狀態(tài)桶型移位器DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(無符號數(shù))乘2除2,并保留符號位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(無符號數(shù))除2位輪換DestinationRRX:RotateRightExtended位輪換,從CF到MSB都參與操作CF寄存器,可選擇是否增加移位操作.移位值可以是:5bit無符號整數(shù)放在另一個寄存器的低字節(jié)用于常數(shù)乘法
立即數(shù)8bit,大小范圍0-255。右移偶數(shù)位允許直接加載32-bit常數(shù)到寄存器中。結(jié)果操作數(shù)1Barrel
Shifter操作數(shù)2ALU桶型移位器:
第二個操作數(shù)沒有任何一條ARM指令可包括一個32bit的立即數(shù)所有的ARM指令都是32bits固定長度數(shù)據(jù)處理指令格式中,第二個操作數(shù)有12位4bit移位值(0-15)乘于2,得到一個范圍在0-30,步長為2的移位值。記住一條準則:“最后8位一定要移動偶數(shù)位”.07118immed_8Shifter
RORrotx2QuickQuiz:
0xe3a004ff
MOVr0,#???立即數(shù)(1)Examples:下列命令中,匯編器把立即數(shù)轉(zhuǎn)換為移位操作:MOVr0,#4096 ;uses0x40ror26ADDr1,r2,#0xFF0000 ;uses0xFFror16也可使用MVN來進行位反轉(zhuǎn):MOVr0,#0xFFFFFFFF ;assemblestoMVNr0,#0立即數(shù)不能使用上述方法產(chǎn)生,否則將導致錯誤。031ror#0range0-0xff000000step0x01000000ror#8range0-0x000000ffstep0x00000001range0-0x000003fcstep0x00000004ror#30000000000000000000000000000000000000000000000000000000000000000000000000立即數(shù)(2)為允許裝載大常數(shù),匯編器提供了一條偽指令:LDRrd,=const它可能匯編成下列指令:MOVorMVN。
或LDR
指令,從數(shù)據(jù)池(Literalpools)讀取常數(shù)。ForexampleLDRr0,=0xFF
=>
MOVr0,#0xFFLDRr0,=0x55555555
=>
LDRr0,[PC,#Imm12]
…
…
DCD0x55555555建議把常數(shù)裝載到寄存器中時一律使用該偽指令。裝載32bit常數(shù)測驗#11.寫一條ARM指令,分別完成下列操作: a)r0=16 b)r0=r1/16 (帶符號的數(shù)字) c)r1=r2*3 d)r0=-r02.下面哪些立即數(shù)是數(shù)據(jù)處理指令中有效的數(shù)據(jù)? a)0x00AB0000b)0x0000FFFFc)0xF000000F d)0x08000012e)0x00001f80f)0xFFFFFFFF3.BIC指令做什么用?4.為什么ARM處理器增加了一條RSB指令?StartStopr0=r1
?r0>r1
?r0=r0-r1r1=r1-r0YesNoYesNo你只需要使用CMP、SUB和B指令。充分使用條件執(zhí)行!大家可以嘗試計算2109和4161的GCD
AREAmyarea,CODE ENTRY MOVr0,#9 MOVr1,#15start ;yourcodeherestop Bstop END測驗#2-GCD新建一個‘ARMExecutableImage’項目新建一個text文件另存為“gcd.s”加入到項目中Build并執(zhí)行乘法語法:MUL{<cond>}{S}Rd,Rm,Rs Rd=Rm*RsMLA{<cond>}{S}Rd,Rm,Rs,Rn Rd=(Rm*Rs)+Rn[U|S]MULL{<cond>}{S} RdLo,RdHi,Rm,Rs RdHi,RdLo:=Rm*Rs[U|S]MLAL{<cond>}{S}RdLo,RdHi,Rm,Rs RdHi,RdLo:=(Rm*Rs)+RdHi,RdLo占用的周期數(shù)基本MUL指令ARM7TDMI上為2-5周期StrongARM/XScale上為1-3周期ARM9E/ARM102xE上為2周期ARM9TDMI比ARM7TDMI多1周期累加再多1周期(不針對9E,盡管結(jié)果延遲多于1周期)對于“l(fā)ong”型數(shù)據(jù),多1周期以上均為一般規(guī)則,確切細節(jié)查看相應手冊。軟件中斷(SWI)產(chǎn)生一個異常陷阱,跳轉(zhuǎn)到SWI硬件向量。SWI處理程序可以檢測SWI號,從而決定采取何種操作。通過SWI機制,運行在用戶模式下的應用程序,可請求操作系統(tǒng)執(zhí)行一系列特權(quán)操作。語法:
SWI{<cond>}<SWInumber>283124270
Cond1111SWInumber(ignoredbyprocessor)23條件域PSR傳送指令MRS和MSR允許傳送CPSR/SPSR中的內(nèi)容到/從一個通用寄存器中。語法:
MRS{<cond>}Rd,<psr>;Rd=<psr>
MSR{<cond>}<psr[_fields]>,Rm;<psr[_fields]>=Rm在這里:<psr>=CPSRorSPSR[_fields]=‘fsxc’的任意組合也允許送一個立即數(shù)到
psr_fields
MSR{<cond>}<psr_fields>,#Immediate用戶模式下,所有位均可以被讀取,但只有條件標志位(_f)可被寫。2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ協(xié)處理器指令ARM體系支持16個協(xié)處理器針對每個協(xié)處理器的指令占用ARM指令集中的固定部分如果相應的協(xié)處理器不存在,將發(fā)生一個未定義指令異常。這有三種協(xié)處理器指令協(xié)處理器數(shù)據(jù)處理指令CDP:初始化協(xié)處理器數(shù)據(jù)處理操作協(xié)處理器寄存器傳送指令MRC:從協(xié)處理器寄存器移到ARM寄存器MCR:從ARM寄存器移到協(xié)處理器寄存器協(xié)處理器存儲器傳送指令LDC:從存儲器裝載到協(xié)處理器寄存器STC:從協(xié)處理器寄存器存儲到存儲器測試#41.寫幾條ARM指令,使能IRQ中斷2.下列ARM指令將做什么? a)
LDRHr0,[r1,#6] b)
LDRr0,=0x9993.在裝載或存儲指令中,“!”表示什么?4.當執(zhí)行SWI指令時,會發(fā)生什么?5.SWP指令的優(yōu)勢是什么?議程
ARM指令集Thumb指令集
v5TE體系結(jié)構(gòu)擴展015310ADDSr2,r2,#1ADDr2,#132-bitARM指令16-bitThumb指令對于由編譯器產(chǎn)生的大部分指令:沒有條件執(zhí)行源、目的寄存器必須相同僅能使用低寄存器常數(shù)大小有限制不能使用在線移位器ThumbThumb是16-bit指令集代碼密度優(yōu)化(總代碼大小約為ARM指令的65%)使用窄總線存儲器時可以大大提高性能。是ARM指令集的一個子集。核存在一個執(zhí)行狀態(tài)–Thumb狀態(tài)ARM和Thumb之間切換使用BX指令使用BranchExchange
指令來完成InterworkingBXRn
;Thumb狀態(tài)下的Bx指令BX<condition>Rn
;ARM狀態(tài)下的Bx指令也可以只是執(zhí)行一個絕對跳轉(zhuǎn),無須狀態(tài)更換。ARM/Thumb交互工作RnBX跳轉(zhuǎn)的地址31013101ARM/Thumb選擇0-ARM狀態(tài)1-Thumb狀態(tài)0寫Thumb匯編程序Thumb不是一個“好”
指令集!最好用編譯器來產(chǎn)生約束并不一致代碼處理通常優(yōu)于ARM指令更多細節(jié),參看:ARM“ArchitectureReferenceManual”ChaptersA6和A7議程
ARM指令集 Thumb指令集v5TE體系結(jié)構(gòu)擴展v5TE結(jié)構(gòu)v5TE體系包括全部的v4TARM和Thumb指令集,還有:更支持interworking同時支持ARM/Thumb狀態(tài)Breakpoint指令(ARM和Thumb)CLZ(CountLeadingZeros)指令擴展協(xié)處理器指令-MCR2等等支持飽和處理封裝的帶符號的半字乘法指令雙字裝載/存儲指令Cache預裝載指令雙字協(xié)處理器傳送指令-MCRR/MRRC你采用的處理器是哪種結(jié)構(gòu)?處理器核 結(jié)構(gòu)體系
7TDMI&9TDMI v4T 9E-Srev1 v5TE 926EJ-S/1026EJ-S v5TEJ 1020E v5TE StrongARM v4 XScaleMicroarchitecture v5TE前導零計數(shù)指令CLZ{cond}Rd,Rm計算寄存器中的值有多少個前導0源寄存器從最高位開始計算。1個周期完成 (ARM9E-S/ARM102x)如果沒有任何一位被置位,結(jié)果是32;如果bit31被置位,結(jié)果為0。Rm左移Rd位即可標準化Rm帶符號的標準化需要額外的1個周期0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1EORR1,R0,R0,LSL#1CLZR1,R1MOVR0,R0,LSLR1擴展協(xié)處理器指令CDP2,LDC2,STC2,MCR2,MRC2新格式的標準協(xié)處理器指令為協(xié)處理器設(shè)計人員提供了附加的操作碼空間。同樣是無條件執(zhí)行的TRmRsBTBWoption16161616321632/6432/64Rd(RdHi,RdLo)Rn(RdHi,RdLo)新的有符號乘法操作SMULxy{cond}Rd,Rm,RsSMULWy{cond}Rd,Rm,RsSMLAxy{cond}Rd,Rm,Rs,RnSMLAWy{cond}Rd,Rm,Rs,RnSMLALxy{cond}RdLo,RdHi,Rm,RsSMLA
指令影響標志位Qx,y用于選擇寄存器的高一半和低一半W
用于選擇48位結(jié)果的高32位
不影響NZCV(沒有‘S’位)1)寫一段匯編代碼‘qtest’測試標志位Q并清零。源文件模板在文件‘a(chǎn)sm\dsp.s’中給出返回根據(jù)標志位Q的值2)寫一段匯編主程序,累加16位有符號數(shù)組的所有元素的平方。inttotal=0;for(n=0;n<64;n++)total+=x[n]*x[n];取值指令
使用LDRH平方累加指令使用SMLABB3)是否存在互鎖?4)使用AXD檢查Q標志位(通過改變cpsr模式為E-PSR)5)在循環(huán)后面增加一個
BL
調(diào)用qtest并檢查返回值6)專家題:
改用LDR,每次取兩個值7)專家題:
修改代碼,使用64位累加器測試#5-DSPpowercalculationxx[0]x[1]x[2]x[3]x[4]x[63]r0x[62]x[5]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025青島市機動車買賣合同范本
- 2025國際勞務派遣合同
- 2025委托貸款合同2
- 2024域名服務合同-企業(yè)域名注冊與域名資產(chǎn)評估服務協(xié)議3篇
- 電子課程設(shè)計 計數(shù)器
- 學校實驗室管理制度80
- 環(huán)保設(shè)備投標課程設(shè)計
- 智能鎖的課程設(shè)計
- 2024小區(qū)物業(yè)社區(qū)老年服務設(shè)施建設(shè)與運營合同協(xié)議3篇
- 幼小銜接組詞課程設(shè)計
- 市場營銷試題(含參考答案)
- 電氣工程及其自動化職業(yè)規(guī)劃課件
- 2023年新高考(新課標)全國2卷數(shù)學試題真題(含答案解析)
- 上??茖W六年級上冊知識點
- 2024年中煤平朔集團有限公司招聘筆試參考題庫含答案解析
- 鐵路橋梁墩身施工專項方案
- 燃氣-蒸汽聯(lián)合循環(huán)機組詳介
- 初中信息技術(shù)課程教學設(shè)計案例
- 計價格[1999]1283號_建設(shè)項目前期工作咨詢收費暫行規(guī)定
- 展廳展館中控系統(tǒng)解決方案
- 兒童福利個人工作總結(jié)報告
評論
0/150
提交評論