




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、ARM 微處理器的指令集,1.ARM處理器尋址方式 2.ARM指令集 Resources : http:/www.peter- http:/www.heyrick.co.uk/assembler/,ARM 微處理器的指令集,ARM微處理器的工作狀態(tài)有兩種: ARM狀態(tài),此時(shí)處理器執(zhí)行32位的、字對(duì)齊的ARM指令; Thumb狀態(tài),此時(shí)處理器執(zhí)行16位的、半字對(duì)齊的Thumb指令。 在程序的執(zhí)行過(guò)程中,微處理器可以隨時(shí)在兩種工作狀態(tài)之間切換,并且,處理器工作狀態(tài)的轉(zhuǎn)變并不影響處理器的工作模式和相應(yīng)寄存器中的內(nèi)容。,ARM 微處理器的指令集,ARM指令集支持ARM核所有的特性,具有高效、快速的特點(diǎn)
2、。 Thumb指令集具有靈活、小巧的特點(diǎn)。,ARM狀態(tài)下的寄存器組織(2),37個(gè)32位寄存器,其中31個(gè)為通用寄存器,6個(gè)為狀態(tài)寄存器。,用戶(hù)模式、系統(tǒng)模式,快速中斷模式,管理模式,數(shù)據(jù)訪問(wèn)終止模式,外部中斷模式,未定義指令中止模式,未分組寄存器R0R7,在所有的運(yùn)行模式下,未分組寄存器都指向同一個(gè)物理寄存器,他們未被系統(tǒng)用作特殊用途。 在中斷或異常處理進(jìn)行運(yùn)行模式轉(zhuǎn)換時(shí),由于不同的處理器運(yùn)行模式均使用相同的物理寄存器,可能會(huì)造成寄存器中數(shù)據(jù)的破壞,這一點(diǎn)在進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)引起注意。,分組寄存器R8R12,R8R12:每個(gè)寄存器對(duì)應(yīng)兩個(gè)不同的物理寄存器 當(dāng)使用fiq模式時(shí),訪問(wèn)寄存器R8_f
3、iqR12_fiq; 當(dāng)使用除fiq模式以外的其他模式時(shí),訪問(wèn)寄存器R8_usrR12_usr。,分組寄存器R13R14,R13、R14:每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器,其中的一個(gè)是用戶(hù)模式與系統(tǒng)模式共用,另外5個(gè)物理寄存器對(duì)應(yīng)于其他5種不同的運(yùn)行模式,堆棧指針R13,R13在ARM指令中常用作堆棧指針,但這只是一種習(xí)慣用法,用戶(hù)也可使用其他的寄存器作為堆棧指針。 在Thumb指令集中,某些指令強(qiáng)制性的要求使用R13作為堆棧指針。 由于處理器的每種運(yùn)行模式均有自己獨(dú)立的物理寄存器R13,在初始化部分,都要初始化每種模式下的R13,這樣,當(dāng)程序的運(yùn)行進(jìn)入異常模式時(shí),可以將需要保護(hù)的寄存器放入
4、R13所指向的堆棧,而當(dāng)程序從異常模式返回時(shí),則從對(duì)應(yīng)的堆棧中恢復(fù),子程序連接寄存器R14,子程序連接寄存器或連接寄存器LR。 當(dāng)執(zhí)行BL子程序調(diào)用指令時(shí),可以從R14中得到R15(程序計(jì)數(shù)器PC)的備份。在每一種運(yùn)行模式下,都可用R14保存子程序的返回地址,當(dāng)用BL或BLX指令調(diào)用子程序時(shí),將PC的當(dāng)前值拷貝給R14,執(zhí)行完子程序后,又將R14的值拷貝回PC,即可完成子程序的調(diào)用返回。 BLSUB1 SUB1:STMFDSP!, , LR /*將R14存入堆棧*/ LDMFDSP!,PC/*完成子程序返回 */,程序計(jì)數(shù)器PC(R15),ARM狀態(tài)下,位1:0為0,位31:2用于保存PC;,
5、Thumb狀態(tài)下,位0為0,位31:1用于保存PC;,R15雖然也可用作通用寄存器,但一般不這么使用,因?yàn)閷?duì)R15的使用有一些特殊的限制,當(dāng)違反了這些限制時(shí),程序的執(zhí)行結(jié)果是未知的。,由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,PC總是指向當(dāng)前指令的下兩條指令的地址,即PC的值為當(dāng)前指令的地址值加8個(gè)字節(jié)。,程序狀態(tài)寄存器(CPSR/SPSR),寄存器R16用作CPSR(當(dāng)前程序狀態(tài)寄存器),CPSR可在任何運(yùn)行模式下被訪問(wèn),它包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志位,以及其他一些相關(guān)的控制和狀態(tài)位。,每一種運(yùn)行模式下又都有一個(gè)專(zhuān)用的物理狀態(tài)寄存器,稱(chēng)為SPSR(備份
6、的程序狀態(tài)寄存器),異常發(fā)生時(shí),SPSR用于保存CPSR的值,從異常退出時(shí)則可由SPSR來(lái)恢復(fù)CPSR。,由于用戶(hù)模式和系統(tǒng)模式不屬于異常模式,他們沒(méi)有SPSR,當(dāng)在這兩種模式下訪問(wèn)SPSR,結(jié)果是未知的。,1 ARM處理器尋址方式,尋址方式分類(lèi),尋址方式是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有9種基本尋址方式。 1.寄存器尋址; 2.立即尋址; 3.寄存器移位尋址;4.寄存器間接尋址; 5.基址尋址;6.多寄存器尋址; 7.堆棧尋址;8.塊拷貝尋址; 9.相對(duì)尋址。,操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操
7、作。寄存器尋址指令舉例如下: MOV R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結(jié)果保存到R0,1 ARM處理器尋址方式,尋址方式分類(lèi)寄存器尋址,MOV R1,R2,0 xAA,立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱(chēng)為立即數(shù))。立即尋址指令舉例如下: SUBSR0,R0,#1 ;R0減1,結(jié)果放入R0,并且影響標(biāo)志位 MOVR0,#0 xFF000 ;將立即數(shù)0 xFF000裝入R0寄存器,1 ARM處理器尋址方式,尋址方式分類(lèi)立即尋址,MOV R0
8、,#0 xFF00,0 xFF00,從代碼中獲得數(shù)據(jù),寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器移位尋址指令舉例如下: MOVR0,R2,LSL #3;R2的值左移3位,結(jié)果放入R0, ;即是R0=R28 ANDSR1,R1,R2,LSL R3;R2的值左移R3位,然后 ;和R1相“與”操作,結(jié)果放入R1,1 ARM處理器尋址方式,尋址方式分類(lèi)寄存器移位尋址,MOV R0,R2,LSL #3,0 x08,0 x08,邏輯左移3位,寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需
9、的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。例如: LDRR1,R2;將R2指向的存儲(chǔ)單元的數(shù)據(jù) ;讀出保存在R1中 SWPR1,R1,R2;將寄存器R1的值和R2 ;指定的存儲(chǔ)單元的內(nèi)容交換,1 ARM處理器尋址方式,尋址方式分類(lèi)寄存器間接尋址,LDR R0,R2,0 xAA,基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量(4K)相加/減,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問(wèn)基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問(wèn)等。寄存器間接尋址是偏移量為0的基址加偏移尋址。 基址尋址指令舉例如下(前索引尋址): LDRR2,R3,#0 x0C ;讀取R
10、3+0 x0C地址上的 ;存儲(chǔ)單元的內(nèi)容,放入R2 STRR1,R0,#-4!;先R0=R0-4,然后把R1的值 ;寄存到保存到R0指定的存儲(chǔ)單元,1 ARM處理器尋址方式,尋址方式分類(lèi)基址尋址,LDR R2,R3,#0 x0C,0 xAA,將R3+0 x0C作為地址裝載數(shù)據(jù),基址尋址指令舉例如下: LDRR0,R1,#4;R0=R1,R1R14 ;后索引基址尋址 LDR R0,R1,R2 ;R0=R1+R2,1 ARM處理器尋址方式,尋址方式分類(lèi)基址尋址,多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: LDMIAR1!,R2
11、-R7,R12 ;將R1指向的單元中的數(shù)據(jù)讀出到R2R7、R12中(R1自動(dòng)加4) STMIAR0!,R2-R7,R12 ;將寄存器R2R7、R12的值保存到R0指向的存儲(chǔ); 單元中(R0自動(dòng)加4),1 ARM處理器尋址方式,尋址方式分類(lèi)多寄存器尋址,LDMIA R1!,R2-R4,R6,0 x40000010,堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出” 。堆棧尋址是隱含的,它使用一個(gè)專(zhuān)門(mén)的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元即是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N: 向上生長(zhǎng):向高地址方向生長(zhǎng),稱(chēng)為遞增堆棧 向下生長(zhǎng):向低地址方向生長(zhǎng),稱(chēng)為遞減堆棧,
12、1 ARM處理器尋址方式,尋址方式分類(lèi)堆棧尋址,1 ARM處理器尋址方式,尋址方式分類(lèi)堆棧尋址,0 x12345678,0 x12345678,堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱(chēng)為滿堆棧;堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置,稱(chēng)為空堆棧。,1 ARM處理器尋址方式,尋址方式分類(lèi)堆棧尋址,0 x12345678,所以可以組合出四種類(lèi)型的堆棧方式: 滿遞增:堆棧向上增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。指令如LDMFA、STMFA等; 空遞增:堆棧向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置。指令如LDMEA、STMEA等; 滿遞減:堆棧向下增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址。
13、指令如LDMFD、STMFD等; 空遞減:堆棧向下增長(zhǎng),堆棧指針向堆棧下的第一個(gè)空位置。指令如LDMED、STMED等。,1 ARM處理器尋址方式,尋址方式分類(lèi)堆棧尋址,多寄存器傳送指令用于將一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置。 如: STMIAR0!,R1-R7;將R1R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針R0在保存第一個(gè)值之后增加,增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)。,1 ARM處理器尋址方式,尋址方式分類(lèi)塊拷貝尋址,相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下: BL SUBR1;調(diào)用到SUBR
14、1子程序 BEQLOOP;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處 . LOOP MOVR6,#1 . SUBR1.,1 ARM處理器尋址方式,尋址方式分類(lèi)相對(duì)尋址,1 ARM指令集 簡(jiǎn)單的ARM程序,;文件名:TEST1.S ;功能:實(shí)現(xiàn)兩個(gè)寄存器相加 ;說(shuō)明:使用ARMulate軟件仿真調(diào)試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32位ARM指令 START MOVR0,#0 ;設(shè)置參數(shù) MOVR1,#10 LOOPBLADD_SUB ;調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)到LOOP ADD_SUB AD
15、DSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結(jié)束,使用“;”進(jìn)行注釋,標(biāo)號(hào)頂格寫(xiě),實(shí)際代碼段,聲明文件結(jié)束,簡(jiǎn)單的ARM程序,;文件名:TEST1.S ;功能:實(shí)現(xiàn)兩個(gè)寄存器相加 ;說(shuō)明:使用ARMulate軟件仿真調(diào)試 AREAExample1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識(shí)程序入口 CODE32 ;聲明32位ARM指令 START MOVR0,#0 ;設(shè)置參數(shù) MOVR1,#10 LOOPBLADD_SUB ;調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)到LOOP ADD_SUB ADDSR0
16、,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結(jié)束,ARM指令小節(jié)目錄,1.指令格式 2.條件碼 3.存儲(chǔ)器訪問(wèn)指令 4.數(shù)據(jù)處理指令 5.乘法指令 6.ARM分支指令 7.雜項(xiàng)指令 8.偽指令,ARM是三地址指令格式,指令的基本格式如下:,1 ARM指令集介紹,ARM指令集基本指令格式, S ,其中號(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ù);,例:,ARM指令的基本格式如下:,1
17、 ARM指令集介紹,ARM指令集第2個(gè)操作數(shù), S ,靈活的使用第2個(gè)操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式: #immed_8r常數(shù)表達(dá)式; Rm寄存器方式; Rm,shift寄存器移位方式;,1 ARM指令集介紹,ARM指令集第2個(gè)操作數(shù),#immed_8r常數(shù)表達(dá)式,例如: ANDR1,R2,#0 x0F 說(shuō)明: ADD條件S , , dest = op_1 + op_2 ADD 將把兩個(gè)操作數(shù)加起來(lái),把結(jié)果放置到目的寄存器中。 操作數(shù) 1 是一個(gè)寄存器,操作數(shù) 2 可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即值:,1 ARM指令集介紹,ARM指令集第2個(gè)操作數(shù),Rm
18、寄存器方式 在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。 例如: SUBR1,R1,R2 說(shuō)明:SUB條件S , , dest = op_1 - op_2,1 ARM指令集介紹,ARM指令集第2個(gè)操作數(shù),Rm,shift寄存器移位方式 將寄存器的移位結(jié)果作為操作數(shù)(移位操作不消耗額外的時(shí)間),但Rm值保持不變,移位方法如下: ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 1),1 ARM指令集介紹,ARM指令集第2個(gè)操作數(shù),Arithmetic Shift Right,Logic Shift Right,Logic Shift Left,Rotate Right,1 A
19、RM指令集介紹,ARM指令集第2個(gè)操作數(shù),Rm,shift寄存器移位方式 例如: ADDR1,R1,R1,LSL #3 ;R1=R1+R1R3,ARM指令的基本格式如下:,1 ARM指令集介紹,ARM指令集條件碼, S ,使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作(節(jié)省跳轉(zhuǎn)和條件語(yǔ)句),提高代碼效率。 所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無(wú)條件(AL)執(zhí)行。,指令條件碼表,1 ARM指令集介紹,ARM指令集條件碼,C代碼: If(a b) a+; Else b+;,對(duì)應(yīng)的匯編代碼: CMPR0,R1 ;R0(a)
20、與R1(b)比較 ADDHI R0,R0,#1 ;若R0R1,則R0=R0+1 ADDLS R1,R1,#1 ;若R01,則R1=R1+1,示例:,CMP R1, R2 ;SET C ON R1-R2 CMN R1, R2 ; SET C ON R1+R2 TST R1, R2 ; SET C ON R1 AND R2 TEQ R1, R2 ; SET C ON R1 XOR R2,1 ARM指令集介紹,ARM指令集存儲(chǔ)器訪問(wèn)指令,ARM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問(wèn)只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。RAM存儲(chǔ)空間及I/O映射空間統(tǒng)一編址,除對(duì)RAM操作以外,對(duì)外圍IO、程序數(shù)據(jù)的訪問(wèn)
21、均要通過(guò)加載/存儲(chǔ)指令進(jìn)行。 存儲(chǔ)器訪問(wèn)指令分為單寄存器操作指令和多寄存器操作指令。,ARM存儲(chǔ)器訪問(wèn)指令單寄存器加載,ARM存儲(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)存。指令格式如下:,AR
22、M存儲(chǔ)器訪問(wèn)指令單寄存器存儲(chǔ),LDRcondTRd, ;將指定地址上的字?jǐn)?shù)據(jù)讀入Rd STRcondTRd, ;將Rd中的字?jǐn)?shù)據(jù)存入指定地址 LDRcondBTRd, ;將指定地址上的字節(jié)數(shù)據(jù)讀入Rd STRcondBTRd, ;將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表示
23、加/減,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ù)值。 如:LDR R1,R0,#0 x12 ;R1-R0+0 x12 寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可
24、以從基址寄存器中減去這個(gè)數(shù)值。 如:LDR R1,R0,R2 ; R1-R0+R2 LDR R1,R0,-R2 ; R1-R0-R2 寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 如:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4,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ǔ),LDRcondSB Rd,;將指定地址上的有符號(hào)字節(jié)讀入Rd LDRcondSH Rd,;將指定地址
25、上的有符號(hào)半字讀入Rd LDRcondH Rd,;將指定地址上的半字?jǐn)?shù)據(jù)讀入Rd STRcondH Rd,;將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
26、為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é)指令 LDRR2,R5;將R5指向地址的字?jǐn)?shù)據(jù)存入R2 STRR1,R0,#0 x04;將R1的數(shù)據(jù)存儲(chǔ)到R0+0 x04地址 LDRBR3,R2,#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2R21 STRBR0,R3,-R8 ASR 2 ;R0-R3-R8/4,存儲(chǔ)R0的最低有效字節(jié) 2.加載/存儲(chǔ)半字和有符號(hào)字節(jié)指令 LDRSB R1,R0,R3;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1, ;高24位用符號(hào)擴(kuò)展 LDRH R6,R2,#2;將R2
27、指向地址的半字?jǐn)?shù)據(jù)存入R6,高16位用0擴(kuò)展 ;讀出后,R2=R2+2 STRH R1,R0,#2!;將R1的半字?jǐn)?shù)據(jù)保存到R0+2地址, ;只修改低2字節(jié)數(shù)據(jù),然后R0=R0+2,ARM存儲(chǔ)器訪問(wèn)指令單寄存器存儲(chǔ),(3)LDR和STR -雙字:加載/存儲(chǔ)兩個(gè)相鄰的寄存器,64位雙字。其句法有4種: Op cond D Rd,Rn 零偏移 Op cond D Rd,Rn,offset ! 前索引偏移 Op cond D Rd,label 程序相對(duì)偏移 Op cond D T Rd,Rn,offset 后索引偏移,ARM存儲(chǔ)器訪問(wèn)指令單寄存器存儲(chǔ),其中: Rd加載/存儲(chǔ)寄存器中的一個(gè),另一個(gè)是R
28、(d+1)。Rd必須是偶數(shù)寄存器,且不是R14。 Rn除非指令為零偏移,或不帶寫(xiě)回的前索引,否則,Rn不允許與Rd和R(d+1)相同。 labellabel必須是在當(dāng)前指令的上下252字節(jié)范圍內(nèi)。 例如: LDRD R6,R11 ;R6R11,R7R11+4 STRD R4,R9,#24 ;R4R9+24,R5R9+28,ARM存儲(chǔ)器訪問(wèn)指令單寄存器存儲(chǔ),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ù)制、
29、常數(shù)傳遞等。,ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取,多寄存器加載/存儲(chǔ)指令格式如下: LDMcond Rn!,reglist STMcond 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中。這用于異常處理返回,僅在異
30、常模式下使用。 2)如寄存器列表包含R15時(shí),數(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ù)傳送操作。,進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/ST
31、MDA、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í)行后的基址寄存器。,ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取,;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作 STMDAR0!,R5-R6 . . . LDMIBR0!,R5-R6,;使用堆棧指令進(jìn)行堆棧操作 STMEDR13!,R5-R6 . . . LDMEDR13!,R5
32、-R6,兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空與滿、加與減對(duì)應(yīng)的問(wèn)題。,ARM存儲(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)量操作。 指令格式如下: SWPcondB Rd,Rm,Rn 其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲(chǔ)器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于存儲(chǔ)到存儲(chǔ)器中,若Rm與Rd相同,則為寄存器與存儲(chǔ)器內(nèi)容進(jìn)行
33、互換;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)用示例: SWPR1,R1,R0;將R1的內(nèi)容與R0指向的存儲(chǔ)單元的內(nèi)容互換 SWPBR1,R2,R0;將R0指向的存儲(chǔ)單元低字節(jié)數(shù)據(jù)讀取到R1中 ;(高24位清零),并將R2的內(nèi)容寫(xiě)到該內(nèi)存單元中(最低字節(jié)有效),1 ARM指令集介紹,ARM指令集ARM數(shù)據(jù)處理指令,數(shù)據(jù)處理指令大致可分為3類(lèi): 數(shù)據(jù)傳送指令; 算術(shù)
34、邏輯運(yùn)算指令; 比較指令。 數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以使指令影響狀態(tài)標(biāo)志。,ARM數(shù)據(jù)處理指令指令編碼,指令執(zhí)行的條件碼,I用于區(qū)別立即數(shù)(I為1)和寄存器移位(I為0),opcode數(shù)據(jù)處理指令操作碼,第二操作數(shù),Rd目標(biāo)寄存器,Rn第一操作數(shù)寄存器,S設(shè)置條件碼,與指令中的S位對(duì)應(yīng),ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,注:當(dāng)后綴S時(shí),這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,在計(jì)算Operand2時(shí)更新標(biāo)志C,不影響標(biāo)志V。,ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,MOV指令將8位圖立即數(shù)(參看“第2操作數(shù):#immed_8r常數(shù)表
35、達(dá)式 ”)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。指令格式如下: MOVcondS Rd,operand2 MOV指令舉例如下: MOVR11,#0 xF000000B;R1= 0 xF000000B MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影響標(biāo)志位 MOVPC,LR;PC=LR,子程序返回,ARM數(shù)據(jù)處理指令數(shù)據(jù)傳送,MVN指令將8位立即數(shù)或寄存器(operand2)按位取反后傳送到目標(biāo)寄存器(Rd),因?yàn)槠渚哂腥》垂δ?,所以可以裝載范圍更廣的立即數(shù)。指令格式如下: MVNcondS Rd,operand2 MVN指令舉例如下: MV
36、NR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2 ;將R2按位取反,結(jié)果存到R1,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,注:這些指令影響N,Z,C和V標(biāo)志位。,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,加法運(yùn)算指令A(yù)DD指令將operand2的值與Rn的值相加,結(jié)果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應(yīng)用示例: ADDS R1,R1,#1020; R1=R1+1020,并影響標(biāo)志位 ADD R1,R1,R2,LSL #2;R1=R1+R22,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,減法運(yùn)算指令SUB指令用寄存器Rn減去operand2,結(jié)果保存到Rd中。指令格式如
37、下: SUBcondS Rd,Rn,operand2 應(yīng)用示例: SUBSR0,R0,#240;R0=R0-240 ,并影響標(biāo)志位 SUBSR2,R1,R2;R2=R1-R2 ,并影響標(biāo)志位,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,逆向減法運(yùn)算指令RSB指令將operand2的值減去Rn,結(jié)果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應(yīng)用示例: RSB R3,R1,#0 xFF00 ;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R22)-R2影響標(biāo)志位,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,帶進(jìn)位加法指令A(yù)DC將operand2的值與Rn的值相
38、加,再加上CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd寄存器。指令格式如下: ADCcondS Rd,Rn,operand2 例:(用ADC實(shí)現(xiàn)64位加法,結(jié)果存于R1(高32位)、R0中): ADDS R0,R0,R2 ;R0等于低32位相加,并影響標(biāo)志位 ADC R1,R1,R3;R1等于高32位相加,并加上低位進(jìn)位,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,帶進(jìn)位減法指令SBC用寄存器Rn減去operand2,再減去CPSR中的C條件標(biāo)志位的非,結(jié)果保存到Rd中。指令格式如下: SBCcondS Rd,Rn,operand2 例(使用SBC實(shí)現(xiàn)64位減法,結(jié)果存于R1、R0中): SUBS R0,R0,R
39、2 ; 低32位相減,并影響標(biāo)志位 SBC R1,R1,R3;高32位相減,并減去低位借位,ARM數(shù)據(jù)處理指令算術(shù)運(yùn)算,帶進(jìn)位逆向減法指令RSC指令用寄存器operand2減去Rn,再減去CPSR中的C條件標(biāo)志位,結(jié)果保存到Rd中。指令格式如下: RSCcondS Rd,Rn,operand2 應(yīng)用示例(使用RSC指令實(shí)現(xiàn)求64位數(shù)值的負(fù)數(shù) ): RSBS R2,R0,#0 ;R2=-R0 RSC R3,R1,#0 ;R3=-R1- !Carry,ARM數(shù)據(jù)處理指令邏輯運(yùn)算指令,注:當(dāng)后綴S時(shí),這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,在計(jì)算Operand2時(shí)更新標(biāo)志C,不影響標(biāo)志V。,ARM數(shù)據(jù)處理指
40、令邏輯運(yùn)算指令,邏輯與操作指令A(yù)ND指令將operand2的值與寄存器Rn的值按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下: ANDcondS Rd,Rn,operand2 AND 將在兩個(gè)操作數(shù)上進(jìn)行邏輯與,把結(jié)果放置到目的寄存器中;對(duì)屏蔽你要在上面工作的位很有用。 操作數(shù) 1 是一個(gè)寄存器,操作數(shù) 2 可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即值: 例:ANDS R0,R0,#0 x01;R0=R0將R1的低4位取反 EOR R2,R1,R0 ;R2=R1R0 EORSR0,R5,#0 x01; 將R5和0 x01進(jìn)行邏輯異或, ;結(jié)果保存到R0,并影響標(biāo)志位,ARM數(shù)據(jù)處理指令
41、邏輯運(yùn)算指令,位清除指令BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結(jié)果保存到Rd中。指令格式如下: BICcondS Rd,Rn, operand2 例:BIC R1,R1,#0 x0F ;將R1的低4位清零,其它位不變 BIC R1,R2,R3 ;將R3的反碼和R2相邏輯“與”, ;結(jié)果保存到R1中,ARM數(shù)據(jù)處理指令比較指令,注:這些指令影響N,Z,C和V標(biāo)志位。,ARM數(shù)據(jù)處理指令比較指令,比較指令CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位(N/Z/C/V) 。指令格式如下: CMPcondRn, o
42、perand2 例:CMPR1,#10 ; R1與10比較,設(shè)置相關(guān)標(biāo)志位 CMPGTR1,R2; R1與R2比較,設(shè)置相關(guān)標(biāo)志位 ;若R110, 則執(zhí)行本指令,ARM數(shù)據(jù)處理指令比較指令,負(fù)數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。指令格式如下: CMNcondRn, operand2 例:CMNR0,#1 ; R0+1,判斷R0是否為1的補(bǔ)碼 ;如果是,則設(shè)置Z標(biāo)志位,ARM數(shù)據(jù)處理指令比較指令,負(fù)數(shù)比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。指令格式: CM
43、NcondRn, operand2,注意:CMN指令與ADDS指令的區(qū)別在于CMN指令不保存運(yùn)算結(jié)果。CMN指令可用于負(fù)數(shù)比較,比如CMN R0,#1指令則表示R0與-1比較,若R0為-1(即1的補(bǔ)碼),則Z置位;否則Z復(fù)位。,ARM數(shù)據(jù)處理指令比較指令,位測(cè)試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。指令格式如下:TSTcond Rn, operand2 例:TSTR0,#0 x01; 判斷R0的最低位是否為0 TSTR1,#0 x0F; 判斷R1的低4位是否為0,ARM數(shù)據(jù)處理指令比較指令,位測(cè)試指令TST指令將
44、寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位。指令格式如下: TSTcond Rn, operand2,注意:TST指令與ANDS指令的區(qū)別在于TST指令不保存運(yùn)算結(jié)果。TST指令通常與EQ、NE條件碼配合使用,當(dāng)所有測(cè)試位均為0時(shí),EQ有效(Z=1),而只要有一個(gè)測(cè)試位不為0,則NE有效(Z=0) 。,ARM數(shù)據(jù)處理指令比較指令,相等測(cè)試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,影響CPSR中的相應(yīng)條件標(biāo)志位。指令格式如下: TEQcond Rn, operand2 例:TEQR0,R1; 比較R0與
45、R1是否相等 (不影響V位和C位),ARM數(shù)據(jù)處理指令比較指令,相等測(cè)試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來(lái)判斷是否執(zhí)行。指令格式如下: TEQcond Rn, operand2,1 ARM指令集介紹,ARM指令集乘法指令,ARM具有三種乘法指令,分別為: 3232位乘法指令; 32 32位乘加指令; 32 32位結(jié)果為64位的乘/乘加指令。,ARM指令乘法指令,乘法指令編碼,指令執(zhí)行的條件碼,Opcode乘法指令操作碼,S設(shè)置條件碼,與指令中的S位對(duì)應(yīng),Rm為被乘數(shù)寄存器,
46、Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標(biāo)寄存器(低32位),Rd/RdHi為目標(biāo)寄存器或64位乘法指令的目標(biāo)寄存器(高32位),Rs為乘數(shù)寄存器,ARM指令乘法指令,ARM指令乘法指令,32位乘法指令MUL指令將Rm和Rs中的值相乘,結(jié)果的低32位保存到Rd中。 Rd,Rm,Rs不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下: MULcondS Rd,Rm,Rs 例:MUL R1,R2,R3 ;R1=R2R3 MULS R0,R3,R7 ;R0=R3R7,影響CPSR中的N位和Z位,ARM指令乘法指令,32位乘加指令MLA指令將Rm和Rs中的值
47、相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的低32位保存到Rd中。 Rd,Rm,Rs,Rn不能為R15。只影響CPSR中的N位和Z位,不影響V,C不確定。指令格式如下: MLAcondS Rd,Rm,Rs,Rn 例:MLA R1,R2,R3,R0; R1=R2R3+R0,ARM指令乘法指令,64位無(wú)符號(hào)乘法指令UMULL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下: UMULLcondS RdLo,RdH
48、i,Rm,Rs 應(yīng)用示例: UMULL R0,R1,R5,R8; (R1、R0)=R5R8,ARM指令乘法指令,64位無(wú)符號(hào)乘加指令UMLAL指令將Rm和Rs中的值作無(wú)符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下: UMLALcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: UMLAL R0,R1,R5,R8;(R1、R0)=R5R8+(R1、R0),ARM指令乘法指令,64位有符號(hào)
49、乘法指令SMULL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下: SMULLcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: SMULLR2,R3,R7,R6; (R3、R2)=R7R6,ARM指令乘法指令,64位有符號(hào)乘加指令SMLAL指令將Rm和Rs中的值作有符號(hào)數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RdLo中,而高32位保存到RdHi中。 RdLo/Hi,Rm,
50、Rs不能為R15。 RdLo/Hi,Rm必須是不同的寄存器。只影響CPSR中的N位和Z位,標(biāo)志C和V不確定。指令格式如下: SMLALcondS RdLo,RdHi,Rm,Rs 應(yīng)用示例: SMLALR2,R3,R7,R6; (R3、R2)=R7R6+(R3、R2),1 ARM指令集介紹,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為
51、0)和BL指令(L為1),24位有符號(hào)立即數(shù)(偏移量),分支指令BX指令編碼格式,指令執(zhí)行的條件碼,Rm目標(biāo)地址寄存器,該寄存器裝載跳轉(zhuǎn)地址,ARM指令分支指令,ARM指令分支指令,分支指令B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下: Bcond Label 例:B WAITA; 跳轉(zhuǎn)到WAITA標(biāo)號(hào)處 B0 x1234; 跳轉(zhuǎn)到絕對(duì)地址0 x1234處,ARM指令分支指令,帶鏈接的分支指令BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR) 連接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。跳轉(zhuǎn)范圍限制
52、在當(dāng)前指令的32M字節(jié)地址內(nèi)。指令格式如下: BLcond Label,Addr1,Addr2,1.當(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,ARM指令分支指令,帶狀態(tài)切換的分支指令BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來(lái)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下: BXcond Rm,A
53、RM指令分支指令,帶狀態(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 。指令格式如下: BXcond Rm,例:ADRL R0,ThumbFun+1 ;將Thumb程序的入口地址加1存入R0 BX R0 ; 跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來(lái)切換處理器狀態(tài),1 ARM指令集介紹,ARM指令集雜項(xiàng)指令,
54、ARM指令集中有三條指令作為雜項(xiàng)指令,在實(shí)際應(yīng)用中這三條指令非常重要。它們?nèi)缦滤荆?ARM雜項(xiàng)指令軟中斷指令,SWI指令用于產(chǎn)生SWI異常,使得CPU模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉(zhuǎn)到SWI異常入口。不影響條件碼標(biāo)志。 該指令主要用于用戶(hù)程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù),操作系統(tǒng)在SWI異常處理程序中進(jìn)行相應(yīng)的系統(tǒng)服務(wù)。,SWIcondimmed_24,SWI指令格式,SWI指令編碼,指令執(zhí)行的條件碼,指令傳遞的參數(shù)(24位立即數(shù),其值為02241),執(zhí)行時(shí)CPU忽略該參數(shù)。,ARM雜項(xiàng)指令軟中斷指令,根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應(yīng)
55、的處理。SWI指令傳遞參數(shù)有以下兩種方法, 指令中的24位立即數(shù)指定了用戶(hù)請(qǐng)求的服務(wù)類(lèi)型,參數(shù)通過(guò)通用寄存器傳遞。 MOV R0,#34;設(shè)置子功能號(hào)為34 SWI 12;調(diào)用12號(hào)軟中斷 指令中的24位立即數(shù)被忽略,用戶(hù)請(qǐng)求的服務(wù)類(lèi)型由寄存器R0的值決定,參數(shù)通過(guò)其它的通用寄存器傳遞。 MOV R0,#12;調(diào)用12號(hào)軟中斷 MOV R1,#34;設(shè)置子功能號(hào)為34 SWI 0,ARM雜項(xiàng)指令軟中斷指令,在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為: 首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過(guò)對(duì)SPSR訪問(wèn)得到; 然后取得該SWI指令的地址,這可通過(guò)
56、訪問(wèn)LR寄存器得到; 接著讀出該SWI指令,分解出立即數(shù)。,SWI_Handler STMFD SP!, R0-R3, R12, LR; 現(xiàn)場(chǎng)保護(hù) MRS R0, SPSR ; 讀取SPSR STMFD SP!, R0 ; 保存SPSR TST R0, #0 x20 ; 測(cè)試T標(biāo)志位 LDRNEH R0, LR,#-2 ; 若是Thumb指令,讀取指令碼(16位) BICNE R0, R0, #0 xFF00; 取得Thumb指令的8位立即數(shù)(低8位) LDREQ R0, LR,#-4 ; 若是ARM指令,讀取指令碼(32位) BICEQ R0, R0, #0 xFF000000 ; 取得AR
57、M指令的24位立即數(shù)(低24位) . LDMFD SP!, R0-R3, R12, PC; SWI異常中斷返回,NE:Z=0 EQ:Z=1,ARM雜項(xiàng)指令狀態(tài)寄存器讀指令,在ARM處理器中,只有MRS指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行讀操作。通過(guò)讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進(jìn)入異常前的處理器狀態(tài)。該指令不影響條件碼。,MRScond Rd,psr,MRS指令格式,指令對(duì)應(yīng)編碼,指令執(zhí)行的條件碼,目標(biāo)寄存器,不能為R15,區(qū)別CPSR(為0)和SPSR(為1)寄存器,ARM雜項(xiàng)指令狀態(tài)寄存器讀指令,在ARM處理器中,只有MRS指令可以對(duì)狀態(tài)寄存器CP
58、SR和SPSR進(jìn)行讀操作。通過(guò)讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進(jìn)入異常前的處理器狀態(tài)。,MRScond Rd,psr,MRS指令格式,應(yīng)用示例: MRS R1,CPSR; 將CPSR狀態(tài)寄存器讀取,保存到R1中 MRS R2,SPSR; 將SPSR狀態(tài)寄存器讀取,保存到R2中,ARM雜項(xiàng)指令狀態(tài)寄存器寫(xiě)指令,在ARM處理器中,只有MSR指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行寫(xiě)操作。與MRS配合使用,可以實(shí)現(xiàn)對(duì)CPSR或SPSR寄存器的讀-修改-寫(xiě)操作,可以切換處理器模式、或者允許/禁止IRQ/FIQ中斷等。,MSRcond psr_fields,#imme
59、d_8r,MSR指令格式1,MSRcond psr_fields,Rm,MSR指令格式2,指令執(zhí)行的條件碼,CPSR或SPSR,指定傳送的區(qū)域,可以為以下字母(必須小寫(xiě))的一個(gè)或者組合: c 控制域屏蔽字節(jié)(psr7.0) x 擴(kuò)展域屏蔽字節(jié)(psr15.8) s 狀態(tài)域屏蔽字節(jié)(psr23.16) f 標(biāo)志域屏蔽字節(jié)(psr31.24),保存要傳送到狀態(tài)寄存器指定域數(shù)據(jù)的源寄存器,要傳送到狀態(tài)寄存器指定域的立即數(shù),ARM雜項(xiàng)指令狀態(tài)寄存器寫(xiě)指令,在ARM處理器中,只有MSR指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行寫(xiě)操作。與MRS配合使用,可以實(shí)現(xiàn)對(duì)CPSR或SPSR寄存器的讀-修改-寫(xiě)操作,可以切換處理器模式、或者允
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JJF 2194-2025氧化鋅避雷器測(cè)試儀校準(zhǔn)規(guī)范
- LY/T 3350-2023展平竹砧板
- 2025至2030年中國(guó)半胱胺酒石酸鹽數(shù)據(jù)監(jiān)測(cè)研究報(bào)告
- 2025年軍隊(duì)文職人員招聘之軍隊(duì)文職管理學(xué)與服務(wù)通關(guān)題庫(kù)(附帶答案)
- 2025年消防設(shè)施操作員之消防設(shè)備基礎(chǔ)知識(shí)強(qiáng)化訓(xùn)練試卷A卷附答案
- 模擬卷浙江寧波2025屆高三一模語(yǔ)文試題及答案
- (一模)哈三中2025屆高三第一次模擬考試 語(yǔ)文試題(含答案)
- 公司管理理念宣傳手冊(cè)(講座內(nèi)容)
- 中學(xué)生讀書(shū)勵(lì)志征文
- 化工圖標(biāo)知識(shí)培訓(xùn)課件
- 2025安徽省投資集團(tuán)控股有限公司校園招聘34人筆試參考題庫(kù)附帶答案詳解
- 2025年新部編統(tǒng)編版中學(xué)七年級(jí)下冊(cè)歷史全冊(cè)分課知識(shí)點(diǎn)總結(jié)課件105張
- 2025年湖南科技職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)匯編
- 語(yǔ)文-浙江省寧波市慈溪市2024學(xué)年高二第一學(xué)期期末測(cè)試試題和答案
- 2025海南三亞政府雇員人才儲(chǔ)備庫(kù)招聘300人易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 植被重建施工方案
- 培養(yǎng)自律與自控能力主題班會(huì)
- 交替?zhèn)髯g課件外研社王丹
- 人教版(2024)八年級(jí)下冊(cè)物理第九章《壓強(qiáng)》第4節(jié) 跨學(xué)科實(shí)踐:制作簡(jiǎn)易活塞式抽水機(jī) 教案
- 《餐飲業(yè)概述》課件 - 探索美食與服務(wù)之道
- 2024年黑龍江生態(tài)工程職業(yè)學(xué)院高職單招語(yǔ)文歷年參考題庫(kù)含答案解析
評(píng)論
0/150
提交評(píng)論