嵌入式系統—基于32位微處理器與實時操作系統4_第1頁
嵌入式系統—基于32位微處理器與實時操作系統4_第2頁
嵌入式系統—基于32位微處理器與實時操作系統4_第3頁
嵌入式系統—基于32位微處理器與實時操作系統4_第4頁
嵌入式系統—基于32位微處理器與實時操作系統4_第5頁
已閱讀5頁,還剩153頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、4C H A P T E RARM7指令集指令集目錄q1.ARM處理器尋址方式q2.指令集介紹 ARM指令集 Thumb指令集指令集ARM指令長度概述nARM指令長度n指令集可以是以下任一種n32 bits 長 (ARM狀態)n16 bits 長 (Thumb 狀態)nARM7TDMI 支持3種數據類型n字節 (8-bit)n半字 (16-bit)n字 (32-bit)n字必須被排成4個字節邊界對齊,半字必須被排列成2個字節邊界對齊n向后兼容:新版本增加指令,并保持指令向后兼容;nLoad-store 結構*uload/store 從存儲器中讀某個值,操作完后再將其放回存儲器中u只對存放在寄存

2、器的數據進行處理u對于存儲器中的數據,只能使用load/store指令進行存取ARM指令長度概述第4章 目錄q1.ARM處理器尋址方式q2. ARM指令集第4章 ARM7TDMI(-S)指令系統n簡介 ARM處理器是基于精簡指令集計算機(RISC)原理設計的,指令集和相關譯碼機制較為簡單。ARM7TDMI(-S)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數性能上的優勢,它是ARM指令集的子集。所有的ARM指令都是可以有條件執行的,而Thumb指令僅有一條指令具備條件執行功能。ARM程序和Thu

3、mb程序可相互調用,相互之間的狀態切換開銷幾乎為零。 第4章 ARM7TDMI(-S)指令系統nARM指令集與Thumb指令集的關系Thumb指令集具有靈活、小巧的特點ARM指令集支持ARM核所有的特性,具有高效、快速的特點4.1 ARM處理器尋址方式n尋址方式分類 尋址方式是根據指令中給出的地址碼字段來實現尋找真實操作數地址的方式。ARM處理器具有9種基本尋址方式。1.寄存器尋址;2.立即尋址;3.寄存器移位尋址;4.寄存器間接尋址;5.基址尋址;6.多寄存器尋址;7.堆棧尋址;8.塊拷貝尋址;9.相對尋址。 操作數的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執行時直接取出寄存

4、器值來操作。寄存器尋址指令舉例如下: MOV R1,R2 ;將R2的值存入R1 SUB R0,R1,R2 ;將R1的值減去R2的值,結果保存到R0 0 xAA0 x55R2R14.1 ARM處理器尋址方式n尋址方式分類寄存器尋址MOV R1,R20 xAA 立即尋址指令中的操作碼字段后面的地址碼部分即是操作數本身,也就是說,數據就包含在指令當中,取出指令也就取出了可以立即使用的操作數(這樣的數稱為立即數)。立即尋址指令舉例如下: SUBSR0,R0,#1 ;R0減1,結果放入R0,并且影響標志位MOVR0,#0 xFF000 ;將立即數0 xFF000裝入R0寄存器 0 x55R0MOV R0

5、,#0 xFF00程序存儲4.1 ARM處理器尋址方式n尋址方式分類立即尋址MOV R0,#0 xFF000 xFF00從代碼中獲得數據 寄存器移位尋址是ARM指令集特有的尋址方式。當第2個操作數是寄存器移位方式時,第2個寄存器操作數在與第1個操作數結合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOVR0,R2,LSL #3 ;R2的值左移3位,結果放入R0, ;即是R0=R28 ANDSR1,R1,R2,LSL R3 ;R2的值左移R3位,然后和R1相 ;“與”操作,結果放入R10 x55R0R20 x014.1 ARM處理器尋址方式n尋址方式分類寄存器移位尋址MOV R0,R2,

