第3章ARM微處理器指令系統(tǒng)與編程示例_第1頁(yè)
第3章ARM微處理器指令系統(tǒng)與編程示例_第2頁(yè)
第3章ARM微處理器指令系統(tǒng)與編程示例_第3頁(yè)
第3章ARM微處理器指令系統(tǒng)與編程示例_第4頁(yè)
第3章ARM微處理器指令系統(tǒng)與編程示例_第5頁(yè)
已閱讀5頁(yè),還剩132頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、ARM處理器的指令系統(tǒng)處理器的指令系統(tǒng)第3章1.ARM程序的文件類型:ARM開(kāi)發(fā)中大部分程序使用C語(yǔ)言編寫(xiě),文件類型為“”;:涉及到硬件底層操作的代碼有時(shí)必須使用匯編語(yǔ)言編寫(xiě),文件類型為“”。2.為什么學(xué)習(xí)ARM指令系統(tǒng):本章目標(biāo)本章目標(biāo) 能夠掌握ARM指令的8種尋址方式 能夠掌握ARM基本編程實(shí)驗(yàn) 熟悉ARM指令集 ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡(jiǎn)單。ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢(shì),它是AR

2、M指令集的子集。 所有的ARM指令都是可以有條件執(zhí)行有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。 ARM程序和Thumb程序可相互調(diào)用,相互之間的狀態(tài)切換開(kāi)銷幾乎為零。 ARM指令集與Thumb指令集的關(guān)系Thumb指令集具有靈活、小巧的特點(diǎn)ARM指令集支持ARM核所有的特性,具有高效、快速的特點(diǎn)3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類 尋址方式是根據(jù)指令中給出的地址碼字段來(lái)實(shí)現(xiàn)尋找真實(shí)操作數(shù)地址的方式。ARM處理器具有8種基本尋址方式。1.寄存器尋址;2.立即尋址;3.寄存器移位尋址;4.寄存器間接尋址;5.基址尋址;6.多寄存器尋址;7.堆棧尋址;8.相對(duì)尋址

3、。 操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來(lái)操作。寄存器尋址指令舉例如下: MOV R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結(jié)果保存到R0 0 xAA0 x55R2R13.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器尋址MOV R1,R2MOV R1,R20 xAA 立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說(shuō),數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下: SUBSR0,R0,#1 ;R0減1,結(jié)果放入R0

4、,并且影響標(biāo)志位MOVR0,#0 xFF000 ;將立即數(shù)0 xFF000裝入R0寄存器 0 x55R0MOV R0,#0 xFF00程序存儲(chǔ)3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類立即尋址MOV R0,#0 xFF00MOV R0,#0 xFF000 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的

5、值左移R3位,然后和R1相 ;“與”操作,結(jié)果放入R10 x55R0R20 x013.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器移位尋址MOV R0,R2,LSL #3MOV R0,R2,LSL #30 x080 x08邏輯左移3位 寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下: LDRR1,R2;將R2指向的存儲(chǔ)單元的數(shù)據(jù)讀出;保存在R1中 SWPR1,R1,R2;將寄存器R1的值和R2指定的存儲(chǔ);單元的內(nèi)容交換 0 x55R0R2 0 x400000000 xAA

6、0 x400000003.1 ARM處理器尋址方式處理器尋址方式尋址方式分類寄存器間接尋址LDR R0,R2LDR R0,R20 xAA 基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址?;穼ぶ酚糜谠L問(wèn)基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問(wèn)等?;穼ぶ分噶钆e例如下: LDRR2,R3,#0 x0C ;讀取R3+0 x0C地址上的存儲(chǔ)單元 ;的內(nèi)容,放入R2 STRR1,R0,#-4! ;先R0=R0-4,然后把R1的值寄存 ;到保存到R0指定的存儲(chǔ)單元 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類基址尋址0 x55R2R3 0 x4

7、00000000 xAA0 x4000000CLDR R2,R3,#0 x0CLDR R2,R3,#0 x0C0 xAA將R3+0 x0C作為地址裝載數(shù)據(jù) 多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: LDMIAR1!,R2-R7,R12 ;將R1指向的單元中的數(shù)據(jù)讀出到 ;R2R7、R12中(R1自動(dòng)加1) STMIAR0!,R2-R7,R12 ;將寄存器R2R7、R12的值保 ;存到R0指向的存儲(chǔ); 單元中 ;(R0自動(dòng)加1)0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R

8、60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲(chǔ)器3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類多寄存器尋址LDMIA R1!,R2-R4,R6 LDMIA R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出” 。堆棧尋址是隱含的,它使用一個(gè)專門(mén)的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元即是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N: 向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧

9、3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲(chǔ)區(qū)棧頂棧底棧區(qū)SP向下增長(zhǎng)向上增長(zhǎng)0 x123456780 x12345678堆棧壓棧堆棧壓棧棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧;堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置,稱為空堆棧。 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址0 x123456780 x12345678棧頂SP0 x12345678棧頂SP壓棧壓棧所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長(zhǎng),堆棧指針指

