PPT-ARM指令集_第1頁
PPT-ARM指令集_第2頁
PPT-ARM指令集_第3頁
PPT-ARM指令集_第4頁
PPT-ARM指令集_第5頁
已閱讀5頁,還剩80頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、0:361第三章 ARM指令集3.1 ARM指令集概述3.2 ARM尋址方式3.3 ARM指令詳細介紹 0:3623.1 ARM指令集概述ARM指令集是32位的,程序的啟動都是從ARM指令集開始。所有的ARM指令集都可以是有條件執(zhí)行的。本節(jié)從以下三個方面介紹:3.1.1 指令集編碼 3.1.2 條件執(zhí)行 3.1.3 指令分類及指令格式 0:3633.1.1ARM指令集編碼ARM指令集是以32位二進制編碼的方式給出的,大部分的指令編碼中定義了第一操作數(shù)、第二操作數(shù)、目的操作數(shù)、條件標志影響位以及每條指令所對應(yīng)的不同功能實現(xiàn)的二進制位。每條32位ARM指令都具有不同的二進制編碼方式,和不同的指令功

2、能相對應(yīng) 。0:364判斷方法:左判斷方法:左/右移偶數(shù)位,是否可以得到一個不大于右移偶數(shù)位,是否可以得到一個不大于0XFF的立即數(shù)的立即數(shù)判斷0X3FF0X3FC0:3683.1.2條件執(zhí)行 ARM指令根據(jù)CPSR中的條件位自動判斷是否執(zhí)行指令,在條件滿足時,指令執(zhí)行,否則指令被忽略。 在ARM的指令編碼表中,統(tǒng)一占用編碼的最高四位31:28來表示“條件碼”(即“cond”)。 0:369條件碼標志:條件碼標志:N、Z、C、V N在結(jié)果是帶符號的二進制補碼情況下,如果結(jié)果為負數(shù),則在結(jié)果是帶符號的二進制補碼情況下,如果結(jié)果為負數(shù),則N=1;如;如果結(jié)果為非負數(shù),則果結(jié)果為非負數(shù),則N=0。Z

3、如果結(jié)果為如果結(jié)果為0,則,則Z=1;如果結(jié)果為非;如果結(jié)果為非0,則,則Z=0。C它的設(shè)置分以下幾種情況;它的設(shè)置分以下幾種情況;對于加法指令(包括比較指令對于加法指令(包括比較指令CMN),如果產(chǎn)生進位,則),如果產(chǎn)生進位,則C=1;否則;否則C=0。對于減法指令(包括比較指令對于減法指令(包括比較指令CMP),如果產(chǎn)生借位,則),如果產(chǎn)生借位,則C=0;否則;否則C=1。對于有移位操作的非加減法指令,對于有移位操作的非加減法指令,C為移位操作中最后移出位的值。為移位操作中最后移出位的值。對于其他指令,對于其他指令,C通常不變。通常不變。V它的設(shè)置也分為以下兩種情況:它的設(shè)置也分為以下兩種

4、情況:對于加減法指令,在操作數(shù)和結(jié)果是帶符號的整數(shù)時,如果發(fā)生溢出,則對于加減法指令,在操作數(shù)和結(jié)果是帶符號的整數(shù)時,如果發(fā)生溢出,則V=1;如果無溢出發(fā)生,則;如果無溢出發(fā)生,則V=0。對于其他指令,對于其他指令,V通常不發(fā)生變化。通常不發(fā)生變化。0:3610條件域表1條件碼后綴標 志含 義0000EQZ置位相等0001NEZ清零不等0010CSC置位無符號=0011CCC清零無符號1001LSC清零Z置位無符號=1011LTN不等于V帶符號1101LEZ置位或N不等于V帶符號數(shù)=1110AL忽略無條件執(zhí)行 1111 NV 無 未使用0:36123.1.3指令分類及指令格式 ARM指令集可以