6、LSL #30 x080 x08邏輯左移3位 寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數保存在寄存器指定地址的存儲單元中,即寄存器為操作數的地址指針。寄存器間接尋址指令舉例如下: LDRR1,R2;將R2指向的存儲單元的數據讀出;保存在R1中 SWPR1,R1,R2;將寄存器R1的值和R2指定的存儲;單元的內容交換 0 x55R0R2 0 x400000000 xAA0 x400000004.1 ARM處理器尋址方式n尋址方式分類寄存器間接尋址LDR R0,R20 xAA 基址尋址就是將基址寄存器的內容與指令中給出的偏移量(4K)相加/減,形成操作數的有效地址。基址

7、尋址用于訪問基址附近的存儲單元,常用于查表、數組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址。基址尋址指令舉例如下(前索引尋址): LDRR2,R3,#0 x0C ;讀取R3+0 x0C地址上的存儲單元 ;的內容,放入R2 STRR1,R0,#-4! ;先R0=R0-4,然后把R0的值寄存 ;到保存到R1指定的存儲單元 4.1 ARM處理器尋址方式n尋址方式分類基址尋址0 x55R2R3 0 x400000000 xAA0 x4000000CLDR R2,R3,#0 x0C0 xAA將R3+0 x0C作為地址裝載數據 基址尋址指令舉例如下: LDRR0,R1 ,#4

8、;R0=R1,R1R14 ;后索引基址尋址 ;ARM這種自動索引機制不消耗額外的時間LDR R0,R1,R2 ;R0=R1+R24.1 ARM處理器尋址方式n尋址方式分類基址尋址 多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下: LDMIAR1!,R2-R7,R12 ;將R1指向的單元中的數據讀出到 ;R2R7、R12中(R1自動加4) STMIAR0!,R2-R7,R12 ;將寄存器R2R7、R12的值保 ;存到R0指向的存儲; 單元中 ;(R0自動加4)0 x40000000R1R20 x?0 x010 x400000000

9、 x?R3R40 x?R60 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲器4.1 ARM處理器尋址方式n尋址方式分類多寄存器尋址LDR R1!,R2-R4,R6 0 x010 x020 x030 x040 x40000010 堆棧是一個按特定順序進行存取的存儲區,操作順序為“后進先出” 。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區域(堆棧),指針所指向的存儲單元即是堆棧的棧頂。存儲器堆棧可分為兩種: 向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧4.1 ARM處理器尋址方式n

10、尋址方式分類堆棧尋址4.1 ARM處理器尋址方式n尋址方式分類堆棧尋址棧底棧頂棧區SP堆棧存儲區棧頂棧底棧區SP向下增長向上增長0 x123456780 x12345678堆棧壓棧堆棧壓棧棧頂SP棧頂SP棧底空堆棧棧底滿堆棧 堆棧指針指向最后壓入的堆棧的有效數據項,稱為滿堆棧;堆棧指針指向下一個待壓入數據的空位置,稱為空堆棧。 4.1 ARM處理器尋址方式n尋址方式分類堆棧尋址0 x123456780 x12345678棧頂SP0 x12345678棧頂SP壓棧壓棧所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內含有效數據項的最高地址。指令如LDMFA、STMFA等; 空

11、遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等; 滿遞減:堆棧向下增長,堆棧指針指向內含有效數據項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。 4.1 ARM處理器尋址方式n尋址方式分類堆棧尋址 多寄存器傳送指令用于將一塊數據從存儲器的某一位置拷貝到另一位置。 如:STMIAR0!,R1-R7;將R1R7的數據保存到存儲器中。;存儲指針R0在保存第一個值之后增加,;增長方向為向上增長。STMIBR0!,R1-R7;將R1R7的數據保存到存儲器中。;存儲指針R0在保存第一個

12、值之前增加,;增長方向為向上增長。 4.1 ARM處理器尋址方式n尋址方式分類塊拷貝尋址 相對尋址是基址尋址的一種變通。由程序計數器PC提供基準地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數的有效地址。相對尋址指令舉例如下:BLSUBR1;調用到SUBR1子程序BEQLOOP;條件跳轉到LOOP標號處.LOOPMOVR6,#1.SUBR1. 4.1 ARM處理器尋址方式n尋址方式分類相對尋址第4章 目錄q1.ARM處理器尋址方式q2. ARM指令集n簡單的ARM程序;文件名:TEST1.S ;功能:實現兩個寄存器相加 ;說明:使用ARMulate軟件仿真調試 AREAExa

