版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
嵌入式系統(tǒng)原理與設(shè)計(jì)第6章
ARM指令集及匯編程序設(shè)計(jì)本章需要掌握以下內(nèi)容:ARM指令體系結(jié)構(gòu);常用ARM指令的功能;ARM匯編程序設(shè)計(jì)方法。/016.1ARM指令體系結(jié)構(gòu)6.1.1ARM指令體系特點(diǎn)ARM指令集屬于RISC(ReducedInstructionSetComputer)指令集,它具有RISC指令集的如下特點(diǎn):一個(gè)大的、統(tǒng)一的寄存器文件;基于load/store架構(gòu),即數(shù)據(jù)處理操作僅對(duì)寄存器內(nèi)容進(jìn)行操作,不能對(duì)內(nèi)存的內(nèi)容進(jìn)行操作;簡(jiǎn)單的尋址模式,即所有的加載/存儲(chǔ)地址僅由寄存器內(nèi)容和指令字段共同決定;統(tǒng)一和固定長(zhǎng)度的指令字段,以簡(jiǎn)化指令譯碼。6.1.1ARM指令體系特點(diǎn)ARM指令集還有如下的獨(dú)特特點(diǎn):
在大多數(shù)數(shù)據(jù)處理指令中對(duì)算術(shù)邏輯單元(ALU)和移位器的控制,以最大限度地利用ALU和移位器;自動(dòng)遞增和自動(dòng)遞減尋址模式,以優(yōu)化程序循環(huán);加載和存儲(chǔ)多條指令,以最大限度地提高數(shù)據(jù)吞吐量;有條件地執(zhí)行幾乎所有指令,以最大限度地提高執(zhí)行吞吐量。這些對(duì)基本RISC體系結(jié)構(gòu)的增強(qiáng)使得ARM處理器能夠在高性能、小代碼量、低功耗和小硅片之間實(shí)現(xiàn)良好的平衡,這也是ARM在市場(chǎng)上取得成功的關(guān)鍵要素之一。6.1.2ARM指令體系結(jié)構(gòu)的版本迄今為止,ARM指令體系架構(gòu)發(fā)布了8個(gè)不同的版本,從低到高的版本號(hào)依次是v1到v8。同時(shí),各個(gè)版本中還有一些變種,這些變種擴(kuò)展了該版本指令集的功能。(1)v1版本(2)v2版本(3)v3版本目前已不再使用6.1.2ARM指令體系結(jié)構(gòu)的版本(4)v4版本v4版本增加了半字的讀取和存儲(chǔ)指令;讀取帶符號(hào)的字節(jié)和半字?jǐn)?shù)據(jù)的指令;增加了T變種,即指令集為16位的Thumb指令集;增加了處理器的特權(quán)模式,在該模式下,使用的是用戶模式下的寄存器。明確了哪些指令會(huì)引起未定義指令異常。該版本不向前兼容,即與以前的26位地址空間不兼容。目前常用的ARM7、ARM9處理器都采用該版本結(jié)構(gòu)。6.1.2ARM指令體系結(jié)構(gòu)的版本(5)v5版本v5結(jié)構(gòu)提升了ARM和Thumb兩種指令的交互工作能力,對(duì)于T變種的指令和非T變種的指令使用相同的代碼生成技術(shù);增加了DSP指令(E變種)、Java指令(J變種)。帶有連接和交換的轉(zhuǎn)移BLX指令;增加了前導(dǎo)零計(jì)數(shù)CLZ指令,增加了軟件斷點(diǎn)指令;為協(xié)處理器增加了更多可選擇的指令;更嚴(yán)格地定義了乘法指令對(duì)條件標(biāo)志位的影響。目前,ARM10和XScale系列微處理器都采用v5版本的指令體系。6.1.2ARM指令體系結(jié)構(gòu)的版本(6)v6版本v6版本主要是采用單指令多數(shù)據(jù)(SIMD)技術(shù),擴(kuò)展了媒體處理指令,使得ARM處理器在媒體應(yīng)用中的處理能力得到較大提升。該版本首先在ARM11處理器得到應(yīng)用。6.1.2ARM指令體系結(jié)構(gòu)的版本(7)v7版本v7版本采用了Thumb-2技術(shù)。Thumb-2技術(shù)比純32位代碼減少31%的存儲(chǔ)開銷,同時(shí)能夠提供比已有的基于Thumb技術(shù)的解決方案高出38%的性能。v7架構(gòu)還引入NEON技術(shù),它是一種128位的SIMD指令擴(kuò)展,將DSP和媒體處理能力提高近4倍,并支持改良的浮點(diǎn)運(yùn)算,滿足3D圖形、游戲等應(yīng)用以及傳統(tǒng)嵌入式控制應(yīng)用的需求。該版本首先在CortexA8處理器上得到應(yīng)用。6.1.2ARM指令體系結(jié)構(gòu)的版本(8)v8版本v8版本將64位架構(gòu)支持引入到ARM體系結(jié)構(gòu)中。為向前兼容,v8版本支持AArch32和AArch64兩種執(zhí)行狀態(tài),A32、T32和A64三個(gè)主要指令集。v8指令體系結(jié)構(gòu)主要面向高性能計(jì)算,目前主流的智能手機(jī)的處理器,如CortexA72、A76等,都采用的是ARMv8指令體系結(jié)構(gòu)。6.1.3ARM指令體系支持的數(shù)據(jù)類型
字節(jié)(Byte,8位)
半字(HalfWord,16位)字(Word,32位)ARM的Load/Store指令支持三種數(shù)據(jù)類型有符號(hào)無(wú)符號(hào)有符號(hào)無(wú)符號(hào)6.1.4ARM處理器的指令集ARM處理器支持兩類指令集:32位的ARM指令集16位Thumb指令集ARM體系結(jié)構(gòu)采用這種設(shè)計(jì)方式的目的在于減少程序代碼需要的存儲(chǔ)空間,因?yàn)橥瓿赏瑯庸δ艿腡humb指令只需要2個(gè)字節(jié),而ARM指令需要4個(gè)字節(jié)。Thumb指令集是ARM指令集的子集6.1.4ARM處理器的指令集ARM指令集和Thumb指令集的不同點(diǎn)項(xiàng)目ARM指令Thumb指令指令工作標(biāo)志CPSR的T位=0CPSR的T位=1操作數(shù)尋址方式大多數(shù)指令為3地址大多數(shù)指令為2地址指令長(zhǎng)度32位16位內(nèi)核指令58條30條條件執(zhí)行大多數(shù)指令只有分支指令數(shù)據(jù)處理指令訪問(wèn)桶形移位器和ALU獨(dú)立的桶形移位器和ALU指令寄存器使用15個(gè)通用寄存器+PC8個(gè)通用低寄存器+2個(gè)高寄存器+PC程序狀態(tài)寄存器特權(quán)模式下可讀可寫不能直接訪問(wèn)異常處理能夠全盤處理不能處理6.1.5ARM指令的條件碼ARM指令可以條件執(zhí)行,也就是根據(jù)CPSR中的條件標(biāo)志位來(lái)決定是否執(zhí)行某條指令。當(dāng)條件滿足時(shí)執(zhí)行該指令,條件不滿足時(shí)該指令被當(dāng)作一條NOP指令(不完成任何實(shí)際操作,相當(dāng)于在流水線中插入一個(gè)氣泡)。條件執(zhí)行是ARM指令體系結(jié)構(gòu)的特色之一,也特別有用。例如,如下的C語(yǔ)言代碼,如果變量a分配給R0寄存器,變量b分配給R1寄存器,如何用ARM匯編指令來(lái)實(shí)現(xiàn)?if(a>b)a++;else
b++;6.1.5ARM指令的條件碼CMPR0,R1 ;比較R0和R1的值,即比較a和b的大小ADDHIR0,R0,#1 ;如果R0>R1,執(zhí)行該語(yǔ)句,即a++ADDLSR1,R1,#1 ;如果R0≤R1,執(zhí)行該語(yǔ)句,即b++如下的C語(yǔ)言代碼,如果變量a分配給R0寄存器,變量b分配給R1寄存器,如何用ARM匯編指令來(lái)實(shí)現(xiàn)?if(a>b)a++;else
b++;6.1.5ARM指令的條件碼條件碼條件碼助記符含義CPSR中條件標(biāo)志位值0000EQ相等Z=10001NE不相等Z=00010CS/HS無(wú)符號(hào)數(shù)大于/等于C=10011CC/LO無(wú)符號(hào)數(shù)小于C=00100MI負(fù)數(shù)N=10101PI非負(fù)數(shù)N=00110VS上溢出V=10111VC沒有上溢出V=01000HI無(wú)符號(hào)數(shù)大于(higher)C=1且Z=01001LS無(wú)符號(hào)數(shù)小于等于C=0且Z=11010GE帶符號(hào)數(shù)大于等于N=1且V=1或N=0且V=01011LT帶符號(hào)數(shù)小于N=1且V=0或N=0且V=11100GT帶符號(hào)數(shù)大于Z=0且N=V1101LE帶符號(hào)數(shù)小于/等于Z=1或N!=V1110AL無(wú)條件執(zhí)行
1111NV該指令無(wú)條件執(zhí)行ARMv5及以上版本各條件碼的含義和助記符6.1.6ARM指令分類ARM指令集可以分為5大類:數(shù)據(jù)處理指令:使用片內(nèi)算術(shù)邏輯部件(ALU)、桶形移位器和乘法器完成數(shù)據(jù)算術(shù)、邏輯、移位和乘法等運(yùn)算。分支跳轉(zhuǎn)指令:控制程序執(zhí)行流程、以及完成ARM代碼和Thumb代碼的切換。存儲(chǔ)器訪問(wèn)指令:控制存儲(chǔ)器和寄存器之間的數(shù)據(jù)傳送,包括從存儲(chǔ)器取數(shù)到寄存器(稱為L(zhǎng)oad)和將寄存器中的數(shù)存到存儲(chǔ)器(稱為Store)。協(xié)處理器指令:用于控制外部協(xié)處理器,以開放和統(tǒng)一的方式擴(kuò)展指令集的片外功能。雜類指令:包括中斷調(diào)用、狀態(tài)寄存器的讀寫等。/026.2ARM指令集6.2.1數(shù)據(jù)處理指令1.數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用于向寄存器傳入一個(gè)數(shù),屬于2操作數(shù)指令,一個(gè)源操作數(shù),一個(gè)目的操作數(shù),包括MOV和MVN兩條指令,指令語(yǔ)法格式如下:<opcode>{cond}{S}<Rd>,<shifter_operand>6.2.1數(shù)據(jù)處理指令1.數(shù)據(jù)傳送指令【例6-1】數(shù)據(jù)傳送指令的用法舉例。MOVR1,R2 ;R1=R2MOVR1,#10 ;R1=10MOVPC,LR ;PC=LR,該指令用于從子程序返回MOVR2,R2LSL#2 ;R2=R2<<2,該指令用于實(shí)現(xiàn)純移位操作MVNR1,#0xFF ;將16進(jìn)制數(shù)0xFF按位取反傳送到R1,即R1=0xFFFFFF00MOVEQR1,#10 ;條件標(biāo)志Z=1時(shí)R1=10,否則R1不變6.2.1數(shù)據(jù)處理指令2.算術(shù)邏輯運(yùn)算指令該類指令用于加、減算術(shù)運(yùn)算和與、或、異或等邏輯運(yùn)算,屬于3操作數(shù)指令,兩個(gè)源操作數(shù),一個(gè)目的操作數(shù)。指令語(yǔ)法格式如下:<opcode>{cond}{S}<Rd>,<Rn>,<shifter_operand>6.2.1數(shù)據(jù)處理指令1)ADD加法指令【例6-2】ADD指令的用法舉例。ADDRx,Rx,#1 ;Rx=Rx+1ADDRd,Rx,Rx,LSL#n ;Rd=Rx*(2n+1)ADDRs,PC,#offset ;生成基于PC的跳轉(zhuǎn)指針6.2.1數(shù)據(jù)處理指令2)ADC帶進(jìn)位加法指令A(yù)DC指令和ADD指令聯(lián)合使用,可以實(shí)現(xiàn)兩個(gè)64位的操作數(shù)相加。例如,寄存器R0和R1中放置一個(gè)64位的源操作數(shù),其中R0中放置低32位數(shù)值;寄存器R2和R3中放置另一個(gè)64位的源操作數(shù),其中R2中放置低32位數(shù)值;則下面的指令序列實(shí)現(xiàn)了兩個(gè)64位操作數(shù)的加法操作,運(yùn)算結(jié)果存放在寄存器R5和R4中,其中R4保存低32位數(shù)值。ADDSR4,R0,R2 ;加低端的字ADCR5,R1,R3 ;加高端的字,帶進(jìn)位6.2.1數(shù)據(jù)處理指令3)SUB減法指令【例6-3】SUB指令的用法舉例。SUBR0,R1,R2 ;R0=R1-R2SUBR0,R1,#256 ;R0=R1-2566.2.1數(shù)據(jù)處理指令4)SBC帶借位減法指令SBC指令和SUBS指令聯(lián)合使用,可以實(shí)現(xiàn)兩個(gè)64位的操作數(shù)相減。例如寄存器R0和R1中放置一個(gè)64位的源操作數(shù),其中R0中放置低32位數(shù)值,寄存器R2和R3中放置另一個(gè)64位的源操作數(shù),其中R2中放置低32位數(shù)值,則下面的指令序列實(shí)現(xiàn)了兩個(gè)64位操作數(shù)的減法操作。SUBSR4,R0,R2SBCR5,R1,R36.2.1數(shù)據(jù)處理指令5)RSB逆向減法指令【例6-4】RSB指令的用法舉例。RSBR0,R1,#0 ;Rd=-R1RSBR0,R1,R2 ;Rd=R2-R1RSBRd,Rx,Rx,LSL#n ;Rd=Rx*(2n-1)6.2.1數(shù)據(jù)處理指令6)RSC帶借位逆向減法指令【例6-5】RSC指令的用法舉例。下面的指令序列可以求一個(gè)64位數(shù)值的負(fù)數(shù)。64位數(shù)放在寄存器R0與R1中,其負(fù)數(shù)放在R2與R3中。其中R0與R2中放低32位值。RSBSR2,R0,#0RSCR3,R1,#06.2.1數(shù)據(jù)處理指令7)AND邏輯與操作指令指令功能為Rd=Rn&shifter_operand(按位與,如果shifter_operand為立即數(shù),要擴(kuò)展成32位)。如果S=1,還要根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。8)ORR邏輯或操作指令指令功能為Rd=Rn|shifter_operand(按位或)。如果S=1,還要根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,更新方法與AND指令相同。6.2.1數(shù)據(jù)處理指令9)EOR邏輯異或操作指令指令功能為Rd=Rn^shifter_operand(按位異或,即相異為1,相同為0)。如果S=1,還要根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,更新方法與AND指令相同。10)BIC位清除指令BIC指令用于清除寄存器<Rn>的某些位,并把結(jié)果保存到目標(biāo)寄存器<Rd>中。如果S=1,還要根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,更新方法與AND指令相同。6.2.1數(shù)據(jù)處理指令【例6-6】AND、ORR、EOR和BIC指令的用法舉例。AND R0,R0,#3 ;該指令保持R0的0、1位,其它位清零ORR R0,R0,#3 ;該指令將R0的0、1位置1,其它位保持不變EOR R0,R0,#3 ;該指令反轉(zhuǎn)R0的0、1位,其它位保持不變BIC R0,R0,#3 ;該指令將R0中的0、1位置0,其余位保持不變6.2.1數(shù)據(jù)處理指令3.比較測(cè)試指令這類指令屬于2操作數(shù)指令,有兩個(gè)源操作數(shù),沒有目的寄存器,因而不保存運(yùn)算結(jié)果,只用于更新CPSR中相應(yīng)的條件標(biāo)志位(N、Z、C和V位),包括CMP、CMN、TST、TEQ指令。指令語(yǔ)法格式如下:<opcode>{cond}<Rn>,<shifter_operand>opcode=CMP|CMN|TST|TEQ,其對(duì)應(yīng)的二進(jìn)制碼分別為1010|1011|1000|10016.2.1數(shù)據(jù)處理指令1)CMP比較指令CMP指令從寄存器<Rn>中減去<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,后面的指令就可以根據(jù)CPSR中相應(yīng)的條件標(biāo)志位來(lái)判斷是否執(zhí)行。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=Rn-shifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=NOTBorrowfrom(Rn-shifter_operand)VFlag=OverflowFrom(Rn-shifter_operand)6.2.1數(shù)據(jù)處理指令2)CMN基于相反數(shù)的比較指令CMN指令將寄存器<Rn>中的值加上<shifter_operand>表示的數(shù)值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,后面的指令就可以根據(jù)CPSR中相應(yīng)的條件標(biāo)志位來(lái)判斷是否執(zhí)行。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=Rn+shifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=CarryFrom(Rn+shifter_operand)VFlag=OverflowFrom(Rn+shifter_operand)6.2.1數(shù)據(jù)處理指令3)TST位測(cè)試指令TST指令將寄存器<Rn>的值與<shifter_operand>表示的數(shù)值按位做邏輯與操作,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。指令功能的偽碼如下:ifConditionPassed(cond)then/*cond條件成立*/alu_out=RnANDshifter_operandNFlag=alu_out[31]ZFlag=ifalu_out==0then1else0CFlag=shifter_carry_outVFlag=unaffected6.2.1數(shù)據(jù)處理指令4)TEQ相等測(cè)試指令TEQ指令將寄存器<Rn>的值與<shifter_operand>表示的數(shù)值按位做邏輯異或操作,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。其中,條件標(biāo)志位的更新方法同TST指令?!纠?-7】比較測(cè)試指令用法舉例(設(shè)R0=8,R1=4,R2=10)CMP R1,R0 ;根據(jù)R1-R0的結(jié)果設(shè)置CPSR標(biāo)志位,N=1,Z=C=V=0CMNR1,#100 ;根據(jù)R1+100的結(jié)果設(shè)置CPSR標(biāo)志位,N=Z=C=V=0TST R1,#3 ;測(cè)試R1的第0、1位是否為1,N=C=V=0,Z=1TST R1,R2,LSL#1 ;測(cè)試R1的第2、4位是否為1,N=Z=C=V=0TEQ R1,R2 ;測(cè)試R1與R2是否相等,N=Z=C=V=0TEQ R1,#4 ;測(cè)試R1與4是否相等,N=C=V=0,Z=16.2.1數(shù)據(jù)處理指令4.乘法指令與乘加指令A(yù)RMv5T支持的乘法指令與乘加指令共有6條,可根據(jù)運(yùn)算結(jié)果分為32位和64位兩類。指令中所有的操作數(shù)、目的寄存器必須為通用寄存器,不能對(duì)操作數(shù)使用立即數(shù)或被移位的寄存器。目的寄存器和操作數(shù)1必須是不同的寄存器。乘法指令和乘加指令包括MUL、MLA、SMULL、SMLAL、UMULL、UMLAL共6條。對(duì)于乘法指令,源寄存器或目的寄存器不能為R15寄存器,否則執(zhí)行結(jié)果不可預(yù)測(cè)。6.2.1數(shù)據(jù)處理指令1)MUL32位乘法指令MUL指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無(wú)符號(hào)數(shù),也可以為有符號(hào)數(shù))的乘法,并將低32位結(jié)果存放到一個(gè)32位的寄存器中。如果S=1,可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR寄存器中相應(yīng)的條件標(biāo)志位。MUL{<cond>}{S}<Rd>,<Rm>,<Rs>注:由于兩個(gè)32位的數(shù)相乘結(jié)果為64位,而MUL指令僅僅保存了64位結(jié)果的低32位,所以對(duì)于有符號(hào)的和無(wú)符號(hào)的操作數(shù)來(lái)說(shuō),MUL指令執(zhí)行的結(jié)果相同。6.2.1數(shù)據(jù)處理指令2)MLA32位帶加數(shù)的乘法指令指令功能為Rd=(Rm*Rs)[31:0]+Rn。MLA指令實(shí)現(xiàn)兩個(gè)32位的數(shù)(可以為無(wú)符號(hào)數(shù),也可為有符號(hào)數(shù))的乘積,再將乘積加上第3個(gè)操作數(shù),并將結(jié)果存放到一個(gè)32位的寄存器中。如果S=1,根據(jù)運(yùn)算結(jié)果更新CPSR寄存器中N和Z標(biāo)志位,更新方法與MUL相同。MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>6.2.1數(shù)據(jù)處理指令3)SMULL、SMLAL、UMULL和UMLAL64位乘法指令SMULL、SMLAL、UMULL和UMLAL為4條64位的乘法指令,指令語(yǔ)法格式如下:<opcode>{cond}{S}<RdLo>,<RdHi>,<Rm>,<Rs>其中:RdHi寄存器存放乘積結(jié)果的高32位數(shù)據(jù),RdLo寄存器存放乘積結(jié)果的低32位數(shù)據(jù)。opcode=SMULL|SMLAL|UMULL|UMLAL,其對(duì)應(yīng)的二進(jìn)制碼分別為0000110|0000111|0000100|0000101。6.2.1數(shù)據(jù)處理指令SMULL64位有符號(hào)數(shù)乘法指令SMULL指令實(shí)現(xiàn)兩個(gè)32位的有符號(hào)數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器的<RdHi>中,乘積結(jié)果的低32位存放到另一個(gè)32位的寄存器<RdLo>中。如果S=1,可以根據(jù)運(yùn)算結(jié)果設(shè)置CPSR寄存器中N和Z條件標(biāo)志位。指令操作的偽代碼如下:ifConditionPassed(cond)then/*cond條件成立*/RdHi=(Rm*Rs)[63:32]RdLo=(Rm*Rs)[31:0]ifS==1thenNFlag=RdHi[31]ZFlag=if(RdHi==0)and(RdLo==0)then1else0CFlag=unaffectedVFlag=unaffected6.2.1數(shù)據(jù)處理指令SMLAL64位帶加數(shù)的有符號(hào)數(shù)乘法指令SMLAL指令將<Rm>和<Rs>兩個(gè)32位的有符號(hào)數(shù)的乘積結(jié)果與<RdHi>和<RdLo>中的64位數(shù)相加,結(jié)果的高32位存放到<RdHi>的寄存器中,結(jié)果的低32位存放到另一個(gè)寄存器<RdLo>中。UMULL64位無(wú)符號(hào)數(shù)乘法指令UMULL指令實(shí)現(xiàn)兩個(gè)32位的無(wú)符號(hào)數(shù)的乘積,乘積結(jié)果的高32位存放到一個(gè)32位的寄存器<RdHi>中,乘積結(jié)果的低32位存放到另一個(gè)32位的寄存器<RdLo>中。6.2.1數(shù)據(jù)處理指令UMLAL64位帶加數(shù)的無(wú)符號(hào)數(shù)乘法指令UMLAL指令將兩個(gè)32位的無(wú)符號(hào)數(shù)的64位乘積結(jié)果與<RdHi>和<RdLo>中的64位無(wú)符號(hào)數(shù)相加,結(jié)果的高32位存放到<RdHi>寄存器中,結(jié)果的低32位存放到另一個(gè)寄存器<RdLo>中。6.2.1數(shù)據(jù)處理指令【例6-8】典型乘法指令的用法舉例MUL R0,R1,R2 ;R0=(R1*R2)[31:0]MULS R0,R1,R2 ;R0=(R1*R2)[31:0],同時(shí)設(shè)置CPSR中N位和Z位MLA R0,R1,R2,R3 ;R0=(R1*R2)[31:0]+R3SMULL R1,R2,R3,R4 ;R1=(R3*R4)[31:0],R2=(R3*R4)[63:32]SMLAL R0,R1,R2,R3 ;R0=(R2*R3)[31:0]+R0,R1=(R2*R3)[63:32]+R1UMULL R1,R2,R3,R4 ;R1=(R3*R4)[31:0],R2=(R3*R4)[63:32]UMLAL R1,R2,R3,R4 ;R1=(R3*R4)[31:0]+R1,R2=(R3*R4)[64:32]+R26.2.2存儲(chǔ)器訪問(wèn)指令RISC處理器的一大特色就是Load/Store架構(gòu),即只有Load/Store指令才能訪問(wèn)存儲(chǔ)器。Load指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中,Store指令用于將寄存器中的數(shù)據(jù)保存到內(nèi)存。ARM的Load/Store指令包括如下3類:(1)單寄存器傳輸指令:?jiǎn)蜗蛟诩拇嫫骱痛鎯?chǔ)器之間傳輸一個(gè)數(shù)據(jù)(2)多寄存器傳輸指令:?jiǎn)蜗蛟诩拇嫫骱痛鎯?chǔ)器之間傳輸多個(gè)數(shù)據(jù)(3)數(shù)據(jù)交換指令:雙向在存儲(chǔ)器和寄存器之間交換一個(gè)數(shù)據(jù),既有取數(shù)據(jù)、又有存數(shù)據(jù)6.2.2存儲(chǔ)器訪問(wèn)指令1.單寄存器傳輸指令1)LDR/LDRB/STR/STRB指令功能指令功能LDR從存儲(chǔ)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中LDRB從存儲(chǔ)器中將一個(gè)8位的無(wú)符號(hào)字節(jié)數(shù)據(jù)傳送到目的寄存器中的低8位,高24位補(bǔ)0STR將目的寄存器中的32位數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器中STRB將目的寄存器中的低8位數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器中注:當(dāng)程序計(jì)數(shù)器PC作為L(zhǎng)DR指令的目的寄存器時(shí),指令從存儲(chǔ)器中讀取的字?jǐn)?shù)據(jù)被當(dāng)做指令地址,從而可以實(shí)現(xiàn)程序流程的跳轉(zhuǎn)6.2.2存儲(chǔ)器訪問(wèn)指令指令的編碼格式cond為條件碼。I為尋址模式指示位,1代表addr_mode是寄存器移位尋址模式,0代表addr_mode是12位立即數(shù)。P為變址方式指示位,1代表前變址,0代表后變址。U為運(yùn)算指示位,1代表做加法,0代表做減法。B為字節(jié)訪問(wèn)指示位,0代表32位的存儲(chǔ),1代表8位存儲(chǔ)。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為L(zhǎng)oad指令,0代表為Store指令。Rn為基址寄存器,存儲(chǔ)器地址是Rn和addr_mode運(yùn)算的結(jié)果。Rd為目的寄存器。addr_mode為另一個(gè)操作數(shù)的尋址模式,可以為12位立即數(shù)或寄存器移位尋址。6.2.2存儲(chǔ)器訪問(wèn)指令指令的語(yǔ)法格式opcode=LDR|STR。addressing_mode用來(lái)指定存儲(chǔ)器的地址,與I、P、U和W位的設(shè)置相關(guān),一般為Rn和addr_mode運(yùn)算的結(jié)果。<opcode>{<cond>}{B}<Rd>,<addressing_mode>6.2.2存儲(chǔ)器訪問(wèn)指令1.單寄存器傳輸指令2)LDRH/LDRSH/LDRSB/STRH指令功能指令功能LDRH從存儲(chǔ)器中將一個(gè)16位的無(wú)符號(hào)半字?jǐn)?shù)據(jù)傳送到目的寄存器低16位,高16位補(bǔ)0LDRSH從存儲(chǔ)器中將一個(gè)16位的有符號(hào)半字?jǐn)?shù)據(jù)傳送到目的寄存器低16位,高16位補(bǔ)符號(hào)位LDRSB從存儲(chǔ)器中將一個(gè)8位的有符號(hào)字節(jié)數(shù)據(jù)傳送到目的寄存器低8位,高24位補(bǔ)符號(hào)位STRH將目的寄存器中的低16位數(shù)據(jù)存儲(chǔ)到存儲(chǔ)器中6.2.2存儲(chǔ)器訪問(wèn)指令指令的編碼格式cond為條件碼。P為變址方式指示位,1代表前變址,0代表后變址。U為運(yùn)算指示位,1代表做加法,0代表做減法。I為尋址模式指示位,1代表addr_mode是8位立即數(shù),0代表addr_mode是寄存器尋址模式,此時(shí)addr_mode[11:8]=SBZ。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為L(zhǎng)oad指令,0代表為Store指令。Rn為基址寄存器,存儲(chǔ)器地址是Rn和addr_mode運(yùn)算的結(jié)果。Rd為目的寄存器。addr_mode為另一個(gè)操作數(shù)的尋址模式,可以為8位立即數(shù)或寄存器尋址。S為有符號(hào)加載指示位,1代表為有符號(hào)加載,0代表無(wú)符號(hào)加載。H為半字訪問(wèn)指示位,1代表16位的數(shù)據(jù)傳輸,0代表8位的數(shù)據(jù)傳輸。6.2.2存儲(chǔ)器訪問(wèn)指令指令的語(yǔ)法格式opcode=LDR|STR,type=H|SH|SB。addressing_mode用來(lái)指定存儲(chǔ)器操作數(shù)的地址,與P、U、I和W位的設(shè)置相關(guān),一般為Rn和addr_mode運(yùn)算的結(jié)果。<opcode>{<cond>}<type><Rd>,<addressing_mode>6.2.2存儲(chǔ)器訪問(wèn)指令【例6-9】設(shè)R1=0x9008、R2=0xA5B45A4B、R3=0xFFFFFFFC,存儲(chǔ)器內(nèi)容如圖6-1所示(16進(jìn)制表示,小端訪問(wèn)),在不考慮指令前后影響條件下,下面每條指令執(zhí)行后的寄存器或存儲(chǔ)器的值為多少?地址0123456789ABCDEF0000900070717273808182830000FFFF4BB4B44B00009010A0A1A2A3B0B1B2B3FF000000A5A55A5A6.2.2存儲(chǔ)器訪問(wèn)指令LDR R0,[R1]
LDR R0,[R1,#12]
LDR R0,[R1,R3]LDR R0,[R1,#16]! LDR R0,[R1],#16 LDRB R0,[R1,#2]
STR R2,[R1,#4] STRB R2,[R1,#9]!
R0←Mem[R1,4],即R0=0xFFFF0000R0←Mem[R1+12,4],即R0=0xB3B2B1B0R0←Mem[R1+R3,4],即R0=0x83828180R0←Mem[R1+16,4],R1←R1+16,即R0=0xFF,R1=0x9018R0←Mem[R1,4],R1←R1+16,即R0=0xFFFF0000,R1=0x9018R0←ZeroExtend(Mem[R1+2,1]),即R0=0xFFMem[R1+4,4]←R2,即地址0x900C開始4個(gè)字節(jié)為4B,5A,B4和A5Mem[R1+9,1]←R2[7:0],R1←R1+9,即地址0x9011處為4B,R1=0x90116.2.2存儲(chǔ)器訪問(wèn)指令LDRH R0,[R1] LDRH R0,[R1,#2] LDRSHR0,[R1,R3]
LDRSHR0,[R1],#2
LDRSBR0,[R1,#3] STRHR2,[R1,#6] R0←ZeroExtend(Mem[R1,2]),即R0=0R0←ZeroExtend(Mem[R1+2,2]),即R0=0xFFFFR0←SignExtend(Mem[R1+R3,2]),即R0=0xFFFF8180R0←SignExtend(Mem[R1,2]),R1←R1+2,即R0=0,R1=0x900AR0←SignExtend(Mem[R1+3,1]),即R0=0xFFFFFFFFMem[R1+6]←R2[15:0],即地址0x900E開始2個(gè)字節(jié)為4B,5A6.2.2存儲(chǔ)器訪問(wèn)指令2.批量數(shù)據(jù)加載/存儲(chǔ)指令A(yù)RM處理器支持批量數(shù)據(jù)加載/存儲(chǔ)指令,可以一條指令實(shí)現(xiàn)在地址連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送多個(gè)字?jǐn)?shù)據(jù)。
具體來(lái)說(shuō),批量數(shù)據(jù)加載指令LDM可以從地址連續(xù)的存儲(chǔ)器中讀取多個(gè)字?jǐn)?shù)據(jù),傳送到指令中指定的多個(gè)寄存器;批量數(shù)據(jù)存儲(chǔ)指令STM可以將指令中寄存器列表中的各個(gè)寄存器的值寫入到地址連續(xù)的存儲(chǔ)器中。
LDM/STM指令的常見用途是將多個(gè)寄存器的內(nèi)容入?;虺鰲?。6.2.2存儲(chǔ)器訪問(wèn)指令指令的編碼格式cond為條件碼。P為變址方式指示位,1代表前變址,0代表后變址。U為運(yùn)算指示位,1代表做加法,0代表做減法。W為回寫指示位,0代表地址不回寫到Rn,1代表回寫到Rn。L為加載指示位,1代表為L(zhǎng)DM指令,0代表為STM指令。Rn為基址寄存器。register_list為寄存器列表,R0-R15每個(gè)寄存器1位,總共16位。6.2.2存儲(chǔ)器訪問(wèn)指令指令的語(yǔ)法格式addr_mode,用來(lái)指示存儲(chǔ)器地址如何進(jìn)行變化,必須為以下8種情況LDM|STM{<cond>}<addr_mode><Rn>{!},<register_list>{^}用于為數(shù)據(jù)塊傳送操作,稱為塊拷貝尋址模式;IA:每次傳送后地址加4;IB:每次傳送前地址加4;DA:每次傳送后地址減4;DB:每次傳送前地址減4;用于堆棧操作,稱為堆棧尋址模式。FD:滿遞減堆棧;ED:空遞減堆棧;FA:滿遞增堆棧;EA:空遞增堆棧。6.2.2存儲(chǔ)器訪問(wèn)指令2.批量數(shù)據(jù)加載/存儲(chǔ)指令在進(jìn)行數(shù)據(jù)復(fù)制時(shí),即從存儲(chǔ)器中把一段數(shù)據(jù)復(fù)制到另外一個(gè)位置時(shí),一般采用塊拷貝尋址模式。此時(shí),需要先設(shè)置好源指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進(jìn)行讀取和存儲(chǔ)。在進(jìn)行程序現(xiàn)場(chǎng)保護(hù)時(shí),即要把多個(gè)寄存器的值放入堆棧,或現(xiàn)場(chǎng)恢復(fù)時(shí),即從堆棧取出多個(gè)寄存器的值時(shí),一般采用堆棧尋址模式。此時(shí),需要先設(shè)置好堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實(shí)現(xiàn)堆棧操作。6.2.2存儲(chǔ)器訪問(wèn)指令【例6-10】設(shè)R4=0x8010,分析下面塊拷貝STM指令執(zhí)行后的R4及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMIA R4!,{R0-R3}STMIB R4!,{R0-R3}STMDA R4!,{R0-R3}STMDB R4!,{R0-R3}6.2.2存儲(chǔ)器訪問(wèn)指令【例6-10】設(shè)R4=0x8010,分析下面塊拷貝STM指令執(zhí)行后的R4及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMIA R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲(chǔ)器中,每次傳送后地址加4,存儲(chǔ)器值如圖6-2(a)所示,最后的地址寫入基址寄存器R4中,R4=0x8020。
8010HR0
8014HR1
8018HR2
801CHR3R4→8020H
6.2.2存儲(chǔ)器訪問(wèn)指令【例6-10】設(shè)R4=0x8010,分析下面塊拷貝STM指令執(zhí)行后的R4及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMIB R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲(chǔ)器中,每次傳送前地址加4,存儲(chǔ)器值如圖6-2(b)所示,最后的地址寫入基址寄存器R4中,R4=0x8020。
8010H
8014HR0
8018HR1
801CHR2R4→8020HR36.2.2存儲(chǔ)器訪問(wèn)指令【例6-10】設(shè)R4=0x8010,分析下面塊拷貝STM指令執(zhí)行后的R4及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMDA R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲(chǔ)器中,每次傳送后地址減4,存儲(chǔ)器值如圖6-2(c)所示,最后的地址寫入基址寄存器R4中,R4=0x8000。R4→8000H
8004HR0
8008HR1
800CHR2
8010HR36.2.2存儲(chǔ)器訪問(wèn)指令【例6-10】設(shè)R4=0x8010,分析下面塊拷貝STM指令執(zhí)行后的R4及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMDB R4!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器R4指向的存儲(chǔ)器中,每次傳送前地址減4,存儲(chǔ)器值如圖6-2(d)所示,最后的地址寫入基址寄存器R4中,R4=0x8000。R4→8000HR0
8004HR1
8008HR2
800CHR3
8010H
6.2.2存儲(chǔ)器訪問(wèn)指令【例6-11】設(shè)SP=0x8010,分析下面STM指令執(zhí)行后的SP及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMEA SP!,{R0-R3}STMFA SP!,{R0-R3}STMED SP!,{R0-R3}STMFD SP!,{R0-R3}6.2.2存儲(chǔ)器訪問(wèn)指令【例6-11】設(shè)SP=0x8010,分析下面STM指令執(zhí)行后的SP及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMEA SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲(chǔ)器中,每次傳送后地址加4,存儲(chǔ)器值如圖6-3(a)所示,最后的地址寫入基址寄存器SP中,SP=0x8020。
8010HR0
8014HR1
8018HR2
801CHR3SP→8020H
6.2.2存儲(chǔ)器訪問(wèn)指令【例6-11】設(shè)SP=0x8010,分析下面STM指令執(zhí)行后的SP及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMFA SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲(chǔ)器中,每次傳送前地址加4,存儲(chǔ)器值如圖6-3(b)所示,最后的地址寫入基址寄存器SP中,SP=0x8020。
8010H
8014HR0
8018HR1
801CHR2SP→8020HR36.2.2存儲(chǔ)器訪問(wèn)指令【例6-11】設(shè)SP=0x8010,分析下面STM指令執(zhí)行后的SP及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMED SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲(chǔ)器中,每次傳送后地址減4,存儲(chǔ)器值如圖6-3(c)所示,最后的地址寫入基址寄存器SP中,SP=0x8000。SP→8000H
8004HR0
8008HR1
800CHR2
8010HR36.2.2存儲(chǔ)器訪問(wèn)指令【例6-11】設(shè)SP=0x8010,分析下面STM指令執(zhí)行后的SP及存儲(chǔ)器的值(不考慮指令執(zhí)行相互間的影響)。STMFD SP!,{R0-R3}將寄存器列表中的{R0-R3}存入到基址寄存器SP指向的存儲(chǔ)器中,每次傳送前地址減4,存儲(chǔ)器值如圖6-3(d)所示,最后的地址寫入基址寄存器SP中,SP=0x8000。SP→8000HR0
8004HR1
8008HR2
800CHR3
8010H
6.2.2存儲(chǔ)器訪問(wèn)指令3、數(shù)據(jù)交換指令數(shù)據(jù)交換指令能在存儲(chǔ)器和寄存器之間實(shí)現(xiàn)雙向數(shù)據(jù)傳輸,既有存數(shù)據(jù),也有加載數(shù)據(jù)。數(shù)據(jù)交換指令包括SWP和SWPB兩條,SWP實(shí)現(xiàn)字?jǐn)?shù)據(jù)(32位)交換,SWPB實(shí)現(xiàn)字節(jié)數(shù)據(jù)(8位)交換。指令的編碼格式B=1代表SWPB指令,B=0代表SWP指令。6.2.2存儲(chǔ)器訪問(wèn)指令【例6-12】SWP指令用法舉例。SWP R0,R1,[R2]
SWPB R0,R1,[R2]將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R0,同時(shí)將R1中的字?jǐn)?shù)據(jù)傳送到R2所指向的存儲(chǔ)單元將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到R0,R0的高24位清零,同時(shí)將R1的低8位數(shù)據(jù)傳送到R2所指向的存儲(chǔ)單元6.2.3跳轉(zhuǎn)指令跳轉(zhuǎn)指令用于改變程序的順序執(zhí)行流程,實(shí)現(xiàn)流程跳轉(zhuǎn)。在ARMv5指令集中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn):跳轉(zhuǎn)指令;直接向程序計(jì)數(shù)器PC(R15)中寫入目標(biāo)地址值??梢詫?shí)現(xiàn)在4GB的地址空間中任意跳轉(zhuǎn),這種跳轉(zhuǎn)指令又稱為長(zhǎng)跳轉(zhuǎn)。6.2.3跳轉(zhuǎn)指令A(yù)RM的跳轉(zhuǎn)指令可以在當(dāng)前指令向前或向后的32MB的地址空間跳轉(zhuǎn)。這類跳轉(zhuǎn)指令有如下4種:1)B{cond},最基本的跳轉(zhuǎn)指令。2)BX{cond},帶狀態(tài)切換的跳轉(zhuǎn)指令。3)BL{cond},帶返回的跳轉(zhuǎn)指令。4)BLX{cond},帶返回和狀態(tài)切換的跳轉(zhuǎn)指令。6.2.3跳轉(zhuǎn)指令1.B/BL指令指令的編碼格式L=1,代表為BL指令,否則為B指令。signed_immed_24為有符號(hào)的24位立即數(shù),代表相對(duì)當(dāng)前PC的偏移數(shù)。6.2.3跳轉(zhuǎn)指令1.B/BL指令指令的語(yǔ)法格式L決定是否保存返回地址。當(dāng)有L時(shí),將緊跟在跳轉(zhuǎn)指令之后指令的地址保存到LR寄存器中;當(dāng)沒有L時(shí),跳轉(zhuǎn)指令之后指令的地址將不會(huì)保存到LR寄存器中。B{L}{cond}<target_address>target_address為指令跳轉(zhuǎn)的目標(biāo)地址,其計(jì)算方法如下:將指令中的24位帶符號(hào)的二進(jìn)制立即數(shù)擴(kuò)展為30位。將此30位數(shù)左移兩位以形成32位值。將得到的值與PC寄存器的值做加法,即得到跳轉(zhuǎn)的目標(biāo)地址。跳轉(zhuǎn)的范圍大致為-32MB~+32MB6.2.3跳轉(zhuǎn)指令【例6-13】B及BL指令的使用。BWAITA ;程序跳轉(zhuǎn)到標(biāo)號(hào)WAITA處執(zhí)行B0x1234 ;程序跳轉(zhuǎn)到絕度地址0x1234處BLLabel ;先將下一條指令的地址保存到LR,再跳轉(zhuǎn)到Label處6.2.3跳轉(zhuǎn)指令2.BX指令指令的編碼格式BX(BranchandExchange)指令跳轉(zhuǎn)到指令中指定的目標(biāo)地址,目標(biāo)地址處的指令可以是ARM指令,也可以是Thumb指令,具體由寄存器Rm的bit[0]決定。6.2.3跳轉(zhuǎn)指令2.BX指令指令的語(yǔ)法格式其中,Rm寄存器中為跳轉(zhuǎn)的目標(biāo)地址。當(dāng)Rm寄存器的bit[0]=0時(shí),目標(biāo)地址處的指令為ARM指令;當(dāng)bit[0]=1時(shí),目的地址處的指令為Thumb指令。BX{<cond>}Rm6.2.3跳轉(zhuǎn)指令指令操作的偽代碼:ifConditionPassed(cond)thenCPSRTbit=Rm[0]PC=RmAND0xFFFFFFFE指令的使用:ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0BX R0 ;跳轉(zhuǎn)到R0指定的地址6.2.3跳轉(zhuǎn)指令3.BLX指令(1)BLX(1)指令指令的編碼格式BLX(1)是無(wú)條件執(zhí)行指令。BLX(1)指令一定會(huì)跳轉(zhuǎn)到指令中指定的目標(biāo)地址,并將程序狀態(tài)切換為Thumb狀態(tài),同時(shí)將返回地址保存到LR寄存器中。通常,BLX(1)用于在ARM程序中調(diào)用Thumb指令的子程序。6.2.3跳轉(zhuǎn)指令3.BLX指令(1)BLX(1)指令BLX(1)指令的語(yǔ)法格式target_address為指令跳轉(zhuǎn)的目標(biāo)地址,其計(jì)算方法如下:1)將指令中的24位帶符號(hào)的二進(jìn)制立即數(shù)擴(kuò)展為30位。2)將此30位數(shù)左移兩位以形成32位值。3)將上步得到的32位數(shù)的bit[1]設(shè)置為H(H即指令編碼中的bit[24])。4)將上步得到的32位數(shù)與PC寄存器的內(nèi)容做加法,結(jié)果即為跳轉(zhuǎn)的目標(biāo)地址。BLX<target_address>6.2.3跳轉(zhuǎn)指令3.BLX指令(2)BLX(2)指令指令的編碼格式BLX(2)指令從ARM指令集跳轉(zhuǎn)到指令中指定的目標(biāo)地址,目標(biāo)地址的指令可以是ARM指令,也可以是Thumb指令。目標(biāo)地址放在寄存器Rm中,目標(biāo)地址處的指令類型由Rm的bit[0]決定。同時(shí),該指令也將返回地址保存到LR寄存器中。6.2.3跳轉(zhuǎn)指令3.BLX指令(2)BLX(2)指令指令的語(yǔ)法格式其中,Rm寄存器中為跳轉(zhuǎn)的目標(biāo)地址。當(dāng)Rm的bit[0]=0時(shí),目標(biāo)地址處的指令為ARM指令;當(dāng)bit[0]=1時(shí),目標(biāo)地址處的指令為Thumb指令。當(dāng)Rm為R15時(shí),會(huì)產(chǎn)生不可預(yù)知的結(jié)果。BLX{<cond>}Rm6.2.4雜項(xiàng)指令(1)SWI(軟中斷指令)SWI用于產(chǎn)生軟件中斷,ARM通過(guò)這種機(jī)制實(shí)現(xiàn)在用戶模式對(duì)操作系統(tǒng)中特權(quán)模式的程序的調(diào)用。指令的編碼格式指令的語(yǔ)法格式SWI{<cond>}<immed_24>6.2.4雜項(xiàng)指令(1)SWI(軟中斷指令)指令 SWI{<cond>}<immed_24>參數(shù)傳遞的方法:指令中24位的立即數(shù)指定了用戶請(qǐng)求的服務(wù)類型,參數(shù)通過(guò)通用寄存器傳遞。指令中的24位立即數(shù)被忽略,用戶請(qǐng)求的服務(wù)類型由寄存器R0的數(shù)值決定,參數(shù)通過(guò)其他的通用寄存器傳遞。指令的使用:MOV R0,#34 ;通過(guò)寄存器R0傳遞參數(shù)SWI 12 ;產(chǎn)生軟件中斷,調(diào)用操作系統(tǒng)編號(hào)為12的系統(tǒng)例程6.2.4雜項(xiàng)指令(2)狀態(tài)寄存器讀指令MRSMRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。當(dāng)需要改變程序狀態(tài)寄存器的內(nèi)容時(shí),可用MRS指令將程序狀態(tài)寄存器的內(nèi)容讀入通用寄存器,修改后再寫回程序狀態(tài)寄存器。當(dāng)在異常中斷或進(jìn)程切換時(shí),需要保存當(dāng)前程序狀態(tài)寄存器值,可先用MRS指令讀出程序狀態(tài)寄存器的值,然后保存。6.2.4雜項(xiàng)指令(2)狀態(tài)寄存器讀指令MRS指令的編碼格式指令的語(yǔ)法格式MRS{<cond>}<Rd>,PSRRd為通用寄存器,PSR為當(dāng)前狀態(tài)寄存器CPSR或備份狀態(tài)寄存器SPSR,由R位(即bit[22])指定。6.2.4雜項(xiàng)指令(3)狀態(tài)寄存器寫指令MSRMSR指令用于將通用寄存器的內(nèi)容或一個(gè)立即數(shù)傳送到狀態(tài)寄存器特定域中,即用于恢復(fù)狀態(tài)寄存器的內(nèi)容或者改變狀態(tài)寄存器的內(nèi)容。在使用時(shí),建議在MSR指令中指明將要操作的域。指令的語(yǔ)法格式MSR{<cond>}PSR_<fields>,<Operand2>注:PSR=CPSR|SPSR,fields=f|s|x|c,Operand2=#immediate|Rm6.2.4雜項(xiàng)指令(3)狀態(tài)寄存器寫指令MSRI位(即bit[25])用來(lái)指定Operand2的形式,I=0則Operand2來(lái)源于Rm寄存器;I=1則Operand2由4位循環(huán)右移立即數(shù)rotate_imm_4和8位立即數(shù)imm_8構(gòu)成;R位用來(lái)指定是哪個(gè)狀態(tài)寄存器,用法同MRS指令;field_mask用來(lái)指定操作的域。field_mask(即bit[19:16])每位依次代表操作狀態(tài)寄存器的標(biāo)志位域(PSR[31:24])、狀態(tài)位域(PSR[23:16])、擴(kuò)展位域(PSR[15:8])和控制位域(PSR[7:0])MSR指令的編碼格式6.2.4雜項(xiàng)指令(3)狀態(tài)寄存器寫指令MSRI位(即bit[25])用來(lái)指定Operand2的形式,I=0則Operand2來(lái)源于Rm寄存器;I=1則Operand2由4位循環(huán)右移立即數(shù)rotate_imm_4和8位立即數(shù)imm_8構(gòu)成;R位用來(lái)指定是哪個(gè)狀態(tài)寄存器,用法同MRS指令;field_mask用來(lái)指定操作的域。field_mask(即bit[19:16])每位依次代表操作狀態(tài)寄存器的標(biāo)志位域(PSR[31:24])、狀態(tài)位域(PSR[23:16])、擴(kuò)展位域(PSR[15:8])和控制位域(PSR[7:0])MSR指令的編碼格式6.2.4雜項(xiàng)指令(3)狀態(tài)寄存器寫指令MSR【例6-14】MRS和MSR指令使用舉例。MRSR0,CPSR ;ReadtheCPSRBICR0,R0,#0xF0000000 ;CleartheN,Z,CandVbitsMSRCPSR_f,R0 ;UpdatetheflagbitsintheCPSR
;N,Z,CandVflagsnowallclearMRSR0,CPSR ;ReadtheCPSRORRR0,R0,#0x80 ;SettheinterruptdisablebitMSRCPSR_c,R0 ;UpdatethecontrolbitsintheCPSR
;interrupts(IRQ)nowdisabledMRSR0,CPSR ;ReadtheCPSRBICR0,R0,#0x1F ;ClearthemodebitsORRR0,R0,#0x11 ;SetthemodebitstoFIQmodeMSRCPSR_c,R0 ;UpdatethecontrolbitsintheCPSR
;nowinFIQmode/036.3Thumb指令集6.3.1Thumb指令集概述Thumb指令集是對(duì)ARM指令集重新編碼得到的子集,它旨在增強(qiáng)使用16位或更窄數(shù)據(jù)總線實(shí)現(xiàn)的ARM處理器的性能和提供比ARM指令集更好的代碼密度。
ARM指令集的T變種同時(shí)包含32位的ARM指令集和16位Thumb指令集。在ARMv6及以上指令版本中,Thumb指令集支持是必需的。所有的Thumb數(shù)據(jù)處理指令仍然支持32位的操作,指令和數(shù)據(jù)的尋址空間也仍然是32位。6.3.1Thumb指令集概述大多數(shù)Thumb指令是無(wú)條件執(zhí)行的大多數(shù)Thumb指令采用2地址格式要實(shí)現(xiàn)相同的程序功能,所需的Thumb指令的條數(shù)要比ARM指令多。Thumb代碼所需的存儲(chǔ)空間為ARM代碼的60%~70%。Thumb代碼使用的指令數(shù)比ARM代碼多30%~40%。若使用16位的存儲(chǔ)器,Thumb代碼比ARM代碼快40%~50%。與ARM代碼相比,使用Thumb代碼,存儲(chǔ)器的功耗會(huì)降低約30%。6.3.2Thumb指令集編碼白底黑字:統(tǒng)一中文字體為微軟雅黑,英文為Arial字號(hào)20—28可適當(dāng)調(diào)節(jié)得體即可6.3.2Thumb指令集編碼白底黑字:統(tǒng)一中文字體為微軟雅黑,英文為Arial字號(hào)20—28可適當(dāng)調(diào)節(jié)得體即可6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對(duì)照表Thumb指令A(yù)RM指令說(shuō)明操作MOVRd,#expr8MOVRd,RmMOVRd,operand2數(shù)據(jù)傳送Rd←#expr8Rd←RmMVNRd,RmMVNRd,operand2數(shù)據(jù)非傳送Rd←(~Rm)ADDRd,Rn,#expr3ADDRd,#expr8ADDRd,Rn,RmADDRd,RmADDRd,Rp,#expr8*4ADDSP,#expr7*4ADDRd,Rn,operand2加法運(yùn)算Rd←Rn+#expr3Rd←Rd+expr8Rd←Rn+RmRd←Rd+RmRd←SP|PC+expr8*4SP←SP+expr7*46.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對(duì)照表SUBRd,Rn,#expr3SUBRd,#expr8SUBRd,Rn,RmSUBSP,#expr7*4SUBRd,Rn,operand2減法運(yùn)算Rd←Rn-#expr3Rd←Rd-expr8Rd←Rn-RmSP←SP-expr7*4ADCRd,RmADCRd,Rn,operand2帶進(jìn)位加法Rd←Rd+Rm+CSBCRd,RmSBCRd,Rn,operand2帶進(jìn)位減法Rd←Rd-Rm-(NOTC)ANDRd,RmANDRd,Rn,operand2邏輯與Rd←Rd&RmORRRd,RmORRRd,Rn,operand2邏輯或Rd←Rd|RmEORRd,RmEORRd,Rn,operand2邏輯異或Rd←Rd^RmBICRd,RmBICRd,Rn,operand2位清除Rd←Rd&(~Rm)6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對(duì)照表CMPRn,#expr8CMPRn,RmCMPRn,operand2比較狀態(tài)標(biāo)志←Rn-#expr8狀態(tài)標(biāo)志←Rn-RmCMNRn,RmCMNRn,operand2負(fù)數(shù)比較狀態(tài)標(biāo)志←Rn+RmTSTRn,RmTSTRn,operand2位測(cè)試狀態(tài)標(biāo)志←Rn&RmMULRn,RmMULRd,Rm,Rs32位乘法Rd←Rd*Rm6.3.3Thumb指令集舉例部分Thumb指令和ARM指令的對(duì)照表LDRRd,[Rn,#expr5*4]LDRRd,[Rn,Rm]LDRRd,[Rp,#expr8*4]LDRRd,addressing加載字?jǐn)?shù)據(jù)Rd←[Rn,#expr5*4]Rd←[Rn,Rm]Rd←[PC|SP,#expr8*4]STRRd,[Rn,#expr5*4]STRRd,[Rn,Rm]STRRd,[SP,#expr8*4]STRRd,addressing存儲(chǔ)字?jǐn)?shù)據(jù)[Rn,#expr5*4]←Rd[Rn,Rm]←Rd[SP,#expr8*4]←Rd/046.4ARM指令的尋址方式6.4.1尋址方式的類型1.立即數(shù)尋址立即數(shù)尋址是一種特殊的尋址方式,操作數(shù)就在指令編碼中給出,只要取出指令也就得到了操作數(shù),故而這個(gè)操作數(shù)被稱為立即數(shù)。如下面指令:MOVR3,#0x3A ;將十六進(jìn)制數(shù)3a放到寄存器R3中,即R3=0x3A在上面的指令中,第2個(gè)源操作數(shù)即為立即數(shù),實(shí)際使用時(shí)以“#”符號(hào)作為前綴。十六進(jìn)制的立即數(shù)在“#”后面加“0x”,以二進(jìn)制表示的立即數(shù)在“#”后面加“%”,以十進(jìn)制表示的立即數(shù)直接跟在“#”后。6.4.1尋址方式的類型2.寄存器尋址操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。寄存器尋址是各類處理器經(jīng)常采用的一種尋址方式。在下面所示的指令中,R2即為寄存器尋址。MOVR1,R2 ;將R2的數(shù)值放到R1中ADDR0,R1,R2 ;將R1和R2中的數(shù)值相加,然后賦值給R06.4.1尋址方式的類型3.寄存器間接尋址寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在以寄存器的值作為地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。如下面的指令:LDR R1,[R2] ;將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出保存在R1中6.4.1尋址方式的類型4.基址變址尋址基址變址尋址方式就是將寄存器(該寄存器一般稱為基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加/減,從而得到一個(gè)操作數(shù)的有效地址?;穼ぶ酚糜谠L問(wèn)基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問(wèn)等。寄存器間接尋址是偏移量為0的基址加偏移尋址。如下面的指令:LDRR0,[R1,#4] ;將寄存器R1的內(nèi)容加上4形成操作數(shù)的有效地址LDRR0,[R1],#4 ;將寄存器R1的值作為內(nèi)存地址加載第2個(gè)操作數(shù)
;到R0;加載完成后,R1的值加4保存。LDRR0,[R1,R2] ;將R1+R2的值作為操作數(shù)的地址6.4.1尋址方式的類型5.多寄存器尋址一次可以傳送幾個(gè)寄存器的值,允許一條指令傳送16個(gè)寄存器的任何子集。LDMIA R1!,{R2-R7} ;{R2-R7}即為多寄存器尋址STMIA R0!,{R2-R7} ;{R2-R7}即為多寄存器尋址6.4.1尋址方式的類型6.寄存器移位尋址寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。6.4.1尋址方式的類型6.寄存器移位尋址寄存器移位選址舉例如下:MOV R0,R1,LSL#3
;“R1,LSL#3”代表對(duì)R1進(jìn)行邏輯左移3位操作ANDS R1,R1,R2,LSR#3 ;“R2,LSR#3”代表對(duì)R2進(jìn)行邏輯右移3位操作6.4.1尋址方式的類型7.相對(duì)尋址與基址變址尋址方式類似,但相對(duì)尋址由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址標(biāo)號(hào)作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。BL SUBR1 ;調(diào)用到SUBR1子程序
BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處
...LOOP ;LOOP標(biāo)號(hào)
MOV R6,#1 ...SUBR1 ;子程序SUBR1的入口標(biāo)號(hào)...6.4.1尋址方式的類型8.堆棧尋址堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(FirstInLastOut,FILO)的方式工作,使用一個(gè)稱為堆棧指針的專用寄存器(ARM指令中,通常都采用R13寄存器作為堆棧寄存器SP)指示當(dāng)前的操作位置,堆棧指針總是指向棧頂。根據(jù)堆棧的生成方式,堆棧又可以分為遞增堆棧(AscendingStack)和遞減堆棧(DecendingStack)。當(dāng)堆棧由低地址向高地址生成時(shí),稱為遞增堆棧;當(dāng)堆棧由高地址向低地址生成時(shí),稱為遞減堆棧。根據(jù)堆棧指針指向的地址是否存有有效數(shù)據(jù),堆棧又可以分為滿堆棧(FullStack)和空堆棧(EmptyStack)。當(dāng)堆棧指針指向的地址存有有效數(shù)據(jù)時(shí),稱為滿堆棧;否則,堆棧指針指向下一個(gè)要放入的空位置,稱為空堆棧(EmptyStack)。6.4.1尋址方式的類型8.堆棧尋址1) 滿遞增堆棧(FA):堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成;2) 滿遞減堆棧(FD):堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成;3) 空遞增堆棧(EA):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成;4) 空遞減堆棧(ED):堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成。LDMFASP!,{R2-R7} ;FA指定滿遞增堆棧方式STMEASP!,{R2-R7} ;EA指定空遞增堆棧方式6.4.1尋址方式的類型9.塊拷貝尋址塊拷貝尋址與堆棧尋址類似,主要用于LDM/STM指令中的存儲(chǔ)器地址的變化方式,只不過(guò)此時(shí)基址寄存器一般為R0-R12中的一個(gè)。1) IA:每次傳送后地址加4;2) IB:每次傳送前地址加4;3) DA:每次傳送后地址減4;4) DB:每次傳送前地址減4。LDMIAR0!,{R2-R7} ;IA指定每次傳送后地址加4STMIBR6!,{R2-R7} ;IB指定每次傳送前地址加46.4.2具體尋址方式1)#<immediate>采用立即數(shù)尋址方式指定shifter_operand。此時(shí),立即數(shù)immediate可以為32位立即數(shù)。MOVR4,#0x8000000A ;#0x8000000A為合法立即數(shù),可由8位的0xA8
;循環(huán)右移4位得到ADDR1,R2,#0x3F0 ;#0x3F0可以由0x3F循環(huán)右移28位得到ADDR1,R2,#0x3FF ;#0x3FF為非法立即數(shù),此條指令匯編會(huì)報(bào)錯(cuò)1.數(shù)據(jù)處理指令的第2操作數(shù)的具體形式6.4.2具體尋址方式2)<Rm>采用寄存器尋址方式指定shifter_operand。此時(shí),12位shifter_operand的編碼為:bits[3:0]=Rm,其它8位全部為0;shifter_operand為Rm的值。3)<Rm>,LSL#<shift_imm>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對(duì)Rm的值邏輯左移shift_imm位。此時(shí),12位shifter_operand的編碼為:bits[11:7]=shift_imm,bits[3:0]=Rm,bits[6:4]=000。6.4.2具體尋址方式4)<Rm>,LSL<Rs>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對(duì)Rm的值邏輯左移,左移多少位由Rs的內(nèi)容決定。此時(shí),12位shifter_operand的編碼為:bits[11:8]=Rs,bits[3:0]=Rm,bits[7:4]=0001。5)<Rm>,LSR#<shift_imm>采用寄存器移位尋址方式指定shifter_operand。這種尋址方式中,是對(duì)Rm的值邏輯右移shift_imm位。此時(shí),12位shifter_operand的編碼為:bits[11:7]=shift_imm,bits[6:4]=010,b
溫馨提示
- 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級(jí)綜合實(shí)踐教學(xué)計(jì)劃
- 部編版三年級(jí)下冊(cè)語(yǔ)文復(fù)習(xí)計(jì)劃
- 青島飛洋職業(yè)技術(shù)學(xué)院《中國(guó)歷史要籍介紹及選讀1》2023-2024學(xué)年第一學(xué)期期末試卷
- 機(jī)器人行業(yè)無(wú)人駕駛汽車控制系統(tǒng)研發(fā)方案
- 韓國(guó)兒童文學(xué)作品征文
- 攝影行業(yè)高端影像設(shè)備研發(fā)與應(yīng)用方案
- 幼兒園中班戶外活動(dòng)方案模版(二篇)
- 財(cái)務(wù)文員的工作職責(zé)(3篇)
- 中心小學(xué)學(xué)校消防安全制度(4篇)
- 2024年學(xué)校年終工作總結(jié)范例(2篇)
- Unit 4 Lesson 1 Avatars 教案 高中英語(yǔ)新北師大版必修第二冊(cè)(2022-2023學(xué)年)
- 日積月累 詳細(xì)版課件
- 2022年軍事理論各章節(jié)知識(shí)點(diǎn)總結(jié)
- 安全安全帶檢查記錄表
- GB∕T 26520-2021 工業(yè)氯化鈣-行業(yè)標(biāo)準(zhǔn)
- 四年級(jí)公共安全教育全冊(cè)教案(海峽教育出版社)
- 久其報(bào)表軟件基本操作流程正式版
- 新部編人教版四年級(jí)下冊(cè)道德與法治全冊(cè)教案(教學(xué)設(shè)計(jì))
- DB34-T 4203-2022 豬腸外致病性大腸桿菌分離鑒定規(guī)程
- 澳門回歸國(guó)旗下主題講話范文
- 電子課件《英語(yǔ)(第一冊(cè))(第三版)》A013820英語(yǔ)第一冊(cè)第三版Unit4
評(píng)論
0/150
提交評(píng)論