5、分為六大類,分別為數(shù)據(jù)處理指令、Load/Store指令、跳轉(zhuǎn)指令、程序狀態(tài)寄存器處理指令、協(xié)處理器指令和異常產(chǎn)生指令。 0:3613指令格式使用舉例:LDR R0,R1;讀取R1地址上的存儲單元內(nèi)容, 執(zhí)行條件ALBEQ DATAEVEN;條件執(zhí)行分支指令,執(zhí)行條件 EQ,即相等則跳轉(zhuǎn)到DATAEVENADDS R2,R1,#1;加法指令,R2R1+1,影響CPSR 寄存器(S)SUBNES R2,R1,#0 x20;條件執(zhí)行的減法運算,執(zhí)行 條件NE,R2 R1-0 x20, 影響CPSR寄存器(S)0:36143.2 ARM尋址方式3.2.1 3.2.1 立即尋址立即尋址3.2.2 3.

6、2.2 寄存器尋址寄存器尋址3.2.3 3.2.3 寄存器間接尋址寄存器間接尋址3.2.4 3.2.4 寄存器偏移尋址寄存器偏移尋址 3.2.5 3.2.5 基址加偏址尋址基址加偏址尋址 3.2.6 3.2.6 堆棧尋址堆棧尋址 3.2.7 3.2.7 塊拷貝尋址塊拷貝尋址 3.2.8 3.2.8 相對尋址相對尋址3.2.9 3.2.9 多寄存器尋址多寄存器尋址0:36153.2.1 3.2.1 立即尋址立即尋址F立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,操作數(shù)本身就在指令中給出,只要取出指令也式,操作數(shù)本身就在指令中給出,只要取出指令也就取到

7、了操作數(shù),這個操作數(shù)被稱為立即數(shù),對應(yīng)就取到了操作數(shù),這個操作數(shù)被稱為立即數(shù),對應(yīng)的尋址方式也就叫做立即尋址。例如以下指令:的尋址方式也就叫做立即尋址。例如以下指令:一 ADDR0,R0,1/*R0R01*/一 ADDR0,R0,0 x3f/*R0R00 x3f*/F 在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要求以要求以“”為前綴,對于以十六進制表示的立即為前綴,對于以十六進制表示的立即數(shù),還要求在數(shù),還要求在“”后加上后加上“0 x”0 x”。0:36163.2.23.2.2寄存器尋址寄存器尋址寄存器尋址就是利用寄存器中的數(shù)值作為操作寄存器尋址

8、就是利用寄存器中的數(shù)值作為操作數(shù),這種尋址方式是一種執(zhí)行效率較高的數(shù),這種尋址方式是一種執(zhí)行效率較高的尋址方式。以下指令:尋址方式。以下指令: ADDR0,R1,R2/*R0R1R2*/ 該指令的執(zhí)行效果是將寄存器該指令的執(zhí)行效果是將寄存器R1R1和和R2R2的內(nèi)容相的內(nèi)容相加,其結(jié)果存放在寄存器加,其結(jié)果存放在寄存器R0R0中中。0:36173.2.3.2.3 3寄存器偏移尋址寄存器偏移尋址第二操作數(shù)為寄存器型的移位操作第二操作數(shù)為寄存器型的移位操作 在ARM指令的數(shù)據(jù)處理指令中參與操作的第二操作數(shù)為寄存器型時,在執(zhí)行寄存器尋址操作時,可以選擇是否對第二操作數(shù)進行移位,即Rm,其中Rm稱為第