13、mple1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START MOVR0,#0 ;設置參數 MOVR1,#10LOOPBLADD_SUB ;調用子程序ADD_SUB BLOOP ;跳轉到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結束 使用“;”進行注釋標號頂格寫實際代碼段聲明文件結束n簡單的ARM程序;文件名:TEST1.S ;功能:實現兩個寄存器相加 ;說明:使用ARMulate軟件仿真調試 AREAExample1,CODE,

14、READONLY ;聲明代碼段Example1 ENTRY ;標識程序入口 CODE32 ;聲明32位ARM指令START MOVR0,#0 ;設置參數 MOVR1,#10LOOPBLADD_SUB ;調用子程序ADD_SUB BLOOP ;跳轉到LOOPADD_SUB ADDSR0,R0,R1 ;R0 = R0 + R1 MOVPC,LR ;子程序返回 END ;文件結束 ARM指令小節目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令ARM指令小節目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM

15、分支指令7.雜項指令8.偽指令4.2 指令集介紹n ARM指令集指令格式 ARM是三地址指令格式,指令的基本格式如下:4.2 指令集介紹nARM指令集基本指令格式 S , 其中號內的項是必須的,號內的項是可選的。各項的說明如下:opcode:指令助記符;cond:執行條件;S:是否影響CPSR寄存器的值;Rd:目標寄存器; Rn:第1個操作數的寄存器;operand2:第2個操作數;指令語法目標寄存器(Rd) 源寄存器1(Rn)源寄存器2(Rm)ADD r3,r1,r2r3r1r2例: ARM指令的基本格式如下:4.2 指令集介紹nARM指令集第2個操作數 S , 靈活的使用第2個操作數“op

16、erand2”能夠提高代碼效率。它有如下的形式:#immed_8r常數表達式;Rm寄存器方式;Rm,shift寄存器移位方式;4.2 指令集介紹nARM指令集第2個操作數#immed_8r常數表達式 該常數必須對應8位位圖,即一個8位的常數通過循環右移偶數位得到。循環右移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 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 08

17、位常數4.2 指令集介紹nARM指令集第2個操作數#immed_8r常數表達式 該常數必須對應8位位圖,即一個8位的常數通過循環右移偶數位得到。例如:ANDR1,R2,#0 x0F4.2 指令集介紹nARM指令集第2個操作數Rm寄存器方式 在寄存器方式下,操作數即為寄存器的數值。例如:SUBR1,R1,R24.2 指令集介紹nARM指令集第2個操作數Rm,shift寄存器移位方式 將寄存器的移位結果作為操作數(移位操作不消耗額外的時間),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR #n算術右移n位ROR #n循環右移n位LSL #n邏輯左移n位RRX帶擴展的循環右移1位LSR

18、#n邏輯右移n位Type RsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。n 桶形移位器桶形移位器Rd結果N預處理未預處理RmRn4.2 指令集介紹n 桶形移位器操作助記符說明移位操作結果Y值LSL邏輯左移x LSL yxy#1-32 or RsASR算術右移x ASR y(signed)xY#1-32 or RsROR算術左移x ROR y(unsigned)xy|(x32-y)#1-32 or RsRRX擴展的循環右移x RRX y(c flag1)none4.2 指令集介紹4.2 指令集介紹nARM指令集第2個操作數LSL移位操作:0LSR移位操作:0ASR移位操作:ROR

19、移位操作:RRX移位操作:C4.2 指令集介紹nARM指令集第2個操作數Rm,shift寄存器移位方式例如:ADDR1,R1,R1,LSL #3;R1=R1+R1R3ARM指令目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令 ARM指令的基本格式如下:4.2 指令集介紹nARM指令集條件碼 S , 使用條件碼“cond”可以實現高效的邏輯操作(節省跳轉和條件語句),提高代碼效率。 所有的ARM指令都可以條件執行,而Thumb指令只有B(跳轉)指令具有條件執行 功能。如果指令不標明條件代碼,將默認為無條件(AL)執行。操作碼條件助記

20、符標志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數大于或等于0011CC/LOC=0無符號數小于0100MIN=1負數0101PLN=0正數或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數大于1001LSC=0,Z=1無符號數小于或等于1010GEN=V有符號數大于或等于 1011LTN!=V有符號數小于 1100GTZ=0,N=V有符號數大于 1101LEZ=1,N!=V有符號數小于或等于 1110AL任何無條件執行 (指令默認條件) 1111NV任何從不執行(不要使用) 指令條件碼表4.2 指令集介紹nARM指令集