10、向內(nèi)含有效數(shù)據(jù)項(xiàng)的最高地址。指令如LDMFA、STMFA等; 空遞增:堆棧向上增長(zhǎng),堆棧指針指向堆棧上的第一個(gè)空位置。指令如LDMEA、STMEA等; 滿遞減:堆棧向下增長(zhǎng),堆棧指針指向內(nèi)含有效數(shù)據(jù)項(xiàng)的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長(zhǎng),堆棧指針向堆棧下的第一個(gè)空位置。指令如LDMED、STMED等。 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類堆棧尋址 相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下:BLSUBR1;調(diào)用到SUBR1子程序BEQLOO

11、P;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處.LOOPMOVR6,#1.SUBR1. 3.1 ARM處理器尋址方式處理器尋址方式尋址方式分類相對(duì)尋址q1.ARM處理器尋址方式q2.指令集介紹 ARM指令集 Thumb指令集簡(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,#10LOOPBLADD_SUB ;調(diào)用子程序ADD_SUB BLOOP ;跳轉(zhuǎn)

12、到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結(jié)束 使用“;”進(jìn)行注釋標(biāo)號(hào)頂格寫(xiě)實(shí)際代碼段聲明文件結(jié)束ARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令 ARM指令的基本格式如下:3.2 指令集介紹指令集介紹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指令的基本格式如下:3.2 指令集介紹指令集介紹ARM指

13、令集第2個(gè)操作數(shù) S , 靈活的使用第2個(gè)操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:#immed_8r常數(shù)表達(dá)式;Rm寄存器方式;Rm,shift寄存器移位方式;3.2 指令集介紹指令集介紹ARM指令集第2個(gè)操作數(shù)#immed_8r常數(shù)表達(dá)式 該常數(shù)必須對(duì)應(yīng)8位位圖,即必須是一個(gè)8位的常數(shù)通過(guò)循環(huán)右移偶數(shù)位可以得到的數(shù)。循環(huán)右移10位0 x120 0 0 1 0 0 1 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x000 0 0 0 0 0 0 00 x

14、801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常數(shù)0 x12移位后得到的常數(shù)0 x048000003.2 指令集介紹指令集介紹ARM指令集第2個(gè)操作數(shù)#immed_8r常數(shù)表達(dá)式 該常數(shù)必須對(duì)應(yīng)8位位圖,即必須是一個(gè)8位的常數(shù)通過(guò)循環(huán)右移偶數(shù)位可以得到的數(shù)。例如:MOVR0,#1ANDR1,R2,#0 x0FMOVR1,#0 xC000;0 xC000可由0 x03循環(huán)右移16位得到可以由0 x4A循環(huán)右移10位得到2.請(qǐng)列舉2個(gè)8位圖立即數(shù)? 思考與練習(xí)?1.以下8位圖立即數(shù)是否合法?0 x0103C0000 x128000000 x4000003B(

15、0 xED循環(huán)右移2位)0 x0016C000(0 x5B循環(huán)右移18位)3.2 指令集介紹指令集介紹ARM指令集第2個(gè)操作數(shù)Rm寄存器方式 在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUBR1,R1,R2MOVPC,R03.2 指令集介紹指令集介紹ARM指令集第2個(gè)操作數(shù)Rm,shift寄存器移位方式 將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:操作碼說(shuō)明操作碼說(shuō)明ASR #n算術(shù)右移n位ROR #n循環(huán)右移n位LSL #n邏輯左移n位RRX帶擴(kuò)展的循環(huán)右移1位LSR #n邏輯右移n位Type RsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。3.2 指令集

16、介紹指令集介紹ARM指令集第2個(gè)操作數(shù)LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C3.2 指令集介紹指令集介紹ARM指令集第2個(gè)操作數(shù)Rm,shift寄存器移位方式例如:ADDR1,R1,R1,LSL #3;R1=R1+R1*8=9R1SUBR1,R1,R2,LSR R3;R1=R1-(R2/2R3)ARM指令的特點(diǎn)可條件執(zhí)行、可選擇影響標(biāo)志位、具有非常靈活的第二操作數(shù);ARM指令小節(jié)目錄1.指令格式2.條件碼3.ARM指令 ARM指令的基本格式如下:3.2 指令集介紹指令集介紹ARM指令集條件碼 S , 使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作,

17、提高代碼效率。 絕大部分的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ù)大于 11

18、01LEZ=1,N!=V有符號(hào)數(shù)小于或等于 1110AL任何無(wú)條件執(zhí)行 (指令默認(rèn)條件) 1111NV任何從不執(zhí)行(不要使用) 指令條件碼表3.2 指令集介紹指令集介紹ARM指令集條件碼C代碼:if(a b)a+;elseb+;對(duì)應(yīng)的匯編代碼:CMPR0,R1 ;R0與R1比較ADDHI R0,R0,#1 ;若R0R1,則R0=R0+1ADDLS R1,R1,#1 ;若R0R1,則R1=R1+1示例:ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令 為什么要掌握部分常用ARM指令?通過(guò)指令的學(xué)習(xí)可以更深入的了解ARM硬件結(jié)構(gòu)的