9、二操作數(shù)寄存器,用來指定移位類型(LSL,LSR,ASL,ASR,ROR或RRX)和移位位數(shù)。移位位數(shù)可以是5位立即數(shù)(#)或寄存器(Rs)。在指令執(zhí)行時將移位后的內(nèi)容作為第二操作數(shù)參與運算。例如指令: ADD R3,R2,R1,LSR #2 ;R3R2 + R140:3618第二操作數(shù)移位方式第二操作數(shù)移位方式 LSL:邏輯左移,空出的最低有效位用0填充。LSR:邏輯右移,空出的最高有效位用0填充。ASL:算術(shù)左移,由于左移空出的有效位用0填充,因此 它與LSL同義。ASR:算術(shù)右移,算術(shù)移位的對象是帶符號數(shù),移位過程中必須保持操作數(shù)的符號不變。如果源操作數(shù)是正數(shù),空出的最高有效位用0填充,

10、如果是負數(shù)用1填充。 ROR:循環(huán)右移,移出的字的最低有效位依次填入空出的最高有效位。RRX:帶擴展的循環(huán)右移。將寄存器的內(nèi)容循環(huán)右移1位,空位用原來C標志位填充。0:3619寄存器尋址 0:3620第二操作數(shù)的移位位數(shù)第二操作數(shù)的移位位數(shù) 移位位數(shù)可以用立即數(shù)方式或者寄存器方式給出,如下所示:ADD R3,R2,R1,LSR #2 ;R3 R2 + R14ADD R3,R2,R1,LSR R4 ;R3 R2 + R12R4寄存器R1的內(nèi)容分別邏輯右移2位、R4位(亦即R14、R12R4),再與寄存器R2的內(nèi)容相加,結(jié)果放入R3中。 0:36213.2.4寄存器間接尋址 寄存器間接尋址就是以寄

11、存器中的值作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器中。例如以下指令: LDRR0,R1/*R0R1*/ STRR0,R1/*R1R0*/ 第一條指令將以R1的值為地址的存儲器中的數(shù)據(jù)傳送到R0中。第二條指令將R0的值傳送到以R1的值為地址的存儲器中。0:36223.2.5基址加偏址尋址 基址變址尋址就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。采用變址尋址方式的指令又可以分為以下幾種形式:前變址模式前變址模式:LDR R0,R1,4;R0R14自動變址模式自動變址模式:LDR R0,R

12、1,4?。籖0R14、R1R14后變址模式后變址模式:LDR R0,R1 ,4;R0R1、R1R140:3623基址加偏址尋址基址寄存器的地址偏移可以是一個立即數(shù),也可以是另一個寄存器,并且在加到基址寄存器前還可以經(jīng)過移位操作,如下所示:LDR r0,r1,r2;r0mem32r1+r2LDR r0,r1,r2,LSL #2;r0r1+r2*4但常用的是立即數(shù)偏移的形式,地址偏移為寄存器形式的指令很少使用。0:3624傳送數(shù)據(jù)類型 傳送數(shù)據(jù)可以是有符號、無符號的8位、16位半字和32位字。 相對應(yīng)的在指令中增加一個字母表示數(shù)據(jù)類型:B:選擇字節(jié)操作H:選擇半字操作不加則選擇字操作LDRB R0

13、,R1;R0mem8R1LDRH R1,R0,#20;R1mem16R0+200:36253.2.6堆棧尋址F堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進后出(First In Last Out,F(xiàn)ILO)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。F當堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿堆滿堆棧棧(Full Stack),而當堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為空堆??斩褩#‥mpty Stack)。F即訪問存儲器時,存儲器的地址向高地址方向生長,稱為遞增堆棧遞增堆棧(ascending stack)。 存儲器的地址向低地址方向生長,稱為遞減堆棧遞減堆棧

14、(descending stack)。 0:3626堆棧尋址四種類型的堆棧工作方式 FFA滿遞增堆棧滿遞增堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由低地址向高地址生成。FFD滿遞減堆棧滿遞減堆棧:堆棧指針指向最后壓入的數(shù)據(jù),且由高地址向低地址生成。FEA空遞增堆??者f增堆棧:堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,且由低地址向高地址生成。FED空遞減堆??者f減堆棧:堆棧指針指向下一個將要放入數(shù)據(jù)的空位置,且由高地址向低地址生成STMFD SP!,R1-R7,LRLDMFA SP!,R1-R7,LR0:36293.2.7塊拷貝尋址F塊 拷 貝 尋 址 是 多 寄 存 器 傳 送 指 令LDM/STM

15、的尋址方式。LDM/STM指令可以把存儲器中的一個數(shù)據(jù)塊加載到多個寄存器中,也可以把多個寄存器中的內(nèi)容保存到存儲器中。尋址操作中的寄存器可以是R0-R15這16個寄存器的子集或是所有寄存器。FLDM/STM指令依據(jù)其后綴名的不同其尋址的方式也有很大不同,見下表。0:36300:3631IA操作完成后地址遞增IB地址先增而后完成操作DA操作完成后地址遞增DB地址先減而后完成操作FD滿遞減堆棧ED空遞減堆棧FA滿遞增堆棧EA空遞增堆棧0:3632ARM指令:STMFD SP! R1-R7,LR;入棧LDMFD SP! R1-R7,LR;出棧Thumb指令:PUSH R1-R7,LR;入棧POP R

16、1-R7,LR;出棧0:36333.2.7相對尋址 與基址變址尋址方式相類似,相對尋址以程序計數(shù)器PC的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BL采用了相對尋址方式:BLNEXT;跳轉(zhuǎn)到子程序 ;NEXT處執(zhí)行NEXTMOVPC,LR;從子程序返回 0:36343.3 3.3.1 數(shù)據(jù)處理指令3.3.2 Load/Store指令3.3.3 程序狀態(tài)寄存器與通用寄存器之間 的傳送指令3.3.4 轉(zhuǎn)移指令3.3.5 異常中斷指令3.3.6 協(xié)處理器指令0:36353.3.1 數(shù)據(jù)處理指令A(yù)RM的數(shù)據(jù)處理指令主要完成

17、寄存器中數(shù)據(jù)的算術(shù)和邏輯運算操作。 數(shù)據(jù)處理指令分類 數(shù)據(jù)處理指令二進制編碼 數(shù)據(jù)處理指令表0:3636數(shù)據(jù)處理指令分類數(shù)據(jù)處理指令根據(jù)指令實現(xiàn)處理功能可分為以下六類: 數(shù)據(jù)傳送指令; 算術(shù)運算指令; 邏輯運算指令; 比較指令; 測試指令; 乘法指令。0:3637數(shù)據(jù)處理指令二進制編碼數(shù)據(jù)處理指令的二進制編碼如下(前5類格式):0:3638靈活的第二操作數(shù)兩種可能形式:1、#immed_8r:常量必須對應(yīng)于8位位圖在32位字中被循環(huán)偶數(shù)位(0、2、4、8、28、30)后的值。合法常量:0 xFF、0 x104、0 xFF0、0 xF000000F非法常量:0 x101、0 x102、0 xFF

18、003、0 xF000001F2、Rm ,shift:Rm為存儲第二操作數(shù)數(shù)據(jù)的RAM寄存器,可用以下方法對寄存器中的位圖進行移位。type Rs ASR、LSL、LSR、ROR中的一種中的一種0:3639數(shù)據(jù)處理指令指令表操作碼24:21助記符意義效果0000AND邏輯位與Rd = Rn AND Op20001EOR邏輯位異或Rd = Rn EOR Op20010SUB減Rd = Rn - Op20011RSB反向減Rd = Op2 Rn0100ADD加Rd = Rn + Op20101ADC帶進位加Rd = Rn + Op2 + C0110SBC帶進位減Rd = Rn - Op2 + C

19、-10111RSC反向帶進位減Rd = Op2 - Rn + C -11000TST測試根據(jù)Rn AND Op2設(shè)置條件碼1001TEQ測試相等根據(jù)Rn EOR Op2設(shè)置條件1010CMP比較根據(jù)Rn - Op2設(shè)置條件碼1011CMN負數(shù)比較根據(jù)Rn + Op2設(shè)置條件碼1100ORR邏輯位或Rd = Rn OR Op21101MOV傳送Rd = Op21110BIC位清零Rd = Rn AND NOT Op21111MVN求反Rd = NOT Op20:36401、ADD、SUB、 RSB、 ADC、 SBC、RSC加、減、反減,不帶進位和帶進位條件碼標志:條件碼標志:若指定S,那么這些

20、指令根據(jù)結(jié)果,更新NZCV。R15的使用:的使用:若將R15作為Rn使用,其值是指令的地址加8若使用R15作為Rd,則:l執(zhí)行轉(zhuǎn)移到結(jié)果對應(yīng)的地址l若使用后綴“S”,則將當前的SPSR拷貝到CPSR??梢允褂眠@一點從異常返回。(在用戶模式或系統(tǒng)模式下當將R15作為Rd使用時,不要使用后綴“S”)l在有寄存器控制移位的任何數(shù)據(jù)處理指令中,不能將R15作為Rd或任何操作數(shù)來使用。0:3641例子:例子:ADD R2,R2,R3SUBS R8,R6,#240;根據(jù)結(jié)果設(shè)置標志RSB R4,R4,#1280 ;1280R4ADCHI R11,R0,R3;只有標志C置位且標志Z清零時才執(zhí)行RSCLES

21、R0,R5,R0,LSL R4 ;有條件執(zhí)行,設(shè)置標志錯例:錯例:RSCLESR0,R15,R0,LSL R4;R15不允許與被控制移位的寄存器一起使用0:3642多個字節(jié)算術(shù)運算舉例:R2,R3中的64位整數(shù)與R0,R1中的64位整數(shù)相加,結(jié)果放在R4,R5中:ADDS R4,R0,R2;加低有效位ADC R5,R1,R3;加高有效位96位減法舉例:SUBS R3,R6,R9SBCS R4,R7,R10SBC R5,R8,R110:3643AND、ORR、EOR、BIC邏輯與、或、異或、位清零條件碼標志:條件碼標志:若指定S,則這些指令將:1)根據(jù)結(jié)果更新標志N、Z2)在計算Operand2