21、條件碼C代碼:If(a b)a+;Elseb+;對應的匯編代碼:CMPR0,R1 ;R0(a)與R1(b)比較ADDHI R0,R0,#1 ;若R0R1,則R0=R0+1ADDLS R1,R1,#1 ;若R01,則R1=R1+1示例:ARM指令目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令4.2 指令集介紹nARM指令集存儲器訪問指令 ARM處理器是典型的RISC處理器,對存儲器的訪問只能使用加載和存儲指令實現。ARM7處理器是馮諾依曼存儲結構,RAM存儲空間及I/O映射空間統一編址,除對RAM操作以外,對外圍IO、程序數據的訪

22、問均要通過加載/存儲指令進行。 存儲器訪問指令分為單寄存器操作指令和多寄存器操作指令。助記符說明操作條件碼位置LDR Rd,addressing 加載字數據Rdaddressing,addressing索引LDRcondLDRB Rd,addressing 加載無符號字節數據Rdaddressing,addressing索引LDRcondBLDRT Rd,addressing以用戶模式加載字數據Rdaddressing,addressing索引LDRcondTLDRBT Rd, addressing 以用戶模式加載無符號字節數據Rdaddressing,addressing索引LDRcondB

23、TLDRH Rd, addressing 加載無符號半字數據Rdaddressing,addressing索引LDRcondHLDRSB Rd, addressing 加載有符號字節數據Rdaddressing,addressing索引LDRcondSBLDRSH Rd, addressing加載有符號半字數據 Rdaddressing,addressing索引 LDRcondSH ARM存儲器訪問指令單寄存器加載助記符說明操作條件碼位置STR Rd, addressing 存儲字數據addressingRd,addressing索引STRcondSTRB Rd,addressing 存儲字節

24、數據addressingRd,addressing索引STRcondBSTRT Rd,addressing 以用戶模式存儲字數據addressingRd, addressing索引STRcondTSTRBT Rd,addressing 以用戶模式存儲字節數據addressingRd,addressing索引STRcondBTSTRH Rd,addressing 存儲半字數據addressing Rd,addressing索引STRcondHARM存儲器訪問指令單寄存器存儲 LDR/STR指令用于對內存變量的訪問、內存緩沖區數據的訪問、查表、外圍部件的控制操作等。若使用LDR指令加載數據到PC寄

25、存器,則實現程序跳轉功能,這樣也就實現了程序散轉。 所有單寄存器加載/存儲指令可分為“字和無符號字節加載存儲指令”和“半字和有符號字節加載存儲指令。LDR和STR字和無符號字節加載/存儲指令 LDR指令用于從內存中讀取單一字或字節數據存入寄存器中,STR指令用于將寄存器中的單一字或字節數據保存到內存。指令格式如下:ARM存儲器訪問指令單寄存器存儲 LDRcondTRd, ;將指定地址上的字數據讀入Rd STRcondTRd, ;將Rd中的字數據存入指定地址 LDRcondBTRd, ;將指定地址上的字節數據讀入Rd STRcondBTRd, ;將Rd中的字節數據存入指定地址 其中,T為可選后綴

26、。若指令有T,那么即使處理器是在特權模式下,存儲系統也將訪問看成是在用戶模式下進行的。T在用戶模式下無效,不能與前索引偏移一起使用T。 ARM存儲器訪問指令單寄存器存儲LDR和STR字和無符號字節加載/存儲指令編碼指令執行的條件碼I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節訪問,為0表示字訪問W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于區別加載(L為1)或存儲(L為0)ARM存儲器訪問指令單寄存器存儲LDR和STR字和無符號字節加載/存儲指令 LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個基址寄存

27、器,可以為任一個通用寄存器;另一部分為一個地址偏移量。地址偏移量有以下3種格式: 立即數。立即數可以是一個無符號的數值。這個數據可以加到基址寄存器,也可以從基址寄存器中減去這個數值。 如:LDR R1,R0,#0 x12 ;R1-R0+0 x12寄存器。寄存器中的數值可以加到基址寄存器,也可以從基址寄存器中減去這個數值。 如:LDR R1,R0,R2 ; R1-R0+R2 LDR R1,R0,-R2 ; R1-R0-R2寄存器及移位常數。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個數值。 如:LDR R1,R0,R2,LSL #2 ;R1-R0+R2*4 ARM存儲器訪問指