19、特點(diǎn);啟動(dòng)代碼為了滿足大部分系統(tǒng)的順利運(yùn)行,通常將系統(tǒng)硬件配置在最低性能,通過(guò)調(diào)整啟動(dòng)代碼中的參數(shù)使其更適合自己的硬件系統(tǒng);通過(guò)觀察反匯編代碼了解程序執(zhí)行情況,比如某個(gè)變量的操作是否被編譯器優(yōu)化掉了。ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集存儲(chǔ)器訪問(wèn)指令 ARM處理器是典型的RISC處理器,對(duì)存儲(chǔ)器的訪問(wèn)只能使用加載和存儲(chǔ)指令實(shí)現(xiàn)。ARM處理器是馮諾依曼存儲(chǔ)結(jié)構(gòu),程序空間、RAM空間及I/O映射空間統(tǒng)一編址,除對(duì)RAM操作以外,對(duì)外圍IO、程序數(shù)據(jù)的訪問(wèn)均要通過(guò)加載/存儲(chǔ)指令進(jìn)行

20、。 存儲(chǔ)器訪問(wèn)指令分為單寄存器操作指令和多寄存器操作指令。 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ǔ)指令。3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令單寄存器存取3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令單寄存器存取裝載指令:存儲(chǔ)指令:存儲(chǔ)器源地址目標(biāo)寄存器存儲(chǔ)器目標(biāo)地址源寄存器3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令單寄存器存取裝載指令:存儲(chǔ)指令:xxL

21、DR/STR指令搭配不同的后綴實(shí)現(xiàn)不同方式的單寄存器存取操作:字/半字/字節(jié)數(shù)據(jù)控制是/否用戶模式控制無(wú)/有符號(hào)控制助記符助記符說(shuō)明說(shuō)明操作操作條件碼位置條件碼位置LDR Rd,addressing 加載字字?jǐn)?shù)據(jù)Rdaddressing,addressing索引LDRcondLDRB Rd,addressing 加載無(wú)符號(hào)字節(jié)字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBLDRT Rd,addressing以用戶模式用戶模式加載字?jǐn)?shù)據(jù)Rdaddressing,addressing索引LDRcondTLDRBT Rd, addressing 以用戶模式用戶模式加載無(wú)符

22、號(hào)無(wú)符號(hào)字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondBTLDRH Rd, addressing 加載無(wú)符號(hào)半字無(wú)符號(hào)半字?jǐn)?shù)據(jù)Rdaddressing,addressing索引LDRcondHLDRSB Rd, addressing 加載有符號(hào)字節(jié)有符號(hào)字節(jié)數(shù)據(jù)Rdaddressing,addressing索引LDRcondSBLDRSH Rd, addressing加載有符號(hào)半字有符號(hào)半字?jǐn)?shù)據(jù) Rdaddressing,addressing索引 LDRcondSH ARM存儲(chǔ)器訪問(wèn)指令裝載指令助記符助記符說(shuō)明說(shuō)明操作操作條件碼位置條件碼位置STR Rd, addre

23、ssing 存儲(chǔ)字字?jǐn)?shù)據(jù)addressingRd,addressing索引STRcondSTRB Rd,addressing 存儲(chǔ)字節(jié)字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用戶模式用戶模式存儲(chǔ)字?jǐn)?shù)據(jù)addressingRd, addressing索引STRcondTSTRBT Rd,addressing 以用戶模式用戶模式存儲(chǔ)字節(jié)字節(jié)數(shù)據(jù)addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存儲(chǔ)半字半字?jǐn)?shù)據(jù)addressing Rd,addressing索引STRco

24、ndH ARM存儲(chǔ)器訪問(wèn)指令保存指令 ARM存儲(chǔ)器訪問(wèn)指令地址形式裝載指令:保存指令:立即數(shù):立即數(shù)可以是一個(gè)無(wú)符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 如:LDR R1,R0,#0 x12 寄存器:寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 如:LDR R1,R0,R2 寄存器及移位常數(shù):寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。 如:LDR R1,R0,R2,LSL #2 ARM存儲(chǔ)器訪問(wèn)指令尋址方式(地址計(jì)算方式)裝載指令:保存指令:零偏移: 如:LDR Rd,Rn前索引偏移:如:LDR Rd,Rn,

25、#0 x04!程序相對(duì)偏移:如:LDR Rd,labe1 后索引偏移:如:LDR Rd,Rn,#0 x04注意注意:大多數(shù)情況下,必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。0 x55R2R5 0 x400000000 x123456780 x40000000存儲(chǔ)器地址應(yīng)用示例:LDRR2,R5 ;將R5指向地址的字?jǐn)?shù)據(jù)存入R20 x12345678 ARM存儲(chǔ)器訪問(wèn)指令單寄存器轉(zhuǎn)載應(yīng)用0 x12345678R1R2 0 x400000000 x?0 x40000004存儲(chǔ)器地址應(yīng)用示例:STRR1,R2,#0 x04 ;將R1的數(shù)據(jù)存儲(chǔ)到R0+0 x04地址0 x12345678+4 ARM存儲(chǔ)