22、時更新標志C3)不影響標志VR15的使用:的使用:同前0:3644例子:例子:AND R9,R2,#0 xFF00ORREQ R2,R0,R5;Z值位則或操作EORS R0,R0,R3,ROR R6BICNES R8,R10,R0,RRX;Z清零則操作位清零,同時值位CPSR相應(yīng)位錯例:錯例:EORS R15,R10,R0,ROR R6 ;R15不允許與被控制移位的寄存器一起出現(xiàn)0:3645MOV和MVN(傳送和傳送非)條件碼標志:條件碼標志:若指定S,則這些指令將:1)根據(jù)結(jié)果更新標志N、Z2)在計算Operand2時更新標志C3)不影響標志VR15的使用:的使用:同前0:3646例子:例子

23、:MOV R5,R2MVNNE R11,#0 xF00000B;Z清零則操作MOVS R0,R0,ASR R3錯例:錯例:MVN R15,R3,ASR R0;R15不允許與被控制移位的寄存器一起出現(xiàn)0:3647CMP和CMN(比較和比較反值)用法:用法:這些指令將寄存器的值與Operand2進行比較。它們根據(jù)結(jié)果更新條件標志碼,但結(jié)果不放到任何寄存器中CMP:根據(jù)Rn - Op2設(shè)置條件碼,結(jié)果丟棄CMN:根據(jù)Rn + Op2設(shè)置條件碼,結(jié)果丟棄條件碼標志:條件碼標志:根據(jù)結(jié)果更新條件碼NZCVR15的使用:的使用:若將R15用作Rn,則使用的值是指令的地址加8。在有寄存器控制移位的任何數(shù)據(jù)處