28、令單寄存器存儲 從尋址方式的地址計算方法分,加載/存儲指令有以下4種格式: 零偏移。如:LDR Rd,Rn 前索引偏移。如:LDR Rd,Rn,#0 x04!程序相對偏移。如:LDR Rd,labe1 后索引偏移。如:LDR Rd,Rn,#-0 x04注意:必須保證字數據操作的地址是32位對齊的。LDR和STR字和無符號字節加載/存儲指令LDR和STR半字和有符號字節加載/存儲指令 這類LDR/STR指令可加載有符號半字或字節,可加載/存儲無符號半字。偏移量格式、尋址方式與加載/存儲字和無符號字節指令相同。 ARM存儲器訪問指令單寄存器存儲 LDRcondSB Rd, ;將指定地址上的有符號字

29、節讀入Rd LDRcondSH Rd, ;將指定地址上的有符號半字讀入Rd LDRcondH Rd, ;將指定地址上的半字數據讀入Rd STRcondH Rd, ;將Rd中的半字數據存入指定地址注意:1.有符號位半字/字節加載是指用符號位加載擴展到32位,無符號半字加載是指用零擴展到32位;2.半字讀寫的指定地址必須為偶數,否則將產生不可靠的結果;ARM存儲器訪問指令單寄存器存儲LDR和STR半字和有符號字節加載/存儲指令編碼指令執行的條件碼I為0時,偏移量為12位立即數,為1時,偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫為指令的尋址方式Rd為源/目標寄存器Rn為基址寄存器L用于

30、區別加載(L為1)或存儲(L為0)S為1表示有符號訪問,為0表示無符號訪問H為1表示半字訪問,為0表示字節訪問LDR和STR指令應用示例:1.加載/存儲字和無符號字節指令LDRR2,R5;將R5指向地址的字數據存入R2STRR1,R0,#0 x04;將R1的數據存儲到R0+0 x04地址LDRBR3,R2,#-1 ;將R2指向地址的字節數據存入R3,R2R21STRBR0,R3,-R8 ASR 2 ;R0-R3-R8/4,存儲R0的最低有效字節2.加載/存儲半字和有符號字節指令LDRSB R1,R0,R3;將R0+R3地址上的字節數據存入R1,;高24位用符號擴展LDRH R6,R2,#2;將

31、R2指向地址的半字數據存入R6,高16位用0擴展;讀出后,R2=R2+2STRH R1,R0,#2!;將R1的半字數據保存到R0+2地址,;只修改低2字節數據,然后R0=R0+2ARM存儲器訪問指令單寄存器存儲n(3 3)LDRLDR和和STR -STR -雙字:雙字:加載/存儲兩個相鄰的寄存器,64位雙字。其句法有4種:nOp cond D Rd,Rn 零偏移nOp cond D Rd,Rn,offset ! 前索引偏移nOp cond D Rd,label 程序相對偏移nOp cond D T Rd,Rn,offset 后索引偏移 ARM存儲器訪問指令單寄存器存儲 其中:其中: Rd Rd

32、 加載加載/ /存儲寄存器中的一個,另一個是存儲寄存器中的一個,另一個是R R(d+1d+1)。)。RdRd必須是偶數寄存器,且不是必須是偶數寄存器,且不是R14R14。 Rn Rn 除非指令為零偏移,或不帶寫回的前索引,否則,除非指令為零偏移,或不帶寫回的前索引,否則,RnRn不允許與不允許與RdRd和和R R(d+1d+1)相同。)相同。label labellabel label必須是在當前指令的上下必須是在當前指令的上下252252字節范圍內。字節范圍內。例如:例如:LDRD R6,R11 ;R6R11,R7R11+4STRD R4,R9,#24 ;R4R9+24,R5R9+28ARM

33、存儲器訪問指令單寄存器存儲助記符說明操作條件碼位置LDMmode Rn!,reglist 多寄存器加載reglistRn.,Rn回寫等LDMcondmodeSTMmode Rn!,reglist 多寄存器存儲Rn.reglist,Rn回寫等STMcondmodeARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令可以實現在一組寄存器和一塊連續的內存單元之間傳輸數據。LDM為加載多個寄存器;STM為存儲多個寄存器。允許一條指令傳送16個寄存器的任何子集或所有寄存器。它們主要用于現場保護、數據復制、常數傳遞等。ARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令格式如下: LDMcond