26、器訪問(wèn)指令單寄存器保存應(yīng)用3.2 指令集介紹指令集介紹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ù)傳遞等。3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取裝載指令:存儲(chǔ)指令:存儲(chǔ)器源地址目標(biāo)寄存器1目標(biāo)寄存器n存儲(chǔ)器目標(biāo)地址源寄存器1源寄存器n3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取裝載指令:存儲(chǔ)指令:xxLDM/STM指令搭配不同的后綴實(shí)現(xiàn)不同方式地址增長(zhǎng)方式:

27、IA: 每次傳送后地址加4IB: 每次傳送前地址加4DA:每次傳送后地址減4DB:每次傳送前地址減4 ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取數(shù)據(jù)塊傳送指令操作過(guò)程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1則為指令執(zhí)行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7

28、R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CH0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲(chǔ)器0 x010 x020 x030 x040 x40000010應(yīng)用示例:LDMIA R1!,R2-R4,R6 將R1指向的內(nèi)存數(shù)據(jù)讀取到R0-R4和R6寄存器中 ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取3.2 指令集介紹指令集介紹ARM存儲(chǔ)器訪問(wèn)指令多寄存器存取多寄存器存取指令與堆棧操作指令的

29、關(guān)系如下表所示。模式說(shuō)明模式說(shuō)明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作應(yīng)用示例:STMFD SP!,R0-R7,LR ARM存儲(chǔ)器訪問(wèn)指令滿遞減壓棧操作 棧 頂0 x010 x07ARM7內(nèi)核內(nèi)部寄存器存儲(chǔ)器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC

30、0 x01230 x?0 x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針指向棧頂;應(yīng)用示例:STMFD SP!,R0-R7,LR ARM存儲(chǔ)器訪問(wèn)指令滿遞減壓棧操作0 x010 x07ARM7內(nèi)核內(nèi)部寄存器存儲(chǔ)器0 x000 x4020R0R1R7SP0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x01230 x?0 x3FF8LR1.壓棧操作前寄存器和堆棧區(qū)的狀態(tài);2.壓棧操作前堆棧指針

31、指向棧頂;3.執(zhí)行壓棧操作指令保存R0-R7和LR0 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x3FFC 棧 頂應(yīng)用示例:LDMFD SP!,R0-R7,PC ARM存儲(chǔ)器訪問(wèn)指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲(chǔ)器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF8

32、0 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?應(yīng)用示例:LDMFD SP!,R0-R7,PC ARM存儲(chǔ)器訪問(wèn)指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲(chǔ)器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x

33、3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?3.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x000 x060 x01230 x0123帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFD SP!,R0-R7,PC ARM存儲(chǔ)器訪問(wèn)指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指向棧頂; 棧 頂0 x?0 x?存儲(chǔ)器0 x?0 x?0 x400

34、40 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x? 棧 頂帶狀態(tài)寄存器恢復(fù)的出棧操作:LDMFD SP!,R0-R7,PC ARM存儲(chǔ)器訪問(wèn)指令滿遞減出棧操作1.出棧操作前寄存器和堆棧區(qū)的狀態(tài);2.出棧操作前堆棧指針指

35、向棧頂;0 x?0 x?存儲(chǔ)器0 x?0 x?0 x40040 x40000 x400C0 x40080 x?0 x?0 x?0 x?0 x?0 x?0 x?0 x40140 x40100 x40200 x4018地址0 x?0 x401C0 x?0 x3FFC0 x?0 x3FF80 x010 x020 x030 x040 x050 x070 x000 x060 x0123ARM7內(nèi)核0 x4020R0R1R7SP0 x?LR0 x3FFCPC0 x?0 x?CPSRSPSR0 x?0 x40200 x010 x070 x000 x010 x020 x030 x040 x050 x070 x

36、000 x060 x01230 x01233.執(zhí)行出棧操作指令恢復(fù)R0-R7和PC3.2 指令集介紹指令集介紹 SWP指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個(gè)寄存器Rd中,同時(shí)將另一個(gè)寄存器Rm的內(nèi)容寫(xiě)入到該內(nèi)存單元中。 ARM存儲(chǔ)器訪問(wèn)指令寄存器和存儲(chǔ)器交換指令3.2 指令集介紹指令集介紹 ARM存儲(chǔ)器訪問(wèn)指令寄存器和存儲(chǔ)器交換指令裝載指令:存儲(chǔ)器目標(biāo)地址讀入寄存器輸出寄存器3.2 指令集介紹指令集介紹 ARM存儲(chǔ)器訪問(wèn)指令寄存器和存儲(chǔ)器交換指令裝載指令:助記符助記符說(shuō)明說(shuō)明操作操作條件碼位置條件碼位置SWP Rd,Rm,Rn 寄存器和存儲(chǔ)器字字?jǐn)?shù)據(jù)交換RdRn,