24、理指令中,必能將R15用于任何操作。0:3648TST和TEQ(測試和測試相等)句法:句法:TST cond Rn,Operand2TEQ cond Rn,Operand2用法:用法:TST:對Rn的值和Operand2的值進行按位“與”操作,設(shè)置條件碼,丟棄結(jié)果TEQ:對Rn的值和OPerand2的值進行按位“異或”操作,設(shè)置條件碼,丟棄結(jié)果條件碼設(shè)置和條件碼設(shè)置和R15的使用:的使用:與前相同0:3649乘法指令:二進制編碼:二進制編碼:31 28 27 24 23 2120 19 16 15 12 11 87 4 3 0cond 0000 mul S Rd/RdHi Rn/RdLoRs1

25、001Rm乘法指令乘法指令操作碼23:21 助記符意義效果000MUL乘(32位結(jié)果)Rd(RmRs)31:0001MLA乘累加( 32位結(jié)果)Rd(RmRs+Rn)31:0100UMULL無符號數(shù)長乘RdHi:RdLoRmRs101UMLAL無符號長乘累加RdHi:RdLo+=RmRs110SMULL有符號數(shù)長乘RdHi:RdLoRmRs111SMLAL 有符號數(shù)長乘累加 RdHi:RdLo+=RmRs0:3650MUL和MLA(乘法和乘加)句法:句法:MUL cond S Rd,Rm,RsMLA cond S Rd,Rm,Rs,RnR15不能用作不能用作Rd、Rm、Rs、Rn。Rn不能與不