34、Rn!,reglist STMcond Rn!,reglistcond:指令執行的條件;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結束后,將最后的地址寫回Rn中;reglist :表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如R1,R2,R6-R9,寄存器由小到大排列;:可選后綴。允許在用戶模式或系統模式下使用。它有以下兩個功能:1)若op是LDM且寄存器列表包含R15時,那么除了正常的多寄存器傳送外,還將SPSR也復制到CPSR中。這用于異常處理返回,僅在異常模式下使用。2)數據傳入或傳出的是用戶模式下的寄存器,而不是當前模式的寄存器。ARM存儲器訪問指令多寄存器存

35、取LDM和STM多寄存器加載/存儲指令編碼指令執行的條件碼S 對 應 于 指 令 中的”符號P表示前/后變址U表示加/減W表示回寫寄存器列表Rn為基址寄存器L用于區別加載(L為1)或存儲(L為0)ARM存儲器訪問指令多寄存器存取 多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數據傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數據塊傳送操作堆棧操作 進行數據復制時,先設置好源數據指針和目標指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDM

36、IB/STMIB、LDMDA/STMDA、LDMDB/STMDB進行讀取和存儲 。 進行堆棧操作操作時,要先設置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD 、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實現堆棧操作。ARM存儲器訪問指令多寄存器存取數據塊傳送指令操作過程如右圖所示,其中R1為指令執行前的基址寄存器,R1則為指令執行后的基址寄存器。R5R6R7R1 R1 指令STMIA R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDA R1!,R5-R74008H4004H4000H4

37、014H4010H400CHR5R6R7R1 R1 指令STMIB R1!,R5-R74008H4004H4000H4014H4010H400CHR5R6R7R1 R1 指令STMDB R1!,R5-R74008H4004H4000H4014H4010H400CHARM存儲器訪問指令多寄存器存取數據塊傳送存儲堆棧操作壓棧說明數據塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數據塊傳送指令進行堆棧操作ST

38、MDAR0!,R5-R6. . .LDMIBR0!,R5-R6;使用堆棧指令進行堆棧操作STMEDR13!,R5-R6. . .LDMEDR13!,R5-R6 兩段代碼的執行結果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡單(只要前后一致即可),而使用數據塊指令進行壓棧和出棧操作則需要考慮空與滿、加與減對應的問題。 堆棧操作(詳見“4.1 尋址方式堆棧尋址”)和數據塊傳送指令類似,也有4種模式,它們之間的關系如下表所示:助記符說明操作條件碼位置SWP Rd,Rm,Rn 寄存器和存儲器字數據交換RdRn,RnRm (RnRd或Rm)SWPcondSWPB Rd,Rm,Rn 寄存器和存儲器字

39、節數據交換RdRn,RnRm (RnRd或Rm)SWPcondBARM存儲器訪問指令寄存器和存儲器交換指令 SWP指令用于將一個內存單元(該單元地址放在寄存器Rn中)的內容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內容寫入到該內存單元中。使用SWP可實現信號量操作。 指令格式如下:SWPcondB Rd,Rm,Rn 其中,B為可選后綴,若有B,則交換字節,否則交換32位字;Rd用于保存從存儲器中讀入的數據;Rm的數據用于存儲到存儲器中,若Rm與Rd相同,則為寄存器與存儲器內容進行互換;Rn為要進行數據交換的存儲器地址,Rn不能與Rd和Rm相同。 ARM存儲器訪問指令寄存器和存儲器交換指令

40、SWP和SWPB寄存器和存儲器交換指令編碼指令執行的條件碼B用于區別無符號字節(B為1)或字(B為0)Rm源寄存器Rd目標寄存器Rn為基址寄存器SWP指令應用示例:SWPR1,R1,R0;將R1的內容與R0指向的存儲單元的內容進行互換 SWPBR1,R2,R0;將R0指向的存儲單元低字節數據讀取到R1中;(高24位清零),并將R2的內容寫入到該內存單元中;(最低字節有效) ARM指令目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM分支指令7.雜項指令8.偽指令4.2 指令集介紹nARM指令集ARM數據處理指令 數據處理指令大致可分為3類: 數據傳送指令;算術邏