37、RnRm(RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存儲(chǔ)器字節(jié)字節(jié)數(shù)據(jù)交換RdRn,RnRm(RnRd或Rm)SWPcondB0 x12345678R1R20 x?0 x112233440 x40000000存儲(chǔ)器地址R0 0 x400000003.2 指令集介紹指令集介紹 ARM存儲(chǔ)器訪問(wèn)指令寄存器和存儲(chǔ)器交換指令應(yīng)用示例:SWPR2,R1,R0將R1的內(nèi)容與R0指向的存儲(chǔ)單元的內(nèi)容進(jìn)行交換0 x123456780 x11223344ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令3.2 指令集介紹指

38、令集介紹ARM指令集ARM數(shù)據(jù)處理指令 數(shù)據(jù)處理指令大致可分為3類: 數(shù)據(jù)傳送指令;算術(shù)邏輯運(yùn)算指令;比較指令。 數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,而不能對(duì)內(nèi)存中的數(shù)據(jù)進(jìn)行操作。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,并影響狀態(tài)標(biāo)志。 3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令 MOV指令將8位圖立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。裝載指令:目標(biāo)寄存器操作數(shù)3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令 MOV指令將8位圖立即數(shù)或寄存器傳送到目標(biāo)寄存器(Rd),可用于移位運(yùn)算等操作。 同類型的指令還有MVN,它可以實(shí)現(xiàn)數(shù)據(jù)的非傳遞,即把操作數(shù)取反后送至目標(biāo)寄存器。目標(biāo)

39、寄存器操作數(shù)取反3.2 指令集介紹指令集介紹數(shù)據(jù)傳送指令應(yīng)用示例:MOV R3,R1,LSL #3 ;R3=R180 x55R3R10 x010 x080 x08邏輯左移3位 思考與練習(xí)?1.MOV指令與LDR指令都是往目標(biāo)寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎? 思考與練習(xí)?1.MOV指令與LDR指令都是往目標(biāo)寄存器中傳送數(shù)據(jù),但是它們有什么區(qū)別嗎? MOV指令用于將數(shù)據(jù)從一個(gè)寄存器傳送到另一個(gè)寄存器中,或者將一個(gè)常數(shù)傳送到一個(gè)寄存器中,但是不能訪問(wèn)內(nèi)存。LDR指令用于從內(nèi)存中讀取數(shù)據(jù)放入寄存器中。3.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令 算術(shù)邏輯運(yùn)算指令包括“加/減”以及“與/或/異或

40、”等指令,它們的格式如下:運(yùn)算寄存器第二操作數(shù)運(yùn)算符結(jié)果寄存器3.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令部分算術(shù)運(yùn)算符:ADD:加法運(yùn)算ADC:帶進(jìn)位加法運(yùn)算SUB:減法運(yùn)算RSB:逆向減法運(yùn)算SBC:帶進(jìn)位減法運(yùn)算RSC:帶進(jìn)位逆向減法運(yùn)算3.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令部分邏輯運(yùn)算符:AND:邏輯“與”運(yùn)算ORR :邏輯“或”運(yùn)算EOR:邏輯“異或”運(yùn)算BIC:位清除運(yùn)算3.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令應(yīng)用示例:ADD R3,R1, #0 x08 ;R3=R1+80 x000000050 x08加法0 x?R1第二操作數(shù)R30 x0000000D3.2 指令集介紹

41、指令集介紹算術(shù)邏輯運(yùn)算指令應(yīng)用示例:AND R3,R1, #0 xFF ;R3=R1 & 0 x000000FF0 x123456780 x000000FF與0 x?R1第二操作數(shù)R30 x000000783.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令應(yīng)用示例:ORR R3,R1, R2 ;R3=R1|R20 x001122330 xAA000000或0 x?R1R2R30 xAA1122330 x000000FF0 x00000011異或0 x?R1R2R30 x?操作數(shù)3.2 指令集介紹指令集介紹算術(shù)邏輯運(yùn)算指令應(yīng)用示例:EOR R3,R1, R2,LSL 0 x03 ;R3=R1 (R2

42、8)0 x00000077邏輯左移3位0 x00000088 思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標(biāo)志位?R1R2BYTE2BYTE3BYTE1 BYTE0BYTE2BYTE3BYTE1 BYTE0BYTE0BYTE0 思考與練習(xí)?1.用R1寄存器的最低字節(jié)替換掉R2寄存器的最低字節(jié),并不影響條件標(biāo)志位?AND R1,R1,#0 x000000FFAND R2,R2,#0 xFFFFFF00ORR R2,R2,R13.2 指令集介紹指令集介紹比較指令 比較指令將兩個(gè)數(shù)值進(jìn)行的特定運(yùn)算,根據(jù)運(yùn)算結(jié)果影響CPSR的相關(guān)標(biāo)志位,用于后面程序的條件執(zhí)行,但是運(yùn)