26、能與Rm相同。相同。條件標志碼:條件標志碼:若指定S,則:1)根據(jù)結(jié)果更新標志N和Z2)不影響標志V3)在ARM4v及以前版本中C不可靠4)在ARM5v及以后版本中不影響標志C0:3651 例子:例子:MUL R10,R2,R5MLA R10,R2,R1,R5MULS R0,R2,R2錯例:錯例:MUL R15,R1,R30:3652UMULL、UMLAL、SMULL、SMLAL(無符號和帶符號長整數(shù)乘法和乘加,結(jié)果為64位)句法:句法:Op cond S RdLo,RdHi,Rm,Rs其中:RdLo,RdHi:ARM結(jié)果寄存器。對于UMLAL和SMLAL,用于保存加法值 Rm,Rs:操作數(shù)寄

27、存器0:3653SMULxy、SMLAxy、SMULWy、SMLAWy、SMLALxySMULxy(帶符號乘法 16位16位,結(jié)果為32位)句法:句法:SMUL cond Rd,Rm,Rs其中: :B或T,B意味著使用Rm的低端15:0 T意味著使用高端31:16 : B或T,B意味著使用Rs的低端15:0 T意味著使用高端31:16 Rd :結(jié)果寄存器Rm,Rs :乘數(shù)寄存器SMLAxy(帶符號乘加 16位16位,加法為32位)0:3654SMULWy(帶符號乘 32位16位,結(jié)果為32位)句法:句法:SMULW cond Rd,Rm,RsSMLAWy(帶符號乘加 32位16位,加法為32位

28、)句法:句法:SMLAW cond Rd,Rm,RsSMLALLxy (帶符號加 16位 16位 加法為64位)句法:句法:SMLALL cond RdLo,RdHi,Rm,Rs0:36553.3.2 Load/Store指令 ARM的數(shù)據(jù)存取指令Load/Store是唯一用于寄存器和存儲器之間進行數(shù)據(jù)傳送的指令。ARM指令集中有三種基本的數(shù)據(jù)存取指令: 單寄存器的存取指令(LDR,STR) 多寄存器存取指令(LDM,STM) 單寄存器交換指令(SWP) 0:3656單寄存器的存取指令 單寄存器存取指令是ARM在寄存器和存儲器間傳送單個字節(jié)和字的最靈活方式。根據(jù)傳送數(shù)據(jù)的類型不同,單個寄存器存