41、輯運算指令;比較指令。 數據處理指令只能對寄存器的內容進行操作,而不能對內存中的數據進行操作。所有ARM數據處理指令均可選擇使用S后綴,以使指令影響狀態標志。 ARM數據處理指令指令編碼指令執行的條件碼I用于區別立即數(I為1)和寄存器移位(I為0)opcode數據處理指令操作碼第二操作數Rd目標寄存器Rn第一操作數寄存器S設置條件碼,與指令中的S位對應帶進位加法ADC0101帶進位減法指令SBC0110帶進位逆向減法指令RSC0111位測試指令TST1000相等測試指令TEQ1001比較指令CMP1010負數比較指令CMN1011邏輯或操作指令ORR1100數據傳送MOV1101位清除指令B

42、IC1110數據非傳送MVN1111加法運算指令ADD0100逆向減法指令RSB0011減法運算指令SUB0010邏輯異或操作指令EOR0001邏輯與操作指令AND0000說明指令助記符操作碼opcode操作碼功能表助記符說明操作條件碼位置MOV Rd,operand2數據傳送Rdoperand2 MOVcondSMVN Rd,operand2數據非傳送Rd(operand2)MVNcondSARM數據處理指令數據傳送注:當后綴S時,這些指令根據結果更新標志N和Z,在計算Operand2時更新標志C,不影響標志V。助記符說明操作條件碼位置MOV Rd,operand2MOV Rd,operan