43、算結(jié)果不予保存。運(yùn)算寄存器操作數(shù)運(yùn)算符影響標(biāo)志位3.2 指令集介紹指令集介紹比較指令比較運(yùn)算符:CMP:數(shù)值比較CMN:負(fù)數(shù)比較TST:位測(cè)試TEQ:相等測(cè)試0 x000000050 x08減法條件標(biāo)志R1R33.2 指令集介紹指令集介紹比較指令應(yīng)用示例:CMP R3,R1 ;R3減R1并影響標(biāo)志位無(wú)符號(hào)小于3.2 指令集介紹指令集介紹比較指令應(yīng)用示例:TSTR3,#0 x02 ;測(cè)試R3的第2位并影響標(biāo)志位0 x000000050 x02相與條件標(biāo)志R3操作數(shù)為13.2 指令集介紹指令集介紹比較指令應(yīng)用示例:TEQ R3,R2 ; R3與R2是否相等并影響標(biāo)志位0 x000000AA0 x0

44、00000CC異或條件標(biāo)志R3R2不等 與CMP的區(qū)別在于TEQ不影響C和V位,也就是只能判斷是否相等,而不能判斷是否大于,或小于。ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集乘法指令 ARM7TDMI具有三種乘法指令,分別為:3232位乘法指令;32 32位乘加指令;32 32位結(jié)果為64位的乘/乘加指令。3.2 指令集介紹指令集介紹ARM指令集乘法指令助記符助記符說(shuō)明說(shuō)明操作操作條件碼位置條件碼位置MUL Rd,Rm,Rs 32位乘法指令RdRm*Rs (RdRm)MULcond

45、SMLA Rd,Rm,Rs,Rn32位乘加指令RdRm*Rs+Rn (RdRm)MLAcondSUMULL RdLo,RdHi,Rm,Rs64位無(wú)符號(hào)乘法指令(RdLo,RdHi)Rm*RsUMULLcondSUMLAL RdLo,RdHi,Rm,Rs64位無(wú)符號(hào)乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondSSMULL RdLo,RdHi,Rm,Rs64位有符號(hào)乘法指令(RdLo,RdHi)Rm*RsSMULLcondSSMLAL RdLo,RdHi,Rm,Rs64位有符號(hào)乘加指令(RdLo,RdHi)Rm*Rs+(RdLo,RdHi)SMLALcondS

46、3.2 指令集介紹指令集介紹ARM指令集3232位乘法指令運(yùn)算寄存器第二操作數(shù)乘法目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集3232位乘法指令應(yīng)用示例:MUL R3,R2,R1 ; R3=R2R10 x000000020 x00000008乘法0 x?R1R2R30 x000000103.2 指令集介紹指令集介紹ARM指令集3232位乘加法指令運(yùn)算寄存器1運(yùn)算寄存器2乘法中間結(jié)果加法第二操作數(shù)目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集3232位乘加法指令應(yīng)用示例:MLA R3,R2,R1,R0 ; R3=R2R1 + R00 x000000020 x00000008乘法中間結(jié)果

47、加法0 x00000005?R2R1R0R30 x000000100 x00000015ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.協(xié)處理器指令6.雜項(xiàng)指令7.偽指令3.2 指令集介紹指令集介紹ARM指令集程序如何跳轉(zhuǎn)在ARM中有兩種方式可以實(shí)現(xiàn)程序的跳轉(zhuǎn):1.直接向PC寄存器賦值實(shí)現(xiàn)跳轉(zhuǎn); 例: MOV PC,R142.使用分支指令直接跳轉(zhuǎn)。3.2 指令集介紹指令集介紹ARM指令集分支指令程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)程序代碼跳轉(zhuǎn)指令跳轉(zhuǎn)目標(biāo)3.2 指令集介紹指令集介紹ARM指令集分支指令分支指令種類:B:分支指令BL:帶鏈接的分支指令BX:帶狀態(tài)切換的分支指

48、令 ARM指令分支指令因?yàn)橛脕?lái)表示目標(biāo)地址的位數(shù)有限,所以B/BL指令無(wú)法實(shí)現(xiàn)無(wú)法實(shí)現(xiàn)4G4G(3232位)范圍內(nèi)的任意跳轉(zhuǎn)位)范圍內(nèi)的任意跳轉(zhuǎn)3.2 指令集介紹指令集介紹ARM指令集指令為簡(jiǎn)單的跳轉(zhuǎn)指令,不附帶其它功能。跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。程序代碼B mainxxmain分支指令程序代碼BL LabelxxxxxxLabelxxxMOV PC,LRAddr1Addr2xxxxxxLRPC ARM指令分支指令 帶鏈接的分支指令BL指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)之前將下一條指令的地址拷貝到R14(即LR) 鏈接寄存器中,它適用于