29、取指令又可以分為以下兩類: 單字和無符號字節(jié)的數(shù)據(jù)傳送指令 半字和有符號字節(jié)的數(shù)據(jù)傳送指令0:3657單字和無符號字節(jié)的數(shù)據(jù)傳送指令這一類數(shù)據(jù)傳送指令的編碼格式如下:單字和無符號字節(jié)數(shù)據(jù)傳送指令的二進制編碼0:3658單字和無符號字節(jié)的數(shù)據(jù)傳送指令這一類數(shù)據(jù)傳送指令的匯編格式如下: 前變址格式LDR|STR B Rd, Rn, ! 后變址格式LDR|STR B T Rd, Rn, 相對PC的形式LDR|STR B Rd, LABEL T:特權(quán)模式下使用,在用戶模式下不可用。存儲系統(tǒng)看 成是用戶模式下的狀態(tài),不能和前索引偏移一起使用0:3659半字和有符號字節(jié)的數(shù)據(jù)傳送指令這一類數(shù)據(jù)傳送格式的二

30、進制編碼如下:0:3660半字和有符號字節(jié)的數(shù)據(jù)傳送指令這一類數(shù)據(jù)傳送指令的匯編格式如下: 前變址格式LDR|STR H|SH|SB Rd, Rn, ! 后變址格式LDR|STR H|SH|SB Rd, Rn, 式中是#或#Rm;H|SH|SB選擇傳送數(shù)據(jù)類型;其它部分的匯編器格式與傳送字和無符號字節(jié)相同。0:3661說明:說明:SH:帶符號的半字H :無符號的半字SB:帶符號的字節(jié)半字傳送的地址對準:半字傳送的地址對準:半字傳送的地址必須是偶數(shù)。例:例:LDREQSH R11,R6;(有條件的)R11R6,加載16位半字,帶符號擴展到32位LDRSB R6,constf;加載位于標號cons

31、tf地址中的字節(jié),帶符號擴展STRH R4,R0,R1!;R4R0+R1,存儲最低的有效半字到R0+R1地址開始的兩個字節(jié),地址回寫到R00:3662LDR和和STR雙字雙字加載兩個相鄰的寄存器和存儲兩個相鄰的寄存器,64位雙字。句法:句法:opcondD Rd,RnopcondD Rd,Rn,offset!opcondD Rd,labelopcondD Rd,Rn,offset其中:Rd加載或存儲寄存器其中一個,另一個是R(d+1)。 Rd必須是偶數(shù)寄存器,且不是R14 Rn 除非指令為零偏移,或不帶回寫的前索引,否 則,Rn不允許與Rd和R(d+1)相同0:3663例句:LDRD R6,R

32、11LDRMID R4,R7,R2STRD R4,R9,#24STRD R0,R9,R2!LDRD R1,R6STRD R14,R9,#36STRD R2,R3,R60:3664多寄存器存取指令LDM/STM多寄存器傳送指令可以用一條指令將16個可見寄存器(R0R15)的任意子集合(或全部)存儲到存儲器或從存儲器中讀取數(shù)據(jù)到該寄存器集合中。與單寄存器存取指令相比,多寄存器數(shù)據(jù)存取可用的尋址模式更加有限。多寄存器存取指令的匯編格式如下:LDM/STM Rn!, 0:3665多寄存器存取指令多寄存器存取指令的二進制編碼如下:0:3666LDM/STM Rn!, add modeIA、IB、DA、D

33、B、FD、ED、FA、EARn基址寄存器,裝有傳送數(shù)據(jù)的初始地址,Rn不允許是R15registers存儲寄存器列表。不允許在用戶模式或系統(tǒng)模式下使用,兩種目的:1)LDM且reglist中包含PC(R15),那么除了正常的多寄存器傳送外,將SPSR也拷貝到CPSR中。僅在異常模式下使用。2)數(shù)據(jù)傳入或傳出的是用戶模式的寄存器,而不是當前模式的寄存器0:3667非字對準地址:非字對準地址:這些指令忽略地址的位1:0。例句:例句:LDMIAR8,R0,R2,R9STMDBR1!,R3-R6,R11,R12STMFDR13!,R0,R4-R7,LRLDMFDR13!,R0,R4-R7,PCSTMI