43、d2數據傳送Rdoperand2 MOVcondSMVN Rd,operand2數據非傳送Rd(operand2)MVNcondSARM數據處理指令數據傳送 MOV指令將8位圖立即數(參看“第2操作數:#immed_8r常數表達式 ”)或寄存器傳送到目標寄存器(Rd),可用于移位運算等操作。指令格式如下: MOVcondS Rd,operand2 MOV指令舉例如下: MOVR11,#0 xF000000B;R1= 0 xF000000B MOVR0,R1;R0=R1 MOVSR3,R1,LSL #2;R3=R12,并影響標志位 MOVPC,LR;PC=LR,子程序返回 助記符說明操作條件碼位

44、置MOV Rd,operand2數據傳送Rdoperand2 MOVcondSMVN Rd,operand2MVN Rd,operand2數據非傳送Rd(operand2)MVNcondSARM數據處理指令數據傳送 MVN指令將8位圖立即數(參看“第2操作數:#immed_8r常數表達式 ”)或寄存器(operand2)按位取反后傳送到目標寄存器(Rd),因為其具有取反功能,所以可以裝載范圍更廣的立即數。指令格式如下: MVNcondS Rd,operand2 MVN指令舉例如下: MVNR1,#0 xFF;R1=0 xFFFFFF00 MVNR1,R2;將R2按位取反,結果存到R1助記符說明

45、操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-R

46、n-(NOT)CarryRSCcondSARM數據處理指令算術運算注:這些指令影響N,Z,C和V標志位。助記符說明操作條件碼位置ADD Rd, Rn, operand2ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位

47、減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM數據處理指令算術運算 加法運算指令ADD指令將operand2的值與Rn的值相加,結果保存到Rd寄存器。指令格式如下: ADDcondS Rd,Rn,operand2 應用示例: ADDS R1,R1,#1020;R1=R1+1020,并影響標志位 ADD R1,R1,R2,LSL #2;R1=R1+R22 助記符說明操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+op

48、erand2ADDcondSSUB Rd, Rn, operand2SUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2逆向減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondS

49、ARM數據處理指令算術運算 減法運算指令SUB指令用寄存器Rn減去operand2,結果保存到Rd中。指令格式如下: SUBcondS Rd,Rn,operand2 應用示例: SUBSR0,R0,#240;R0=R0-240 ,并影響標志位 SUBSR2,R1,R2;R2=R1-R2 ,并影響標志位 助記符說明操作條件碼位置ADD Rd, Rn, operand2加法運算指令RdRn+operand2ADDcondSSUB Rd, Rn, operand2減法運算指令RdRn-operand2SUBcondSRSB Rd, Rn, operand2RSB Rd, Rn, operand2逆向

50、減法指令Rdoperand2-RnRSBcondSADC Rd, Rn, operand2帶進位加法RdRn+operand2+CarryADCcondSSBC Rd, Rn, operand2帶進位減法指令RdRn-operand2-(NOT)CarrySBCcondSRSC Rd, Rn, operand2帶進位逆向減法指令Rdoperand2-Rn-(NOT)CarryRSCcondSARM數據處理指令算術運算 逆向減法運算指令RSB指令將operand2的值減去Rn,結果保存到Rd中。指令格式如下: RSBcondS Rd,Rn,operand2 應用示例: RSB R3,R1,#0

51、xFF00 ;R3=0 xFF00-R1 RSBS R1,R2,R2,LSL #2 ;R1=(R210, 則執行本指令 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2CMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處

52、理指令比較指令 負數比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: CMNcondRn, operand2 應用示例: CMNR0,#1 ; R0+1,判斷R0是否為1的補碼;如果是,則設置Z標志位助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2CMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn,

53、operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處理指令比較指令 負數比較指令CMN指令使用寄存器Rn的值加上operand2的值,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: CMNcondRn, operand2注意:CMN指令與ADDS指令的區別在于CMN指令不保存運算結果。CMN指令可用于負數比較,比如CMN R0,#1指令則表示R0與-1比較,若R0為-1(即1的補碼),

54、則Z置位;否則Z復位。 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2TST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處理指令比較指令 位測試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,

55、根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: TSTcond Rn, operand2 應用示例: TSTR0,#0 x01; 判斷R0的最低位是否為0 TSTR1,#0 x0F; 判斷R1的低4位是否為0 助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2TST Rn, operand2位測試指令標志N、Z、C、VRn

56、& operand2TSTcondTEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處理指令比較指令 位測試指令TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: TSTcond Rn, operand2注意:TST指令與ANDS指令的區別在于TST指令不保存運算結果。TST指令通常與EQ、NE條件碼配合使用,當所有測試位均為0時,EQ有效(Z=1),而只要有一個測試位不為0,則NE有效(Z=0) 。

57、助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2TEQ Rn, operand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處理指令比較指令 相等測試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據操作的結果更新C

58、PSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: TEQcond Rn, operand2 應用示例: TEQR0,R1; 比較R0與R1是否相等 (不影響V位和C位)助記符說明操作條件碼位置CMP Rn, operand2比較指令標志N、Z、C、VRn-operand2CMPcondCMN Rn, operand2負數比較指令標 志 N 、 Z 、 C 、VRn+operand2CMNcondTST Rn, operand2位測試指令標志N、Z、C、VRn & operand2TSTcondTEQ Rn, operand2TEQ Rn, ope

59、rand2相等測試指令標志N、Z、C、VRn operand2TEQcondARM數據處理指令比較指令 相等測試指令TEQ指令將寄存器Rn的值與operand2的值按位作邏輯“異或”操作,根據操作的結果更新CPSR中的相應條件標志位,以便后面的指令根據相應的條件標志來判斷是否執行。指令格式如下: TEQcond Rn, operand2注意:TEQ指令與EORS指令的區別在于TEQ指令不保存運算結果。使用TEQ進行相等測試時,常與EQ、NE條件碼配合使用。當兩個數據相等時,EQ有效;否則NE有效。 ARM指令目錄1.指令格式2.條件碼3.存儲器訪問指令4.數據處理指令5.乘法指令6.ARM分支

60、指令7.雜項指令8.偽指令4.2 指令集介紹nARM指令集乘法指令 ARM7TDMI具有三種乘法指令,分別為:3232位乘法指令;32 32位乘加指令;32 32位結果為64位的乘/乘加指令。ARM指令乘法指令乘法指令編碼指令執行的條件碼Opcode乘法指令操作碼S設置條件碼,與指令中的S位對應Rm為被乘數寄存器Rn/RdLo為MLA指令相加的寄存器或64位乘法指令的目標寄存器(低32位)Rd/RdHi為目標寄存器或64位乘法指令的目標寄存器(高32位)Rs為乘數寄存器64位有符號乘加指令SMLAL11164位有符號乘法指令SMULL11064位無符號乘加指令UMLAL10164位無符號乘法指令UMULL10032位乘加指令MLA001

溫馨提示

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

評論

0/150

提交評論