49、子程序調(diào)用。跳轉(zhuǎn)范圍限制在當(dāng)前指令的32M字節(jié)地址內(nèi)。指令格式如下:Addr1LabelAddr2Addr21.當(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í)行例如: BL DelayNS;調(diào)用子程序DelayNS ARM指令分支指令 帶狀態(tài)切換的分支指令BX指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時(shí)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:最低位為1?YN切換到狀態(tài)切換到狀態(tài) ARM指令分支指令 帶狀態(tài)切換的分支指令B

50、X指令除了具有跳轉(zhuǎn)功能,還能在跳轉(zhuǎn)的同時(shí)切換處理器狀態(tài)。其跳轉(zhuǎn)范圍不受限制。指令格式如下:例如:ADRL R0,T_Fun+1 ;將Thumb程序的入口地址加1存入R0BXR0 ; 跳轉(zhuǎn)到R0指定的地址, ;并根據(jù)R0的最低位來(lái)切換處理器狀態(tài)ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.雜項(xiàng)指令6.偽指令 在ARM指令集中雜項(xiàng)指令共有3條,它們非常重要,特別是與操作系統(tǒng)的使用息息相關(guān):1.軟件中斷產(chǎn)生指令:SWI2. 程序狀態(tài)寄存器讀指令:MRS3. 程序狀態(tài)寄存器寫(xiě)指令:MSR3.2 指令集介紹指令集介紹ARM指令集雜項(xiàng)指令3.2 指令集介紹指令集介紹AR

51、M指令集軟中斷指令 SWI指令用于產(chǎn)生軟中斷,主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù)。執(zhí)行該指令后,處理器將完成以下動(dòng)作:1. 切換到管理模式2. 將CPSR備份到管理模式下的SPSR寄存器3. 程序跳轉(zhuǎn)到軟件中斷入口用戶模式管理模式任務(wù)1任務(wù)2其它代碼功能1:打開(kāi)中斷功能2:關(guān)閉中斷功能n:任務(wù)調(diào)度CPSR寄存器SPSR寄存器1.使用操作系統(tǒng)后,為了防止出錯(cuò)的任務(wù)影響其它任務(wù)的執(zhí)行,通常將任務(wù)放在用戶模式執(zhí)行,以限制其權(quán)限;2.對(duì)于一些重要的操作,如中斷的開(kāi)關(guān),必須由操作系統(tǒng)完成。使用軟件中斷指令即可完成系統(tǒng)功能調(diào)用; ARM雜項(xiàng)指令軟中斷指令3.2 指令集介紹指令集介紹ARM指令集軟中斷指

52、令 SWI指令格式如下所示: 可以利用指令中的這個(gè)24位立即數(shù)向軟中斷服務(wù)程序傳遞參數(shù),比如請(qǐng)求的服務(wù)類型 ARM雜項(xiàng)指令軟中斷指令 根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24位立即數(shù)指定了用戶請(qǐng)求的服務(wù)類型,參數(shù)通過(guò)通用寄存器傳遞。 MOV R0,#34;設(shè)置子功能號(hào)為34 SWI 12;調(diào)用12號(hào)軟中斷 指令中的24位立即數(shù)被忽略,用戶請(qǐng)求的服務(wù)類型由寄存器R0的值決定,參數(shù)通過(guò)其它的通用寄存器傳遞。 MOV R0,#12;調(diào)用12號(hào)軟中斷 MOV R1,#34;設(shè)置子功能號(hào)為34 SWI 0 3.2 指令集介紹指令集介紹A

53、RM指令集狀態(tài)寄存器讀指令 在ARM處理器中,只有MRS指令可以對(duì)狀態(tài)寄存器CPSR和SPSR進(jìn)行讀操作。通過(guò)讀CPSR可以了解當(dāng)前處理器的工作狀態(tài)。讀SPSR寄存器可以了解到進(jìn)入異常前的處理器狀態(tài)。指令格式如下所示:目標(biāo)寄存器3.2 指令集介紹指令集介紹ARM指令集狀態(tài)寄存器讀指令 應(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ě)操作,可以

54、切換處理器模式等操作。操作數(shù)分為兩種:1.寄存器2.8位圖立即數(shù)PSR寄存器被分為四個(gè)8位的域:1.狀態(tài)位域:用 表示2.擴(kuò)展位域:用 表示3.條件標(biāo)志位域:用 表示4.控制位域:用 表示3.2 指令集介紹指令集介紹ARM指令集狀態(tài)寄存器寫(xiě)指令示例,將R0的內(nèi)容寫(xiě)入CPSR寄存器的控制位域MSR CPSR_c,R0條件代碼標(biāo)志保留控制位域Byte0Byte3, Byte2, Byte1R0CPSRNZCV IM0M1M2M3M4TF. . .31 30 29 28 27 26 8 7 6 5 4 3 2 1 0Byte0 ARM雜項(xiàng)指令狀態(tài)寄存器寫(xiě)指令啟動(dòng)代碼堆棧初始化應(yīng)用示例:INITSTA