34、AR5!,R5,R4,R9LDMDAR2,0:3668單寄存器交換指令(SWP)其二進制編碼格式如下:其匯編格式如下:SWP B Rd,Rm,Rn 例句:例句:SWPB R1,R1,R0 交換字節(jié),將R0中的字節(jié)數(shù)據(jù)讀取到R1中,同時將R1中的數(shù)據(jù)寫入到R0中SWP R1,R2,R3 交換字節(jié)數(shù)據(jù),將R3中的數(shù)據(jù)讀取到R1中,同時將R2中的數(shù)據(jù)寫入到R3中0:36693.3.3程序狀態(tài)寄存器與通用寄存器之間的傳送指令A(yù)RM指令中有兩條指令,用于在狀態(tài)寄存器和通用寄存器之間傳送數(shù)據(jù)。修改狀態(tài)寄存器一般是通過“讀取修改寫回”三個步驟的操作來實現(xiàn)的。 這兩條指令分別是: 狀態(tài)寄存器到通用寄存器的傳送

35、指令(MRS) 通用寄存器到狀態(tài)寄存器的傳送指令(MSR) 0:3670MRS MRS的二進制編碼如下:其匯編格式如下:MRS Rd,CPSR|SPSR 0:3671MSR MSR的二進制編碼如下:其匯編格式如下:MSR CPSR_f | SPSR_f,#MSR CPSR_ | SPSR_,Rm 0:3672fieldc控制域屏蔽字節(jié)(PSR7:0)x擴展域屏蔽字節(jié)(PSR15:8)s狀態(tài)域屏蔽字節(jié)(PSR23:16)f標志域屏蔽字節(jié)(PSR31:24)0:36733.3.4轉(zhuǎn)移指令A(yù)RM的轉(zhuǎn)移指令可以從當前指令向前或向后的32MB的地址空間跳轉(zhuǎn),根據(jù)完成的功能它可以分為以下4種 : B 轉(zhuǎn)移

36、指令 BL 帶鏈接的轉(zhuǎn)移指令 BX 帶狀態(tài)切換的轉(zhuǎn)移指令 BLX 帶鏈接和狀態(tài)切換的轉(zhuǎn)移指令 0:3674轉(zhuǎn)移和轉(zhuǎn)移鏈接指令(B,BL) 轉(zhuǎn)移指令B在程序中完成簡單的跳轉(zhuǎn)指令,可以跳轉(zhuǎn)到指令中指定的目的地址。BL指令完全象轉(zhuǎn)移指令一樣地執(zhí)行轉(zhuǎn)移,同時把轉(zhuǎn)移后面緊接的一條指令的地址保存到鏈接寄存器LR(R14)。 二進制編碼如下:匯編格式如下:BL 0:3675轉(zhuǎn)移交換和轉(zhuǎn)移鏈接交換(BX,BLX) 這些指令用于支持Thumb(16位)指令集的ARM芯片,程序可以通過這些指令完成處理器從ARM狀態(tài)到Thumb狀態(tài)的切換。類似的Thumb指令可以使處理器切換回32位ARM指令。 二進制編碼如下:匯編格式如下:1: BLX Rm2: BLX 0:3676說明:BX格式中:Rm的第0位拷貝到CPSR中的T位,31:1位移入PC。若Rm0=1,切換到Thumb狀態(tài),Rm最低位清0,從Rm開始執(zhí)行;若Rm0=0,將Rm1位清0,從Rm開始執(zhí)行。BLX格式中:將指令中有符號的24位偏移量用符號擴展為32位,然后左移2位形成偏移,然后加載到PC中,把H位加到目標地址的第1位,使得目標指令選擇奇數(shù)的半字地址,執(zhí)行Thumb指令。(該指令轉(zhuǎn)移出一定是Thumb指

溫馨提示

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

評論

0/150

提交評論