ys-f1pro光盤(pán)-配套4.參考2cortex m3權(quán)威指南_第1頁(yè)
ys-f1pro光盤(pán)-配套4.參考2cortex m3權(quán)威指南_第2頁(yè)
ys-f1pro光盤(pán)-配套4.參考2cortex m3權(quán)威指南_第3頁(yè)
ys-f1pro光盤(pán)-配套4.參考2cortex m3權(quán)威指南_第4頁(yè)
ys-f1pro光盤(pán)-配套4.參考2cortex m3權(quán)威指南_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余98頁(yè)可下載查看

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論