




下載本文檔
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
ARM及Thumb指令集ARM指令小節(jié)目錄1.指令格式2.條件碼3.存儲(chǔ)器訪問(wèn)指令4.數(shù)據(jù)處理指令5.乘法指令6.ARM分支指令7.雜項(xiàng)指令8.偽指令A(yù)RM指令長(zhǎng)度概述ARM指令長(zhǎng)度指令集可以是以下任一種32bits長(zhǎng)
(ARM狀態(tài))16bits長(zhǎng)
(Thumb狀態(tài))ARM7TDMI支持3種數(shù)據(jù)類(lèi)型字節(jié)
(8-bit)半字(16-bit)字(32-bit)字必須被排成4個(gè)字節(jié)邊界對(duì)齊,半字必須被排列成2個(gè)字節(jié)邊界對(duì)齊
ARM指令長(zhǎng)度概述向后兼容:新版本增加指令,并保持指令向后兼容;Load-store結(jié)構(gòu)*load/store–從存儲(chǔ)器中讀某個(gè)值,操作完后再將其放回存儲(chǔ)器中只對(duì)存放在寄存器的數(shù)據(jù)進(jìn)行處理對(duì)于存儲(chǔ)器中的數(shù)據(jù),只能使用load/store指令進(jìn)行存取簡(jiǎn)單的ARM程序;文件名:TEST1.S
;功能:實(shí)現(xiàn)兩個(gè)寄存器相加;說(shuō)明:使用ARMulate軟件仿真調(diào)試
AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識(shí)程序入口
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é)束使用“;”進(jìn)行注釋標(biāo)號(hào)頂格寫(xiě)實(shí)際代碼段聲明文件結(jié)束4.2指令集介紹
ARM指令集——指令格式
ARM是三地址指令格式,指令的基本格式如下:4.2指令集介紹ARM指令集——基本指令格式<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
其中<>號(hào)內(nèi)的項(xiàng)是必須的,{}號(hào)內(nèi)的項(xiàng)是可選的。各項(xiàng)的說(shuō)明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個(gè)操作數(shù)的寄存器;operand2:第2個(gè)操作數(shù);指令語(yǔ)法目標(biāo)寄存器(Rd)源寄存器1(Rn)源寄存器2(Rm)ADDr3,r1,r2r3r1r2例:
ARM指令的基本格式如下:4.2指令集介紹ARM指令集——第2個(gè)操作數(shù)<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
靈活的使用第2個(gè)操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r——常數(shù)表達(dá)式;Rm——寄存器方式;Rm,shift——寄存器移位方式;4.2指令集介紹ARM指令集——第2個(gè)操作數(shù)#immed_8r——常數(shù)表達(dá)式該常數(shù)必須對(duì)應(yīng)8位位圖,即一個(gè)8位的常數(shù)通過(guò)循環(huán)右移偶數(shù)位得到。循環(huán)右移10位0x12000100100x00000000000x00000000000x00000000000x00000000000x00000000000x80100000000x04000001008位常數(shù)4.2指令集介紹ARM指令集——第2個(gè)操作數(shù)Rm——寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R24.2指令集介紹ARM指令集——第2個(gè)操作數(shù)Rm,shift——寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù)(移位操作不消耗額外的時(shí)間),但Rm值保持不變,移位方法如下:操作碼說(shuō)明操作碼說(shuō)明ASR#n算術(shù)右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴(kuò)展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類(lèi)型,Rs為偏移量寄存器,低8位有效。桶形移位器ALU桶形移位器Rd結(jié)果NRmRn4.2指令集介紹桶形移位器操作助記符說(shuō)明移位操作結(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擴(kuò)展的循環(huán)右移xRRXy(cflag<<31)|((unsigned)x>>1)none4.2指令集介紹4.2指令集介紹ARM指令集——第2個(gè)操作數(shù)LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C4.2指令集介紹ARM指令集——第2個(gè)操作數(shù)Rm,shift——寄存器移位方式例如:ADD R1,R1,R1,LSL#3 ;R1=R1+R1<<3SUB R1,R1,R2,LSRR3 ;R1=R1-R2>>R3ARM指令目錄1.指令格式2.條件碼3.存儲(chǔ)器訪問(wèn)指令4.數(shù)據(jù)處理指令5.乘法指令6.ARM分支指令7.雜項(xiàng)指令8.偽指令
ARM指令的基本格式如下:4.2指令集介紹ARM指令集——條件碼<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}
使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作(節(jié)省跳轉(zhuǎn)和條件語(yǔ)句),提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無(wú)條件(AL)執(zhí)行。操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無(wú)符號(hào)數(shù)大于或等于0011CC/LOC=0無(wú)符號(hào)數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒(méi)有溢出1000HIC=1,Z=0無(wú)符號(hào)數(shù)大于1001LSC=0,Z=1無(wú)符號(hào)數(shù)小于或等于1010GEN=V有符號(hào)數(shù)大于或等于
1011LTN!=V有符號(hào)數(shù)小于
1100GTZ=0,N=V有符號(hào)數(shù)大于
1101LEZ=1,N!=V有符號(hào)數(shù)小于或等于
1110AL任何無(wú)條件執(zhí)行
(指令默認(rèn)條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表4.2指令集介紹ARM指令集——條件碼C代碼:If(a>b) a++;Else b++;對(duì)應(yīng)的匯編代碼: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指令可以通過(guò)添加適當(dāng)?shù)臈l件碼前綴來(lái)達(dá)到條件執(zhí)行的目的。這樣可以提高代碼密度,減少分支跳轉(zhuǎn)指令數(shù)目,提高性能。
CMPr3,#0CMPr3,#0
BEQskipADDNEr0,r1,r2
ADDr0,r1,r2
skip默認(rèn)情況下,數(shù)據(jù)處理指令不影響條件碼標(biāo)志位,但可以選擇通過(guò)添加“S”來(lái)影響標(biāo)志位。CMP不需要增加“S”就可改變相應(yīng)的標(biāo)志位。
loop
…
SUBSr1,r1,#1
BNEloop條件執(zhí)行及標(biāo)志位如果Z標(biāo)志清零則跳轉(zhuǎn)R1減1,并設(shè)置標(biāo)志位條件碼不等于(Notequal) 無(wú)符號(hào)的大于或等于無(wú)符號(hào)的小于負(fù)數(shù)(Minus)等于(Equal)溢出(Overflow)沒(méi)溢出無(wú)符號(hào)的大于無(wú)符號(hào)的小于或大于正數(shù)或零小于(LessThan)大于(GreaterThan)小于等于總是執(zhí)行(Always)大于等于EQNECS/HSCC/LOPLVSHILSGELTGTLEALMIVCSuffix描述Z=0C=1C=0Z=1測(cè)試的標(biāo)志位N=1N=0V=1V=0C=1&Z=0C=0orZ=1N=VN!=VZ=0&N=VZ=1orN=!V下表為所有可能的條件碼:注意:AL為默認(rèn)狀態(tài),不需要單獨(dú)指出程序狀態(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
置標(biāo)志位,再使用不同的條件碼
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指令集——存儲(chǔ)器訪問(wèn)指令
ARM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問(wèn)只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。ARM7處理器是馮?諾依曼存儲(chǔ)結(jié)構(gòu),RAM存儲(chǔ)空間及I/O映射空間統(tǒng)一編址,除對(duì)RAM操作以外,對(duì)外圍IO、程序數(shù)據(jù)的訪問(wèn)均要通過(guò)加載/存儲(chǔ)指令進(jìn)行。存儲(chǔ)器訪問(wèn)指令分為單寄存器操作指令和多寄存器操作指令。助記符說(shuō)明操作條件碼位置LDRRd,addressing加載字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}LDRBRd,addressing加載無(wú)符號(hào)字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BLDRTRd,addressing以用戶(hù)模式加載字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}TLDRBTRd,addressing以用戶(hù)模式加載無(wú)符號(hào)字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}BTLDRHRd,addressing加載無(wú)符號(hào)半字?jǐn)?shù)據(jù)Rd←[addressing],addressing索引LDR{cond}HLDRSBRd,addressing加載有符號(hào)字節(jié)數(shù)據(jù)Rd←[addressing],addressing索引LDR{cond}SBLDRSHRd,addressing加載有符號(hào)半字?jǐn)?shù)據(jù)
Rd←[addressing],addressing索引
LDR{cond}SHARM存儲(chǔ)器訪問(wèn)指令——單寄存器加載助記符說(shuō)明操作條件碼位置STRRd,addressing存儲(chǔ)字?jǐn)?shù)據(jù)[addressing]←Rd,addressing索引STR{cond}STRBRd,addressing存儲(chǔ)字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BSTRTRd,addressing以用戶(hù)模式存儲(chǔ)字?jǐn)?shù)據(jù)[addressing]←Rd,
addressing索引STR{cond}TSTRBTRd,addressing以用戶(hù)模式存儲(chǔ)字節(jié)數(shù)據(jù)[addressing]←Rd,addressing索引STR{cond}BTSTRHRd,addressing存儲(chǔ)半字?jǐn)?shù)據(jù)[addressing]←Rd,addressing索引STR{cond}HARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)
LDR/STR指令用于對(duì)內(nèi)存變量的訪問(wèn)、內(nèi)存緩沖區(qū)數(shù)據(jù)的訪問(wèn)、查表、外圍部件的控制操作等。若使用LDR指令加載數(shù)據(jù)到PC寄存器,則實(shí)現(xiàn)程序跳轉(zhuǎn)功能,這樣也就實(shí)現(xiàn)了程序散轉(zhuǎn)。所有單寄存器加載/存儲(chǔ)指令可分為“字和無(wú)符號(hào)字節(jié)加載存儲(chǔ)指令”和“半字和有符號(hào)字節(jié)加載存儲(chǔ)指令。LDR和STR——字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令
LDR指令用于從內(nèi)存中讀取單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數(shù)據(jù)保存到內(nèi)存。指令格式如下:ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)
LDR{cond}{T} Rd,<地址>;將指定地址上的字?jǐn)?shù)據(jù)讀入RdSTR{cond}{T} Rd,<地址>;將Rd中的字?jǐn)?shù)據(jù)存入指定地址
LDR{cond}B{T} Rd,<地址>;將指定地址上的字節(jié)數(shù)據(jù)讀入RdSTR{cond}B{T} Rd,<地址>;將Rd中的字節(jié)數(shù)據(jù)存入指定地址其中,T為可選后綴。若指令有T,那么即使處理器是在特權(quán)模式下,存儲(chǔ)系統(tǒng)也將訪問(wèn)看成是在用戶(hù)模式下進(jìn)行的。T在用戶(hù)模式下無(wú)效,不能與前索引偏移一起使用T。ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)LDR和STR——字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令編碼指令執(zhí)行的條件碼I為0時(shí),偏移量為12位立即數(shù),為1時(shí),偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節(jié)訪問(wèn),為0表示字訪問(wèn)W表示回寫(xiě)為指令的尋址方式Rd為源/目標(biāo)寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0)ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)LDR和STR——字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令
LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器;另一部分為一個(gè)地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)LDR和STR——字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令
LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器;另一部分為一個(gè)地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,#0x12]
;R1<-[R0+0x12]寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2]
;
R1<-[R0+R2]
LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2,LSL#2]
;R1<-[R0+R2*4]
ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)
從尋址方式的地址計(jì)算方法分,加載/存儲(chǔ)指令有以下4種格式:零偏移。 如:LDRRd,[Rn]
前索引偏移。 如:LDRRd,[Rn,#0x04]!程序相對(duì)偏移。 如:LDRRd,labe1
后索引偏移。 如:LDRRd,[Rn],#-0x04注意:必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。LDR和STR——字和無(wú)符號(hào)字節(jié)加載/存儲(chǔ)指令LDR和STR——半字和有符號(hào)字節(jié)加載/存儲(chǔ)指令
這類(lèi)LDR/STR指令可加載有符號(hào)半字或字節(jié),可加載/存儲(chǔ)無(wú)符號(hào)半字。偏移量格式、尋址方式與加載/存儲(chǔ)字和無(wú)符號(hào)字節(jié)指令相同。ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)
LDR{cond}SBRd,<地址>;將指定地址上的有符號(hào)字節(jié)讀入RdLDR{cond}SHRd,<地址>;將指定地址上的有符號(hào)半字讀入RdLDR{cond}HRd,<地址>;將指定地址上的半字?jǐn)?shù)據(jù)讀入RdSTR{cond}HRd,<地址>;將Rd中的半字?jǐn)?shù)據(jù)存入指定地址注意:1.有符號(hào)位半字/字節(jié)加載是指用符號(hào)位加載擴(kuò)展到32位,無(wú)符號(hào)半字加載是指用零擴(kuò)展到32位;2.半字讀寫(xiě)的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)LDR和STR——半字和有符號(hào)字節(jié)加載/存儲(chǔ)指令編碼指令執(zhí)行的條件碼I為0時(shí),偏移量為12位立即數(shù),為1時(shí),偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫(xiě)為指令的尋址方式Rd為源/目標(biāo)寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0)S為1表示有符號(hào)訪問(wèn),為0表示無(wú)符號(hào)訪問(wèn)H為1表示半字訪問(wèn),為0表示字節(jié)訪問(wèn)LDR和STR指令應(yīng)用示例:1.加載/存儲(chǔ)字和無(wú)符號(hào)字節(jié)指令LDR R2,[R5] ;將R5指向地址的字?jǐn)?shù)據(jù)存入R2STR R1,[R0,#0x04] ;將R1的數(shù)據(jù)存儲(chǔ)到R0+0x04地址LDRB R3,[R2],#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2=R2-1STRB R0,[R3,-R8ASR#2];R0->[R3-R8/4],存儲(chǔ)R0的最低有效字節(jié)2.加載/存儲(chǔ)半字和有符號(hào)字節(jié)指令LDRSBR1,[R0,R3] ;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1,
;高24位用符號(hào)擴(kuò)展LDRHR6,[R2],#2 ;將R2指向地址的半字?jǐn)?shù)據(jù)存入R6,高16位用0擴(kuò)展
;讀出后,R2=R2+2STRHR1,[R0,#2]! ;將R1的半字?jǐn)?shù)據(jù)保存到R0+2地址,
;只修改低2字節(jié)數(shù)據(jù),然后R0=R0+2ARM存儲(chǔ)器訪問(wèn)指令——單寄存器存儲(chǔ)練習(xí)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]有符號(hào)半字和有符號(hào)字節(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目標(biāo)寄存器器和基址寄存器是同一寄存器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í)的數(shù)據(jù)傳送LDRR15,[R5]LDRR6,[R15]LDRR7,[R15,R7]!STRR15,[R7,R1]STRR0,[R15]STRR0,[R15,R8]STRR0,[R15,#0X4]!助記符說(shuō)明操作條件碼位置LDM{mode}Rn{!},reglist多寄存器加載reglist←[Rn...],Rn回寫(xiě)等LDM{cond}{mode}STM{mode}Rn{!},reglist多寄存器存儲(chǔ)[Rn...]←reglist,Rn回寫(xiě)等STM{cond}{mode}
ARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取多寄存器加載/存儲(chǔ)指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個(gè)寄存器;STM為存儲(chǔ)多個(gè)寄存器。允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。它們主要用于現(xiàn)場(chǎng)保護(hù)、數(shù)據(jù)復(fù)制、常數(shù)傳遞等。ARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取多寄存器加載/存儲(chǔ)指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}cond:指令執(zhí)行的條件;模式:控制地址的增長(zhǎng)方式,一共有8種模式;!:表示在操作結(jié)束后,將最后的地址寫(xiě)回Rn中;reglist
:表示寄存器列表,可以包含多個(gè)寄存器,它們使用“,”隔開(kāi),如{R1,R2,R6-R9},寄存器由小到大排列;^:可選后綴。允許在用戶(hù)模式或系統(tǒng)模式下使用。它有以下兩個(gè)功能:1)若op是LDM且寄存器列表包含R15時(shí),那么除了正常的多寄存器傳送外,還將SPSR也復(fù)制到CPSR中。這用于異常處理返回,僅在異常模式下使用。2)數(shù)據(jù)傳入或傳出的是用戶(hù)模式下的寄存器,而不是當(dāng)前模式的寄存器。ARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取LDM和STM——多寄存器加載/存儲(chǔ)指令編碼指令執(zhí)行的條件碼S對(duì)應(yīng)于指令中的”^”符號(hào)P表示前/后變址U表示加/減W表示回寫(xiě)寄存器列表Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0)ARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取多寄存器加載/存儲(chǔ)指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說(shuō)明模式說(shuō)明IA每次傳送后地址加4FD滿(mǎn)遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿(mǎn)遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進(jìn)行讀取和存儲(chǔ)。進(jìn)行堆棧操作操作時(shí),要先設(shè)置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實(shí)現(xiàn)堆棧操作。ARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取數(shù)據(jù)塊傳送指令操作過(guò)程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMDAR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMIBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}4008H4004H4000H4014H4010H400CHARM存儲(chǔ)器訪問(wèn)指令——多寄存器存取數(shù)據(jù)塊傳送存儲(chǔ)堆棧操作壓棧說(shuō)明數(shù)據(jù)塊傳送加載堆棧操作出棧說(shuō)明STMDASTMED空遞減LDMDALDMFA滿(mǎn)遞減STMIASTMEA空遞增LDMIALDMFD滿(mǎn)遞增STMDBSTMFD滿(mǎn)遞減LDMDBLDMEA空遞減STMIBSTMFA滿(mǎn)遞增LDMIBLDMED空遞增;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進(jìn)行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿(mǎn)、加與減對(duì)應(yīng)的問(wèn)題。堆棧操作(詳見(jiàn)“4.1尋址方式堆棧尋址”)和數(shù)據(jù)塊傳送指令類(lèi)似,也有4種模式,它們之間的關(guān)系如下表所示:堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出”。堆棧尋址是隱含的,它使用一個(gè)專(zhuān)門(mén)的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元即是堆棧的棧頂。存儲(chǔ)器堆棧可分為兩種:向上生長(zhǎng):向高地址方向生長(zhǎng),稱(chēng)為遞增堆棧向下生長(zhǎng):向低地址方向生長(zhǎng),稱(chēng)為遞減堆棧4.1ARM處理器尋址方式尋址方式分類(lèi)——堆棧尋址4.1ARM處理器尋址方式尋址方式分類(lèi)——堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲(chǔ)區(qū)棧頂棧底棧區(qū)SP向下增長(zhǎng)向上增長(zhǎng)0x123456780x12345678堆棧壓棧堆棧壓棧棧頂SP棧頂SP棧底空堆棧棧底滿(mǎn)堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱(chēng)為滿(mǎn)堆棧;堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置,稱(chēng)為空堆棧。4.1ARM處理器尋址方式尋址方式分類(lèi)——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧所以可以組合出四種類(lèi)型的堆棧方式:滿(mǎn)遞增:堆棧向上增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置。指令如LDMEA、STMEA等;滿(mǎn)遞減:堆棧向下增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長(zhǎng),堆棧指針向堆棧下的第一個(gè)空位置。指令如LDMED、STMED等。4.1ARM處理器尋址方式尋址方式分類(lèi)——堆棧尋址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}助記符說(shuō)明操作條件碼位置SWPRd,Rm,Rn寄存器和存儲(chǔ)器字?jǐn)?shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn寄存器和存儲(chǔ)器字節(jié)數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}BARM存儲(chǔ)器訪問(wèn)指令——寄存器和存儲(chǔ)器交換指令
SWP指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個(gè)寄存器Rd中,同時(shí)將另一個(gè)寄存器Rm的內(nèi)容寫(xiě)入到該內(nèi)存單元中。使用SWP可實(shí)現(xiàn)信號(hào)量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]
其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲(chǔ)器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于存儲(chǔ)到存儲(chǔ)器中,若Rm與Rd相同,則為寄存器與存儲(chǔ)器內(nèi)容進(jìn)行互換;Rn為要進(jìn)行數(shù)據(jù)交換的存儲(chǔ)器地址,Rn不能與Rd和Rm相同。ARM存儲(chǔ)器訪問(wèn)指令——寄存器和存儲(chǔ)器交換指令SWP和SWPB——寄存器和存儲(chǔ)器交換指令編碼指令執(zhí)行的條件碼B用于區(qū)別無(wú)符號(hào)字節(jié)(B為1)或字(B為0)Rm源寄存器Rd目標(biāo)寄存器Rn為基址寄存器SWP指令應(yīng)用示例:SWP R1,R1,[R0] ;將R1的內(nèi)容與R0指向的存儲(chǔ)單元的內(nèi)容進(jìn)行互換SWPB R1,R2,[R0] ;將R0指向的存儲(chǔ)單元低字節(jié)數(shù)據(jù)讀取到R1中
;(高24位清零),并將R2的內(nèi)容寫(xiě)入到該內(nèi)存單元中
;(最低字節(jié)有效)復(fù)習(xí)單寄存器數(shù)據(jù)傳送
LDR STR WordLDRB STRB ByteLDRH STRH HalfwordLDRSB 帶符號(hào)的byteloadLDRSH 帶符號(hào)的halfwordload存儲(chǔ)器系統(tǒng)必須支持所有訪問(wèn)寬度語(yǔ)法:
LDR{<cond>}{<size>}Rd,<address>STR{<cond>}{<size>}Rd,<address>e.g.LDREQB地址訪問(wèn)LDR/STR訪問(wèn)的地址由基址寄存器加上偏移量來(lái)產(chǎn)生。針對(duì)word和無(wú)符號(hào)byte的訪問(wèn),偏移量可以是:一個(gè)無(wú)符號(hào)12-bit立即數(shù)(如0-4095bytes).
LDRr0,[r1,#8]一個(gè)寄存器,或再加上移位(由立即數(shù)指定)
LDRr0,[r1,r2]
LDRr0,[r1,r2,LSL#2]可以是從基址寄存器上加或減去偏移量:
LDRr0,[r1,#-8]
LDRr0,[r1,-r2]
LDRr0,[r1,-r2,LSL#2]對(duì)于halfword和帶符號(hào)的halfword/byte,偏移量可以是:一個(gè)無(wú)符號(hào)8bit立即數(shù)(如0-255bytes).一個(gè)寄存器(不能偏移)??蛇x擇采用pre-indexed或post-indexed方式尋址0x50x5r10x200基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x200原基址
寄存器0x200r00x5源寄存器
forSTR偏移量120x20cr10x20c更新
基址寄存器通過(guò)
STRr0,[r1,#12]!來(lái)自動(dòng)更新基址寄存器PreorPostIndexed尋址?
Pre-indexed:STRr0,[r1,#12]
Post-indexed:STRr0,[r1],#12LDM/STM指令允許一次傳送1到16個(gè)寄存器到/從存儲(chǔ)器中。寄存器傳送順序不能被指定最小數(shù)字的寄存器總是被傳送到/從存儲(chǔ)器的最低地址上。
LDMIA r10,{r0,r1,r4}基址寄存器指定存儲(chǔ)器訪問(wèn)開(kāi)始的地址
塊傳送指令針對(duì)下列情況很有效:從存儲(chǔ)器中搬運(yùn)一塊數(shù)據(jù)保存或恢復(fù)堆棧中的內(nèi)容如果是慢速存儲(chǔ)器,會(huì)影響中斷響應(yīng)時(shí)間塊數(shù)據(jù)傳送r1r4r0r10地址增加LDM/STM操作語(yǔ)法:<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存儲(chǔ)器頂SPSP100FF1234A0BE8034SPOldSP100FF1234A0BE8034ARM堆棧操作通過(guò)塊傳送指令來(lái)完成:STMFD
(Push) 塊存儲(chǔ)-FullDescendingstack[STMDB]LDMFD
(Pop) 塊裝載-FullDescendingstack[LDMIA]STMFDsp!,{r4-r7,lr}在寄存器和存儲(chǔ)器之間,由一次存儲(chǔ)器讀和一次存儲(chǔ)器寫(xiě)組成的原子操作。完成一個(gè)字節(jié)或字的交換。語(yǔ)法:SWP{<cond>}{B}Rd,Rm,[Rn]RmRd321temp存儲(chǔ)器RnSWP4.2指令集介紹ARM指令集——分支指令在ARM中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實(shí)現(xiàn)跳轉(zhuǎn)。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。ARM分支指令——指令編碼分支指令B/BL指令編碼格式指令執(zhí)行的條件碼L區(qū)別B指令(L為0)和BL指令(L為1)24位有符號(hào)立即數(shù)(偏移量)分支指令BX指令編碼格式指令執(zhí)行的條件碼Rm目標(biāo)地址寄存器,該寄存器裝載跳轉(zhuǎn)地址助記符說(shuō)明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令助記符說(shuō)明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下:B{cond}Label
應(yīng)用示例:
B WAITA ;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處
B 0x1234 ;跳轉(zhuǎn)到絕對(duì)地址0x1234處BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說(shuō)明操作條件碼位置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)到指定地址運(yùn)行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時(shí),硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計(jì)數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行應(yīng)用示例(調(diào)用子程序):
BL Label 助記符說(shuō)明操作條件碼位置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)的最低位來(lái)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下:BX{cond}Rm跳轉(zhuǎn)地址Rm[0]跳轉(zhuǎn)后CPSR標(biāo)志T位處理器狀態(tài)00ARM11Thumb助記符說(shuō)明操作條件碼位置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)的最低位來(lái)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標(biāo)志T置位,且將目標(biāo)地址的代碼解釋為T(mén)humb代碼;若Rm的位[0]為0,則Rm的位[1]就不能為1
。指令格式如下:BX{cond}Rm應(yīng)用示例:
ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到R0指定的地址,
;并根據(jù)R0的最低位來(lái)切換處理器狀態(tài)桶型移位器DestinationCF0DestinationCFLSL:LogicalLeftShiftASR:ArithmeticRightShift(無(wú)符號(hào)數(shù))乘2除2,并保留符號(hào)位DestinationCF...0DestinationCFLSR:LogicalShiftRightROR:RotateRight(無(wú)符號(hào)數(shù))除2位輪換DestinationRRX:RotateRightExtended位輪換,從CF到MSB都參與操作CF寄存器,可選擇是否增加移位操作.移位值可以是:5bit無(wú)符號(hào)整數(shù)放在另一個(gè)寄存器的低字節(jié)用于常數(shù)乘法
立即數(shù)8bit,大小范圍0-255。右移偶數(shù)位允許直接加載32-bit常數(shù)到寄存器中。結(jié)果操作數(shù)1Barrel
Shifter操作數(shù)2ALU桶型移位器:
第二個(gè)操作數(shù)沒(méi)有任何一條ARM指令可包括一個(gè)32bit的立即數(shù)所有的ARM指令都是32bits固定長(zhǎng)度數(shù)據(jù)處理指令格式中,第二個(gè)操作數(shù)有12位4bit移位值(0-15)乘于2,得到一個(gè)范圍在0-30,步長(zhǎng)為2的移位值。記住一條準(zhǔn)則:“最后8位一定要移動(dòng)偶數(shù)位”.07118immed_8Shifter
RORrotx2QuickQuiz:
0xe3a004ff
MOVr0,#???立即數(shù)(1)Examples:下列命令中,匯編器把立即數(shù)轉(zhuǎn)換為移位操作:MOVr0,#4096 ;uses0x40ror26ADDr1,r2,#0xFF0000 ;uses0xFFror16也可使用MVN來(lái)進(jìn)行位反轉(zhuǎn):MOVr0,#0xFFFFFFFF ;assemblestoMVNr0,#0立即數(shù)不能使用上述方法產(chǎn)生,否則將導(dǎo)致錯(cuò)誤。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ù)裝載到寄存器中時(shí)一律使用該偽指令。裝載32bit常數(shù)測(cè)驗(yàn)#11.寫(xiě)一條ARM指令,分別完成下列操作: a)r0=16 b)r0=r1/16 (帶符號(hào)的數(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í)行!大家可以嘗試計(jì)算2109和4161的GCD
AREAmyarea,CODE ENTRY MOVr0,#9 MOVr1,#15start ;yourcodeherestop Bstop END測(cè)驗(yàn)#2-GCD新建一個(gè)‘ARMExecutableImage’項(xiàng)目新建一個(gè)text文件另存為“gcd.s”加入到項(xiàng)目中Build并執(zhí)行乘法語(yǔ)法: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指令A(yù)RM7TDMI上為2-5周期StrongARM/XScale上為1-3周期ARM9E/ARM102xE上為2周期ARM9TDMI比ARM7TDMI多1周期累加再多1周期(不針對(duì)9E,盡管結(jié)果延遲多于1周期)對(duì)于“l(fā)ong”型數(shù)據(jù),多1周期以上均為一般規(guī)則,確切細(xì)節(jié)查看相應(yīng)手冊(cè)。軟件中斷(SWI)產(chǎn)生一個(gè)異常陷阱,跳轉(zhuǎn)到SWI硬件向量。SWI處理程序可以檢測(cè)SWI號(hào),從而決定采取何種操作。通過(guò)SWI機(jī)制,運(yùn)行在用戶(hù)模式下的應(yīng)用程序,可請(qǐng)求操作系統(tǒng)執(zhí)行一系列特權(quán)操作。語(yǔ)法:
SWI{<cond>}<SWInumber>283124270
Cond1111SWInumber(ignoredbyprocessor)23條件域PSR傳送指令MRS和MSR允許傳送CPSR/SPSR中的內(nèi)容到/從一個(gè)通用寄存器中。語(yǔ)法:
MRS{<cond>}Rd,<psr>;Rd=<psr>
MSR{<cond>}<psr[_fields]>,Rm;<psr[_fields]>=Rm在這里:<psr>=CPSRorSPSR[_fields]=‘fsxc’的任意組合也允許送一個(gè)立即數(shù)到
psr_fields
MSR{<cond>}<psr_fields>,#Immediate用戶(hù)模式下,所有位均可以被讀取,但只有條件標(biāo)志位(_f)可被寫(xiě)。2731NZCVQ2867IFTmode1623
815
54024fsxc
UndefinedJ協(xié)處理器指令A(yù)RM體系支持16個(gè)協(xié)處理器針對(duì)每個(gè)協(xié)處理器的指令占用ARM指令集中的固定部分如果相應(yīng)的協(xié)處理器不存在,將發(fā)生一個(gè)未定義指令異常。這有三種協(xié)處理器指令協(xié)處理器數(shù)據(jù)處理指令CDP:初始化協(xié)處理器數(shù)據(jù)處理操作協(xié)處理器寄存器傳送指令MRC:從協(xié)處理器寄存器移到ARM寄存器MCR:從ARM寄存器移到協(xié)處理器寄存器協(xié)處理器存儲(chǔ)器傳送指令LDC:從存儲(chǔ)器裝載到協(xié)處理器寄存器STC:從協(xié)處理器寄存器存儲(chǔ)到存儲(chǔ)器測(cè)試#41.寫(xiě)幾條ARM指令,使能IRQ中斷2.下列ARM指令將做什么? a)
LDRHr0,[r1,#6] b)
LDRr0,=0x9993.在裝載或存儲(chǔ)指令中,“!”表示什么?4.當(dāng)執(zhí)行SWI指令時(shí),會(huì)發(fā)生什么?5.SWP指令的優(yōu)勢(shì)是什么?議程
ARM指令集Thumb指令集
v5TE體系結(jié)構(gòu)擴(kuò)展015310ADDSr2,r2,#1ADDr2,#132-bitARM指令16-bitThumb指令對(duì)于由編譯器產(chǎn)生的大部分指令:沒(méi)有條件執(zhí)行源、目的寄存器必須相同僅能使用低寄存器常數(shù)大小有限制不能使用在線(xiàn)移位器ThumbThumb是16-bit指令集代碼密度優(yōu)化(總代碼大小約為ARM指令的65%)使用窄總線(xiàn)存儲(chǔ)器時(shí)可以大大提高性能。是ARM指令集的一個(gè)子集。核存在一個(gè)執(zhí)行狀態(tài)–Thumb狀態(tài)ARM和Thumb之間切換使用BX指令使用BranchExchange
指令來(lái)完成InterworkingBXRn
;Thumb狀態(tài)下的Bx指令BX<condition>Rn
;ARM狀態(tài)下的Bx指令也可以只是執(zhí)行一個(gè)絕對(duì)跳轉(zhuǎn),無(wú)須狀態(tài)更換。ARM/Thumb交互工作RnBX跳轉(zhuǎn)的地址31013101ARM/Thumb選擇0-ARM狀態(tài)1-Thumb狀態(tài)0寫(xiě)Thumb匯編程序Thumb不是一個(gè)“好”
指令集!最好用編譯器來(lái)產(chǎn)生約束并不一致代碼處理通常優(yōu)于ARM指令更多細(xì)節(jié),參看:ARM“ArchitectureReferenceManual”ChaptersA6和A7議程
ARM指令集 Thumb指令集v5TE體系結(jié)構(gòu)擴(kuò)展v5TE結(jié)構(gòu)v5TE體系包括全部的v4TARM和Thumb指令集,還有:更支持interworking同時(shí)支持ARM/Thumb狀態(tài)Breakpoint指令(ARM和Thumb)CLZ(CountLeadingZeros)指令擴(kuò)展協(xié)處理器指令-MCR2等等支持飽和處理封裝的帶符號(hào)的半字乘法指令雙字裝載/存儲(chǔ)指令Cache預(yù)裝載指令雙字協(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前導(dǎo)零計(jì)數(shù)指令CLZ{cond}Rd,Rm計(jì)算寄存器中的值有多少個(gè)前導(dǎo)0源寄存器從最高位開(kāi)始計(jì)算。1個(gè)周期完成 (ARM9E-S/ARM102x)如果沒(méi)有任何一位被置位,結(jié)果是32;如果bit31被置位,結(jié)果為0。Rm左移Rd位即可標(biāo)準(zhǔn)化Rm帶符號(hào)的標(biāo)準(zhǔn)化需要額外的1個(gè)周期0000001011101101...0R0=CLZR1,R00x6R1=1011101101000000...0Rm=MOVR0,R0LSLR1EORR1,R0,R0,LSL#1CLZR1,R1MOVR0,R0,LSLR1擴(kuò)展協(xié)處理器指令CDP2,LDC2,STC2,MCR2,MRC2新格式的標(biāo)準(zhǔn)協(xié)處理器指令為協(xié)處理器設(shè)計(jì)人員提供了附加的操作碼空間。同樣是無(wú)條件執(zhí)行的TRmRsBTBWoption16161616321632/6432/64Rd(RdHi,RdLo)Rn(RdHi,RdLo)新的有符號(hào)乘法操作SMULxy{cond}Rd,Rm,RsSMULWy{cond}Rd,Rm,RsSMLAxy{cond}Rd,Rm,Rs,RnSMLAWy{cond}Rd,Rm,Rs,RnSMLALxy{cond}RdLo,RdHi,Rm,RsSMLA
指令影響標(biāo)志位Qx,y用于選擇寄存器的高一半和低一半W
用于選擇48位結(jié)果的高32位
不影響NZCV(沒(méi)有‘S’位)1)寫(xiě)一段匯編代碼‘qtest’測(cè)試標(biāo)志位Q并清零。源文件模板在文件‘a(chǎn)sm\dsp.s’中給出返回根據(jù)標(biāo)志位Q的值2)寫(xiě)一段匯編主程序,累加16位有符號(hào)數(shù)組的所有元素的平方。inttotal=0;for(n=0;n<64;n++)total+=x[n]*x[n];取值指令
使用LDRH平方累加指令使用SMLABB3)是否存在互鎖?4)使用AXD檢查Q標(biāo)志位(通過(guò)改變cpsr模式為E-PSR)5)在循環(huán)后面增加一個(gè)
BL
調(diào)用qtest并檢查返回值6)專(zhuān)家題:
改用LDR,每次取兩個(gè)值7)專(zhuān)家題:
修改代碼,使用64位累加器測(cè)試#5-DSPpowercalculationxx[0]x[1]x[2]x[3]x[4]x[63]r0x[62]x[5]
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025江蘇蘇州高新區(qū)管委會(huì)人才引進(jìn)120人筆試備考題庫(kù)及參考答案詳解
- 2025年鄂爾多斯市公務(wù)員考試行測(cè)試卷歷年真題及完整答案詳解1套
- 吉林省松原市前郭一中2024-2025學(xué)年度第二學(xué)期6月份質(zhì)量檢測(cè) 七年級(jí)地理試卷(含答案)
- 遼寧省名校聯(lián)盟2024-2025學(xué)年高二上學(xué)期1月聯(lián)合考試物理試題(解析版)
- 江蘇省“決勝高考”2024-2025學(xué)年高三下學(xué)期2月聯(lián)考物理試卷(解析版)
- 山東省曲阜市普通高中2024-2025學(xué)年高一上學(xué)期期中教學(xué)質(zhì)量檢測(cè)數(shù)學(xué)試題(解析版)
- 真功夫快餐的競(jìng)爭(zhēng)對(duì)手及市場(chǎng)定位比較
- 房地產(chǎn)項(xiàng)目應(yīng)對(duì)市場(chǎng)變化的策略
- BIM在建筑信息集成中的應(yīng)用實(shí)例
- 幼兒園喜慶元旦活動(dòng)策劃與節(jié)目安排
- 2025年中醫(yī)基礎(chǔ)理論考試試題及答案
- 酒店入股合同協(xié)議書(shū)范本
- 外研版七年級(jí)英語(yǔ)上冊(cè)跨學(xué)科項(xiàng)目計(jì)劃
- 2025年瑜伽教練認(rèn)證考試體式教學(xué)與課程設(shè)計(jì)模擬試題集(含答案詳解)
- 2025年英語(yǔ)專(zhuān)業(yè)四級(jí)(TEM4)完形填空專(zhuān)項(xiàng)模擬試卷(詞匯與邏輯推理)-深度解析版
- 2025年廣西高一學(xué)業(yè)水平考試模擬生物試卷試題(含答案)
- 綜合實(shí)踐項(xiàng)目 設(shè)計(jì)并制作人體結(jié)構(gòu)模型(教學(xué)設(shè)計(jì)) 七年級(jí)生物下冊(cè) (人教版2024)
- 山西中考:歷史必考知識(shí)點(diǎn)
- 2025《學(xué)前教育法》宣傳月培訓(xùn)含講稿
- 2025榆林能源集團(tuán)有限公司招聘工作人員(473人)筆試參考題庫(kù)附帶答案詳解
- 24 唐詩(shī)三首《石壕吏》公開(kāi)課一等獎(jiǎng)創(chuàng)新教學(xué)設(shè)計(jì)(表格式)
評(píng)論
0/150
提交評(píng)論