55、CKMOV R0,LR;設(shè)置管理模式堆棧MSR CPSR_C,#0 xD3LDR SP,StackSvc;設(shè)置中斷模式堆棧MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD311010011禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)管理模式MSR CPSR_C,#0 xD3CPRS寄存器 ARM雜項(xiàng)指令狀態(tài)寄存器寫(xiě)指令啟動(dòng)代碼堆棧初始化應(yīng)用示例: INITSTACKMOV R0,LR;設(shè)置管理模式堆棧MSR CPSR_C,#0 xD3LDR

56、 SP,StackSvc;設(shè)置中斷模式堆棧MSR CPSR_C,#0 xD2LDR SP,StackIrq.模式位狀態(tài)位IRQ禁止位FIQ禁止位NZCVIFT M4 M3 M2 M1 M031 30 29 28 27 2676543210配置值0 xD2 211010010禁止FIQ中斷禁止IRQ中斷ARM狀態(tài)IRQIRQ模式MSR CPSR_C,#0 xD2CPRS寄存器 思考與練習(xí)?1. 使用MSR和MRS指令,通過(guò)修改CPSR寄存器,實(shí)現(xiàn)打開(kāi)/關(guān)閉IRQ中斷的兩個(gè)子程序,注意不能影響其它位? (1)(2)(3)(4);子程序:使能IRQ中斷Enable_IRQ MRS R0, CPSR

57、BIC R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR ;子程序:禁能IRQ中斷Disable_IRQ MRS R0 CPSR ORR R0, R0,#0 x80 MSR CPSR_c,R0 MOV PC,LR 1.將CPSR寄存器內(nèi)容讀出到R0;2.修改對(duì)應(yīng)于CPSR中的I控制位;3.將修改后的值寫(xiě)回 CPSR寄存器的對(duì)應(yīng)控制域;4.返回上一層函數(shù); 思考與練習(xí)?ARM指令種類1.存儲(chǔ)器訪問(wèn)指令2.數(shù)據(jù)處理指令3.乘法指令4.ARM分支指令5.雜項(xiàng)指令6.偽指令3.2 指令集介紹指令集介紹ARM偽指令 ARM偽指令不屬于ARM指令集中的指令,是為了編程方便而定義的

58、。偽指令可以像其它ARM指令一樣使用,但在編譯時(shí)這些指令將被等效的ARM指令代替。反匯編代碼源程序偽指令實(shí)際指令編譯器實(shí)際指令實(shí)際指令3.2 指令集介紹指令集介紹ARM偽指令 常用的ARM偽指令有四條:1.小范圍地址讀取指令:2.中等范圍地址讀取指令:3.大等范圍地址讀取指令:4.空操作指令: ARM偽指令小范圍的地址讀取 偽指令將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中。在匯編編譯器編譯源程序時(shí),ADR偽指令被編譯器替換成一條合適的指令,若不能用一條指令實(shí)現(xiàn),則產(chǎn)生錯(cuò)誤,編譯失敗。目標(biāo)寄存器表達(dá)式 ARM偽指令小范圍的地址讀取目標(biāo)寄存器表達(dá)式地址表達(dá)式expr的取指

59、范圍:當(dāng)?shù)刂分挡皇亲謱?duì)齊時(shí),其取指范圍為;當(dāng)?shù)刂分凳亲謱?duì)齊時(shí),其取指范圍為;當(dāng)?shù)刂分凳?6字節(jié)對(duì)齊時(shí),其取指范圍將更大。 ARM偽指令小范圍的地址讀取 . ADR R0,Delay .Delay MOV R0,r14 .應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0 .0 x20 ADD r0,pc,#0 x3c . .0 x64 MOV r0,r14 .編譯后的反匯編代碼:地址程序代碼 ARM偽指令小范圍的地址讀取 . ADR R0,Delay .Delay MOV R0,r14 .應(yīng)用示例(源程序):使用偽指令將程序標(biāo)號(hào)Delay的地址存入R0 .0 x20 ADD r0

60、,pc,#0 x3c . .0 x64 MOV r0,r14 .編譯后的反匯編代碼:ADR偽指令被匯編成一條指令 ARM偽指令小范圍的地址讀取 ;查表應(yīng)用示例: ADR R0,DISP_TAB;加載轉(zhuǎn)換表地址 LDRB R1,R0,R2; 使用R2作為參數(shù),進(jìn)行查表 DISP_TAB DCB 0 xC0,0 xF9,0 xA4,0 xB0,0 x99, 0 x92,0 x82,0 xF8 ARM偽指令中等范圍的地址讀取 偽指令將基于PC相對(duì)偏移的地址值或基于寄存器相對(duì)偏移的地址值讀取到寄存器中,比ADR偽指令可以讀取更大范圍的地址 。在匯編編譯器編譯源程序時(shí),ADRL偽指令被編譯器替換成兩條合

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論