嵌入式系統第3章_第1頁
嵌入式系統第3章_第2頁
嵌入式系統第3章_第3頁
嵌入式系統第3章_第4頁
嵌入式系統第3章_第5頁
已閱讀5頁,還剩133頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、嵌入式系統原理及應用教程嵌入式系統原理及應用教程主講人:主講人: 孟祥蓮孟祥蓮主講內容主講內容第第1章章 嵌入式系統概述嵌入式系統概述第第2章章 ARM微處理器概述與編程模型微處理器概述與編程模型第第3章章 ARM9指令系統指令系統第第4章章 嵌入式程序設計基礎嵌入式程序設計基礎第第5章章 嵌入式內部可編程模塊嵌入式內部可編程模塊第第6章章 嵌入式接口技術應用嵌入式接口技術應用第第7章章 軟件開發(fā)環(huán)境軟件開發(fā)環(huán)境第第3章章 ARM9指令系統指令系統uARM處理器的尋址方式處理器的尋址方式uARM指令集指令集 uThumb指令集指令集 3.1 ARM處理器的尋址方式處理器的尋址方式u尋址方式尋址

2、方式是處理器根據指令中給出的地址信息來尋是處理器根據指令中給出的地址信息來尋找物理地址的方式。找物理地址的方式。u目前目前ARM指令系統支持指令系統支持8種種尋址方式。尋址方式。l寄存器尋址寄存器尋址l立即尋址立即尋址l寄存器間接尋址寄存器間接尋址l變址尋址變址尋址l寄存器移位尋址寄存器移位尋址 l多寄存器尋址多寄存器尋址l堆棧尋址堆棧尋址l相對尋址相對尋址3.1.1 寄存器尋址寄存器尋址 寄存器尋址寄存器尋址就是利用寄存器中的內容作為操作數,就是利用寄存器中的內容作為操作數,寄存器本身就是操作數地址。這種尋址方式是各類微寄存器本身就是操作數地址。這種尋址方式是各類微處理器經常采用的一種方式,

3、也是一種執(zhí)行效率較高處理器經常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。的尋址方式。 例如指令:例如指令: MOV R2, R3 ;R2R3 R3中的內容賦給中的內容賦給R2ADD R2,R3,R4 ;R2R3R4 R3和和R4中的內容相加,結果賦給中的內容相加,結果賦給R20 xAA0 x55R3R2MOV R2,R30 xAA3.1.2 立即尋址立即尋址u立即尋址立即尋址也叫立即數尋址,這是一種特殊的尋址方式,也叫立即數尋址,這是一種特殊的尋址方式,操作數沒有存儲在寄存器或存儲器中,而是包含在指操作數沒有存儲在寄存器或存儲器中,而是包含在指令的操作碼中,只要取出指令也就取到了操作數。

4、這令的操作碼中,只要取出指令也就取到了操作數。這個操作數被稱為立即數,對應的尋址方式也就叫做立個操作數被稱為立即數,對應的尋址方式也就叫做立即尋址。即尋址。例如指令:例如指令: MOV R0,#0 xFF000 ;將立即數將立即數0 xFF000裝入裝入R0寄存器寄存器 ADD R1,R1,0 x7f ; R1R10 x7f 在以上兩條指令中,第二個源操作數即為立即數,要在以上兩條指令中,第二個源操作數即為立即數,要求以求以“”為前綴,對于以十六進制表示的立即數,還要為前綴,對于以十六進制表示的立即數,還要求在求在“”后加上后加上“0 x”。 0 x55R0MOV R0,#0 xFF00程序存

5、儲程序存儲MOV R0,#0 xFF000 xFF00從代碼中獲得數據從代碼中獲得數據3.1.3 寄存器間接尋址寄存器間接尋址u寄存器間接尋址寄存器間接尋址就是以寄存器中的內容作為操作數的就是以寄存器中的內容作為操作數的地址,而操作數本身存放在存儲器中。例如指令地址,而操作數本身存放在存儲器中。例如指令 : LDRR1,R2;R1R2 STRR1,R2;R2R1 第一條指令將以第一條指令將以R2中的內容為地址,將該地址中中的內容為地址,將該地址中的數據傳送到的數據傳送到R1中。中。 第二條指令將第二條指令將R1中的內容傳送到以中的內容傳送到以R2中的內容為中的內容為地址的存儲器中。地址的存儲器

6、中。0 x55R1R2 0 x400000000 xAA0 x40000000LDR R1,R20 xAA3.1.4 變址尋址變址尋址u變址尋址變址尋址就是將寄存器(該寄存器一般稱作基址寄存就是將寄存器(該寄存器一般稱作基址寄存器)的內容與指令中給出的地址偏移量相加,從而得器)的內容與指令中給出的地址偏移量相加,從而得到一個操作數的有效地址。變址尋址方式常用于訪問到一個操作數的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。某基地址附近的地址單元。例如指令:例如指令: LDR R0,R1,8 ;R0R18LDR R0,R1,8! ;R0R18,R1R18LDR R0,R1,2 ;R0R

7、1,R1R12LDR R0,R1,R2 ;R0R1R20 x55R0R1 0 x600000000 xAA0 x60000008LDR R0,R1,#0 x080 xAA將將R1+0 x08作作為地址裝載數為地址裝載數據據3.1.5 寄存器移位尋址寄存器移位尋址u寄存器移位尋址寄存器移位尋址是是ARM指令集指令集獨有獨有的尋址方式,操作的尋址方式,操作數由寄存器的數值進行相應移位而得到;移位的方式在數由寄存器的數值進行相應移位而得到;移位的方式在指令中以助記符的形式給出,而移位的位數可用立即數指令中以助記符的形式給出,而移位的位數可用立即數或寄存器尋址方式表示。或寄存器尋址方式表示。uARM微

8、處理器內嵌的微處理器內嵌的桶型移位器桶型移位器(Barrel Shifter),),移位操作在移位操作在ARM指令集中不作為單獨的指令使用,它指令集中不作為單獨的指令使用,它只能作為指令格式中的只能作為指令格式中的一個字段一個字段,在匯編語言中表示為,在匯編語言中表示為指令中的選項。指令中的選項。例如,數據處理指令的第例如,數據處理指令的第2個操作數為寄存器時,個操作數為寄存器時,就可以加入移位操作選項對它進行各種移位操作。移位就可以加入移位操作選項對它進行各種移位操作。移位操作包括如下操作包括如下6種類型種類型.3.1.5 寄存器移位尋址寄存器移位尋址uLSL(或(或ASL)操作操作 格式為

9、:格式為: 通用寄存器,通用寄存器,LSL(或(或ASL) 操作數操作數 LSL(或(或ASL)可完成對通用寄存器中的內容進)可完成對通用寄存器中的內容進行行邏輯(或算術)的左移邏輯(或算術)的左移操作,按操作數所指定的數操作,按操作數所指定的數量向左移位,低位用零來填充,最后一個左移出的位量向左移位,低位用零來填充,最后一個左移出的位放在狀態(tài)寄存器的放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-1所示。所示。其中,操作數可以是通用寄存器,也可以是立即其中,操作數可以是通用寄存器,也可以是立即數(數(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R

10、0, R1, LSL#2;將;將R1中的內容左移中的內容左移4位后傳送到位后傳送到R0中,中,;其中把最后移出的位賦給程序狀態(tài)寄存器的;其中把最后移出的位賦給程序狀態(tài)寄存器的C位位CPSR29。31C30291000看到要知道是看到要知道是 嵌入式!而不是單片機嵌入式!而不是單片機的匯編語句的匯編語句uLSR操作操作格式為:格式為: 通用寄存器,通用寄存器,LSR 操作數操作數 LSR可完成對通用寄存器中的內容進行可完成對通用寄存器中的內容進行右移右移的操作,的操作,按操作數所指定的數量向右移位,左端用零來填充,按操作數所指定的數量向右移位,左端用零來填充,最后一個右移出的位放在狀態(tài)寄存器的最

11、后一個右移出的位放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-2所示。其中,操作數可以是通用寄存器,所示。其中,操作數可以是通用寄存器,也可以是立即數(也可以是立即數(031)。)。 3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, LSR#4;將;將R1中的內容右移中的內容右移4位后傳送到位后傳送到R0中。中。;其中把最后移出的位賦給程序狀態(tài)寄存器的;其中把最后移出的位賦給程序狀態(tài)寄存器的C位位CPSR29。 3.1.5 寄存器移位尋址寄存器移位尋址31C302910003.1.5 寄存器移位尋址寄存器移位尋址uROR操作操作格式為:格式為: 通用

12、寄存器,通用寄存器,ROR 操作數操作數 ROR可完成對通用寄存器中的內容進行可完成對通用寄存器中的內容進行循環(huán)右移循環(huán)右移的操作,按操作數所指定的數量向右循環(huán)移位,右端的操作,按操作數所指定的數量向右循環(huán)移位,右端移出的位填充在左側的空位處,最后一個右移出的位移出的位填充在左側的空位處,最后一個右移出的位同時也放在狀態(tài)寄存器的同時也放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-3所示。其中,操作數可以是通用寄存器,也可以是立所示。其中,操作數可以是通用寄存器,也可以是立即數(即數(031)。)。u操作示例:操作示例:MOV R0, R1, ROR#4;將;將R1中的內容循環(huán)右移中的內

13、容循環(huán)右移4位后傳送到位后傳送到R0中,中,;其中把最后移出的位賦給程序狀態(tài)寄存器的;其中把最后移出的位賦給程序狀態(tài)寄存器的C位位CPSR29。 3131C C303029291 10 03.1.5 寄存器移位尋址寄存器移位尋址uASRASR操作操作格式為:格式為: 通用寄存器,通用寄存器,ASR 操作數操作數 ASR可完成對通用寄存器中的內容進行可完成對通用寄存器中的內容進行右移右移的操作,的操作,按操作數所指定的數量向右移位,最左端的位保持不按操作數所指定的數量向右移位,最左端的位保持不變,最后一個右移出的位放在狀態(tài)寄存器的變,最后一個右移出的位放在狀態(tài)寄存器的C位位CPSR29 ,如圖,

14、如圖3-4所示。其中,操作數可以是通用所示。其中,操作數可以是通用寄存器,也可以是立即數(寄存器,也可以是立即數(031)。)。 這種移位對有符號數據使用時可以保持符號位不變。這種移位對有符號數據使用時可以保持符號位不變。3.1.5 寄存器移位尋址寄存器移位尋址3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, ASR#4;將;將R1中的內容右移中的內容右移4位后傳送到位后傳送到R0中,符號位保持不中,符號位保持不變。變。;最后移出的位同時也送入狀態(tài)位;最后移出的位同時也送入狀態(tài)位C中。中。3131C C303029291 10 0uRRX操作操作RRX操作的

15、格式為:操作的格式為: 通用寄存器,通用寄存器,RRX 操作數操作數 RRX可完成對通用寄存器中的內容進行可完成對通用寄存器中的內容進行帶擴展的帶擴展的循環(huán)右移循環(huán)右移的操作,按操作數所指定的數量向右循環(huán)移的操作,按操作數所指定的數量向右循環(huán)移位,左側空位由狀態(tài)寄存器位,左側空位由狀態(tài)寄存器C位來填充,右側移出的位來填充,右側移出的位移進狀態(tài)位位移進狀態(tài)位C中,如圖中,如圖3-5所示。其中,操作數可以所示。其中,操作數可以是通用寄存器,也可以是立即數(是通用寄存器,也可以是立即數(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, RRX#2;將

16、;將R1中的內容進行帶擴展的循環(huán)右移兩位后傳送中的內容進行帶擴展的循環(huán)右移兩位后傳送到到R0中。中。3131C C303029291 10 03.1.5 寄存器移位尋址寄存器移位尋址u采用采用多寄存器尋址方式多寄存器尋址方式,一條指令可以完成多個寄存,一條指令可以完成多個寄存器值的傳送。這種尋址方式可以一次對多個寄存器尋器值的傳送。這種尋址方式可以一次對多個寄存器尋址,多個寄存器由小到大排列,最多可傳送址,多個寄存器由小到大排列,最多可傳送16個寄存?zhèn)€寄存器。器。 例如例如: LDMIA R1!,R2-R4,R5 ;R2R1 ;R3R14 ;R4R18 ;R5R112 該指令的后綴該指令的后綴

17、IA表示在每次執(zhí)行完加載表示在每次執(zhí)行完加載/存儲操作存儲操作后,后,R1按字長度增加,因此,指令可將連續(xù)存儲單按字長度增加,因此,指令可將連續(xù)存儲單元的值傳送到元的值傳送到R2R5。3.1.6 多寄存器尋址多寄存器尋址 使用多寄存器尋址指令時,使用多寄存器尋址指令時,寄存器子集的順序是按由小到寄存器子集的順序是按由小到大的順序排列,連續(xù)的寄存器大的順序排列,連續(xù)的寄存器可用可用“”連接;否則用連接;否則用“,”分隔書寫。分隔書寫。0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R50 x?0 x020 x030 x040 x400000040 x

18、400000080 x4000000C存儲器存儲器LDMIA R1!,R2-R4,R5 0 x400000100 x010 x020 x030 x043.1.7 堆棧尋址堆棧尋址u堆棧堆棧是一種數據結構,按先進后出(是一種數據結構,按先進后出(First In Last Out,FILO)的方式工作,使用一個稱作堆棧指針的)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當前的操作位置,堆棧指針總是指向專用寄存器指示當前的操作位置,堆棧指針總是指向棧頂。棧頂。u當堆棧指針指向最后壓入堆棧的數據時,稱為當堆棧指針指向最后壓入堆棧的數據時,稱為滿堆棧滿堆棧(Full Stack);而當堆棧指針指向

19、下一個將要放入數而當堆棧指針指向下一個將要放入數據的空位置時,稱為據的空位置時,稱為空堆??斩褩#‥mpty Stack)。)。u同時,根據堆棧的生成方式,又可以分為遞增堆棧同時,根據堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧()和遞減堆棧(Decending Stack),當堆棧由低地址向高地址生成時,稱為),當堆棧由低地址向高地址生成時,稱為遞遞增堆棧增堆棧,當堆棧由高地址向低地址生成時,稱為,當堆棧由高地址向低地址生成時,稱為遞減遞減堆棧堆棧。棧頂棧頂SP棧頂棧頂SP棧底棧底空堆棧空堆棧棧底棧底滿堆棧滿堆棧0 x123456780 x12345678棧

20、頂棧頂SP0 x12345678棧頂棧頂SP壓棧壓棧壓棧壓棧3.1.7 堆棧尋址堆棧尋址uARM微處理器支持這微處理器支持這四種類型的堆棧工作方式四種類型的堆棧工作方式,即:,即:u滿遞增方式滿遞增方式FA(Full Ascending):堆棧指針指向最):堆棧指針指向最后入棧的數據位置,且由低地址向高地址生成。后入棧的數據位置,且由低地址向高地址生成。u滿遞減方式滿遞減方式FD(Full Decending):堆棧指針指向最):堆棧指針指向最后入棧的數據位置,且由高地址向低地址生成。后入棧的數據位置,且由高地址向低地址生成。u空遞增方式空遞增方式EA(Empty Ascending):堆棧指

21、針指向):堆棧指針指向下一個入棧數據的空位置,且由低地址向高地址生成。下一個入棧數據的空位置,且由低地址向高地址生成。u空遞減方式空遞減方式ED(Empty Decending):堆棧指針指向):堆棧指針指向下一個入棧數據的空位置,且由高地址向低地址生成。下一個入棧數據的空位置,且由高地址向低地址生成。3.1.8 相對尋址相對尋址 u與基址變址尋址方式相類似,與基址變址尋址方式相類似,相對尋址相對尋址以程序計數器以程序計數器PC的當前值為基地址,指令中的地址標號作為偏移的當前值為基地址,指令中的地址標號作為偏移量,將兩者相加之后得到操作數的有效地址。以下程量,將兩者相加之后得到操作數的有效地址

22、。以下程序段完成子程序的調用和返回,跳轉指令序段完成子程序的調用和返回,跳轉指令BL采用了采用了相對尋址方式:相對尋址方式: BL NEXT;跳轉到子程序;跳轉到子程序NEXT處執(zhí)行處執(zhí)行 NEXT MOVPC,LR;從子程序返回;從子程序返回3.2 ARM指令集指令集uARM微處理器的指令集是加載微處理器的指令集是加載/存儲型的存儲型的.u即指令集僅能處理寄存器中的數據,處理結果仍要放即指令集僅能處理寄存器中的數據,處理結果仍要放回寄存器中,而對回寄存器中,而對系統存儲器的訪問則需要通過專門系統存儲器的訪問則需要通過專門的加載的加載/存儲指令來完成存儲指令來完成。uARM9指令集,包括指令集

23、,包括ARM指令集指令集Thumb指令集。指令集。u首先介紹首先介紹ARM指令的基本格式及靈活的操作數,然指令的基本格式及靈活的操作數,然后介紹條件碼,再把后介紹條件碼,再把ARM指令集、指令集、Thumb指令集按類指令集按類分別說明。分別說明。ARM指令的基本格式如下: S , 其中其中號內的項是必須的,號內的項是必須的,號內的項是可選的。號內的項是可選的。各項的說明如下:各項的說明如下:opcode:指令助記符;:指令助記符;cond:執(zhí)行條件;:執(zhí)行條件;S:是否影響:是否影響CPSR寄存器的值;寄存器的值;Rd:目標寄存器;:目標寄存器;Rn:第:第1個操作數的寄存器;個操作數的寄存器

24、;op2:第:第2個操作數;個操作數;3.2.1 指令格式指令格式 ARM指令的基本格式如下:指令的基本格式如下:3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數個操作數 靈活的使用第靈活的使用第2個操作數個操作數“op2”能夠提高能夠提高代碼效率。它有如下的形式:代碼效率。它有如下的形式:#immed_8r常數表達式;常數表達式;Rm寄存器方式;寄存器方式;Rm,shift寄存器移位方式;寄存器移位方式; S , 3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數個操作數#immed_8r#immed_8r常數表達式常數表達式 該常數必須對應該常數必須對應8 8位位

25、圖,即必須是一位位圖,即必須是一個個8 8位的常位的常數通過循環(huán)右移偶數位可以得到的數數通過循環(huán)右移偶數位可以得到的數。循環(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 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常數0 x12移位后得到的常數0 x048000003.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數個操作數#immed

26、_8r常數表達式 該常數必須對應8位位圖,即必須是一個8位的常數通過循環(huán)右移偶數位可以得到的數。例如:例如:MOV R0,#1AND R1,R2,#0 x0FMOV R1,#0 xC000 ;0 xC000可由可由0 x03循環(huán)右移循環(huán)右移16位得到位得到3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數個操作數RmRm寄存器方式寄存器方式 在寄存器方式下,操作數即為寄存器的數值。在寄存器方式下,操作數即為寄存器的數值。例如:例如:SUBR1,R1,R2MOVPC,R03.2.2 條件碼條件碼條件碼條件碼助記符后綴助記符后綴標標 志志含含 義義0000EQZ置位置位相等相等0001

27、NEZ清零清零不相等不相等0010CSC置位置位無符號數大于或等于無符號數大于或等于0011CCC清零清零無符號數小于無符號數小于0100MIN置位置位負數負數0101PLN清零清零正數或零正數或零0110VSV置位置位溢出溢出0111VCV清零清零未溢出未溢出1000HIC置位置位Z清零清零無符號數大于無符號數大于1001LSC清零清零Z置位置位無符號數小于或等于無符號數小于或等于1010GEN等于等于V帶符號數大于或等于帶符號數大于或等于1011LTN不等于不等于V帶符號數小于帶符號數小于1100GTZ清零且(清零且(N等于等于V)帶符號數大于帶符號數大于1101LEZ置位或(置位或(N不

28、等于不等于V)帶符號數小于或等于帶符號數小于或等于1110AL忽略忽略無條件執(zhí)行無條件執(zhí)行C代碼:代碼:if(a b) a+;else b+;對應的匯編代碼:對應的匯編代碼:CMP R0,R1;R0與與R1比較比較ADDHI R0,R0,#1;若若R0R1,則,則R0=R0+1ADDLS R1,R1,#1;若若R0R1,則,則R1=R1+1示例:示例:3.2.2 條件碼條件碼3.2.3 ARM 存儲器訪問指令存儲器訪問指令uARM微處理器內部沒有微處理器內部沒有RAM,而,而ARM除了寄存器除了寄存器(即(即R0R15)外沒有別的存儲單元;在以)外沒有別的存儲單元;在以ARM為核為核的嵌入式系

29、統中,所有的外圍模塊都和存儲單元一樣,的嵌入式系統中,所有的外圍模塊都和存儲單元一樣,是是ARM微處理器的不同的地址單元。不管這些模塊微處理器的不同的地址單元。不管這些模塊的功能如何(如輸入的功能如何(如輸入/輸出、定時器、存儲器等),輸出、定時器、存儲器等),也不管這些模塊的位置如何(如片內或片外),也不管這些模塊的位置如何(如片內或片外),ARM微處理器都把它們看作是外部存儲器。其操作微處理器都把它們看作是外部存儲器。其操作過程和對存儲器的操作是相同的。過程和對存儲器的操作是相同的。3.2.3 ARM 存儲器訪問指令存儲器訪問指令u因此,在因此,在ARM微處理器的數據傳送中,微處理器的數據

30、傳送中,數據的源和數據數據的源和數據的目標的目標只有兩種:一種是只有兩種:一種是ARM的寄存器的寄存器R0R15;另一種;另一種就是外部存儲器就是外部存儲器(它們可能是外圍模塊的寄存器、外部數(它們可能是外圍模塊的寄存器、外部數據存儲器或可訪問的程序存儲器等)。據存儲器或可訪問的程序存儲器等)。u我們把數據從存儲器到寄存器的傳送我們把數據從存儲器到寄存器的傳送叫加載,叫加載,數據從寄存數據從寄存器到存儲器的傳送器到存儲器的傳送叫存儲。叫存儲。存儲器存儲器寄存器(寄存器(R0-R15R0-R15)ARMARM微處理器微處理器外圍模塊或芯片外圍模塊或芯片存儲存儲加載加載加載指令:存儲指令:存儲器源

31、地址源地址目標寄存器目標寄存器存儲器目標地址目標地址源寄存器源寄存器3.2.3 ARM 存儲器訪問指令存儲器訪問指令3.2.3 ARM 存儲器訪問指令存儲器訪問指令u加載加載/存儲指令可分為存儲指令可分為3類:類:u單一數據加載單一數據加載/存儲指令存儲指令u批量數據加載批量數據加載/存儲指令存儲指令u數據交換指令數據交換指令3.2.3 ARM 存儲器訪問指令存儲器訪問指令1單一數據加載單一數據加載/存儲指令存儲指令(1)LDR指令指令格式為:格式為:LDR條件條件 目的寄存器,目的寄存器, LDR指令是指令是字加載指令字加載指令,用于從存儲器中將,用于從存儲器中將一個一個32位的字數據傳送到

32、目的寄存器中。位的字數據傳送到目的寄存器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令u指令示例:指令示例:LDR R3,R4 ;將存儲器地址為;將存儲器地址為R4的字數據讀入寄存器的字數據讀入寄存器R3。LDR R3,R1,R2 ;將存儲器地址為;將存儲器地址為R1+R2的字數據讀入寄存器的字數據讀入寄存器R3。LDR R3,R1,8 ;將存儲器地址為;將存儲器地址為R1+8的字數據讀入寄存器的字數據讀入寄存器R3。LDR R3,R1,R2!;將存儲器地址為;將存儲器地址為R1+R2的字數據讀入寄存器的字數據讀入寄存器R3,并將新地址,并將新地址R1R2寫入寫入R1。LDR R3,R1

33、,8 ??;將存儲器地址為;將存儲器地址為R1+8的字數據讀入寄存器的字數據讀入寄存器R3,并將新地址,并將新地址R18寫入寫入R1。零偏移:零偏移: 如:如:LDR Rd,Rn前索引偏移前索引偏移: :如:如:LDR Rd,Rn,#0 x04!程序相對偏移程序相對偏移: :如:如:LDR Rd,labe1 后索引偏移后索引偏移: :如:如:LDR Rd,Rn,#0 x040 x55R3R4 0 x400000000 x123456780 x400000000 x40000000存儲器存儲器地址地址應用示例:應用示例:LDR R3,R4;將將R4指向地址的字數據存入指向地址的字數據存入R30 x

34、123456783.2.3 ARM 存儲器訪問指令存儲器訪問指令3.2.3 ARM 存儲器訪問指令存儲器訪問指令LDR R3,R1,R2;將存儲器地址為;將存儲器地址為R1的字數據讀入寄存器的字數據讀入寄存器R3,并將新,并將新地址地址R1R2寫入寫入R1。LDR R3,R1,R2,LSL3!;將存儲器地址為;將存儲器地址為R1R28的字數據讀入寄存器的字數據讀入寄存器R3,并將新地址并將新地址R1R28寫入寫入R1。LDR R3,R1,R2,LSL3;將存儲器地址為;將存儲器地址為R1的字數據讀入寄存器的字數據讀入寄存器R3,并將新,并將新地址地址R1R28寫入寫入R1。注:注:R15不可以

35、作為偏移寄存器使用。不可以作為偏移寄存器使用。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(2)LDRB指令指令 格式為:格式為: LDR條件條件B 目的寄存器,目的寄存器, LDRB指令是指令是字節(jié)加載指令字節(jié)加載指令,用于從存儲器中將,用于從存儲器中將一個一個8位的字節(jié)數據傳送到目的寄存器中,同時將寄位的字節(jié)數據傳送到目的寄存器中,同時將寄存器的高存器的高24位清零。位清零。該指令通常用于從存儲器中讀取該指令通常用于從存儲器中讀取8位的字節(jié)數據位的字節(jié)數據到通用寄存器,然后對數據進行處理。到通用寄存器,然后對數據進行處理。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示

36、例:LDRB R3,R1 ;將存儲器地址為;將存儲器地址為R1的字節(jié)數據讀入寄存器的字節(jié)數據讀入寄存器R0,并,并將將R3的高的高24位清零。位清零。LDRB R3,R1,8 ;將存儲器地址為;將存儲器地址為R18的字節(jié)數據讀入寄存器的字節(jié)數據讀入寄存器R3,并將并將R3的高的高24位清零。位清零。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(3)LDRH指令指令格式為:格式為:LDR條件條件H 目的寄存器,目的寄存器,LDRH指令是指令是無符號半字加載指令無符號半字加載指令,用于從存儲,用于從存儲器中將一個器中將一個16位的半字數據傳送到目的寄存器中,同位的半字數據傳送到目的寄存器中,同

37、時將寄存器的高時將寄存器的高16位清零。該指令通常用于從存儲器位清零。該指令通常用于從存儲器中讀取中讀取16位的半字數據到通用寄存器,然后對數據進位的半字數據到通用寄存器,然后對數據進行處理。行處理。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:LDRH R3,R1;將存儲器地址為;將存儲器地址為R1的半字數據讀入寄存器的半字數據讀入寄存器R3,并將,并將R3的高的高16位清零。位清零。LDRH R3,R1,8 ;將存儲器地址為;將存儲器地址為R18的半字數據讀入寄存器的半字數據讀入寄存器R3,并,并將將R3的高的高16位清零。位清零。LDRH R3,R1,R2 ;將存儲

38、器地址為;將存儲器地址為R1R2的半字數據讀入寄存器的半字數據讀入寄存器R3,并將并將R3的高的高16位清零。位清零。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(4)STR指令指令格式為:格式為:STR條件條件 源寄存器,源寄存器, STR指令是指令是字存儲指令字存儲指令,用于從源寄存器中將,用于從源寄存器中將一個一個32位的字數據傳送到存儲器中。該指令在程位的字數據傳送到存儲器中。該指令在程序設計中比較常用,且尋址方式靈活多樣,使用序設計中比較常用,且尋址方式靈活多樣,使用方式可參考指令方式可參考指令LDR。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STRR3

39、,R1,8;將;將R3中的字數據寫入以中的字數據寫入以R1為地址的存儲器中,為地址的存儲器中,并將新地址并將新地址R18寫入寫入R1。STRR3,R1,8;將;將R3中的字數據寫入以中的字數據寫入以R18為地址的存儲器為地址的存儲器中。中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(5)STRB指令指令格式為:格式為: STR條件條件B 源寄存器,源寄存器, STRB指令是指令是無符號字節(jié)存儲指令無符號字節(jié)存儲指令,用于從源,用于從源寄存器中將一個寄存器中將一個8位的字節(jié)數據傳送到存儲器中。位的字節(jié)數據傳送到存儲器中。該字節(jié)數據為源寄存器中的低該字節(jié)數據為源寄存器中的低8位。位。3.2.

40、3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STRB R3,R1 ;將寄存器;將寄存器R3中的字節(jié)數據寫入以中的字節(jié)數據寫入以R1為地址的存為地址的存儲器中。儲器中。STRB R3,R1,8;將寄存器;將寄存器R3中的字節(jié)數據寫入以中的字節(jié)數據寫入以R18為地址的為地址的存儲器中。存儲器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(6)STRH指令指令格式為:格式為: STR條件條件H 源寄存器,源寄存器, STRH指令是指令是無符號半字存儲指令無符號半字存儲指令,用于從源,用于從源寄存器中將一個寄存器中將一個16位的半字數據傳送到存儲器中。位的半字數據傳送到存儲器中。

41、該半字數據為源寄存器中的低該半字數據為源寄存器中的低16位。位。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STRH R3,R1 ;將寄存器;將寄存器R3中的半字數據寫入以中的半字數據寫入以R1為地址的存儲器中。為地址的存儲器中。STRH R3,R1,8 ;將寄存器;將寄存器R3中的半字數據寫中的半字數據寫入以入以R18為地址的存儲器中。為地址的存儲器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令2批量數據加載批量數據加載/存儲指令存儲指令 ARM微處理器所支持批量數據加載微處理器所支持批量數據加載/存儲指存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存令可以一次

42、在一片連續(xù)的存儲器單元和多個寄存器之間傳送數據,批量加載指令用于將一片連續(xù)器之間傳送數據,批量加載指令用于將一片連續(xù)的存儲器中的數據傳送到多個寄存器,批量數據的存儲器中的數據傳送到多個寄存器,批量數據存儲指令則完成相反的操作。存儲指令則完成相反的操作。3.2.3 ARM 存儲器訪問指令存儲器訪問指令常用的加載存儲指令如下:常用的加載存儲指令如下:LDM(或(或STM)指令)指令格式為:格式為:LDM(或(或STM)條件條件類型類型 基址寄存器基址寄存器!,寄存器列表,寄存器列表 LDM(或(或STM)指令用于從由基址寄存器所指示的一)指令用于從由基址寄存器所指示的一片連續(xù)存儲器到寄存器列表所指

43、示的多個寄存器之間傳送片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送數據,該指令的常見用途是將多個寄存器的內容入?;虺鰯祿撝噶畹某R娪猛臼菍⒍鄠€寄存器的內容入?;虺鰲!F渲?,棧。其中,類型類型為以下幾種情況:為以下幾種情況:3.2.3 ARM 存儲器訪問指令存儲器訪問指令uIA 每次傳送后地址加每次傳送后地址加1,遞增方式;,遞增方式;uIB 每次傳送前地址加每次傳送前地址加1,遞增方式;,遞增方式;uDA 每次傳送后地址減每次傳送后地址減1,遞減方式;,遞減方式;uDB 每次傳送前地址減每次傳送前地址減1,遞減方式;,遞減方式;uFD 滿遞減堆棧;滿遞減堆棧;uED 空遞減堆棧;空遞

44、減堆棧;uFA 滿遞增堆棧;滿遞增堆棧;uEA 空遞增堆棧;空遞增堆棧;3.2.3 ARM 存儲器訪問指令存儲器訪問指令u!為可選后綴,若選用該后綴,則當數據傳送完畢為可選后綴,若選用該后綴,則當數據傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存之后,將最后的地址寫入基址寄存器,否則基址寄存器的內容不改變。器的內容不改變。u基址寄存器不允許為基址寄存器不允許為R15。u寄存器列表可以為寄存器列表可以為R0R15的任意組合,若使用連續(xù)的任意組合,若使用連續(xù)的寄存器時,可以使用的寄存器時,可以使用“-”表示省略。表示省略。u為可選后綴,這是一個只是在數據塊傳送中使用為可選后綴,這是一個只是

45、在數據塊傳送中使用的后綴,當指令為的后綴,當指令為LDM且寄存器列表中包含且寄存器列表中包含R15,選,選用該后綴時表示:除了正常的數據傳送之外,還將用該后綴時表示:除了正常的數據傳送之外,還將SPSR復制到復制到CPSR。同時,該后綴還表示傳入或傳出。同時,該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當前模式下的寄存的是用戶模式下的寄存器,而不是當前模式下的寄存器。器。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STMFD R13!,R0,R4-R12,LR;將寄存器列表中的寄存器(;將寄存器列表中的寄存器(R0,R4到到R12,LR)存入堆)存入堆棧。棧。L

46、DMFD R13!,R0,R4-R12,PC;將堆棧內容恢復到寄存器(;將堆棧內容恢復到寄存器(R0,R4到到R12,LR)。)。在通用存儲區(qū),數據存儲的方式和堆棧區(qū)相近。下面通過存在通用存儲區(qū),數據存儲的方式和堆棧區(qū)相近。下面通過存儲儲R1、R2和和R3 3個寄存器的個寄存器的4種后綴指令執(zhí)行前后的存儲種后綴指令執(zhí)行前后的存儲情況如圖情況如圖3-7所示。所示。3.2.3 ARM 存儲器訪問指令存儲器訪問指令3交換指令交換指令(1)SWP指令指令格式為:格式為: SWP條件條件 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWP指令是數據指令是數據字交換字交換指令,用于將源

47、寄存器指令,用于將源寄存器2所指向的存儲器中的字數據傳送到目的寄存器中,所指向的存儲器中的字數據傳送到目的寄存器中,同時將源寄存器同時將源寄存器1中的字數據傳送到源寄存器中的字數據傳送到源寄存器2所指所指向的存儲器中。顯然,當源寄存器向的存儲器中。顯然,當源寄存器1和目的寄存器為和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內同一個寄存器時,指令交換該寄存器和存儲器的內容。容。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:SWP R1,R2,R3 ;將;將R3所指向的存儲器中的字數據傳送到所指向的存儲器中的字數據傳送到R1,同時,同時;將;將R2中的字數據傳送到

48、中的字數據傳送到R3所指向的存儲單元。所指向的存儲單元。SWPEQ R1,R1,R2 ;Z=1時,完成將時,完成將R2所指向的存儲器中的字數據與所指向的存儲器中的字數據與;R1中的字數據交換。中的字數據交換。3.2.3 ARM 存儲器訪問指令存儲器訪問指令STMIBSTMIB R0R0!,R1,R2,R3R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0STMIA R0!,R1,R2,R3STMIA R0!,R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0地址增地址增STMDA R0!,R1,R2,R

49、3STMDA R0!,R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0STMDB R0!,R1,R2,R3STMDB R0!,R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0地址減地址減3.2.3 ARM 存儲器訪問指令存儲器訪問指令(2)SWPB指令指令格式為:格式為:SWP條件條件B 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWPB指令是指令是字節(jié)交換指令字節(jié)交換指令,用于將源寄存,用于將源寄存器器2所指向的存儲器中的字節(jié)數據傳送到目的寄存所指向的存儲器中的字節(jié)數據傳送到

50、目的寄存器中,目的寄存器的高器中,目的寄存器的高24清零,同時將源寄存器清零,同時將源寄存器1中的字節(jié)數據傳送到源寄存器中的字節(jié)數據傳送到源寄存器2所指向的存儲器中。所指向的存儲器中。顯然,當源寄存器顯然,當源寄存器1和目的寄存器為同一個寄存器和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內容。時,指令交換該寄存器和存儲器的內容。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:SWPB R1,R2,R3;將;將R3所指向的存儲器中的字節(jié)數據傳送到所指向的存儲器中的字節(jié)數據傳送到R1,R1的的高高24位清零,同時將位清零,同時將R2中的低中的低8位數據傳送到位數據傳

51、送到R3所指所指向的存儲單元。向的存儲單元。SWPB R1,R1,R2;該指令完成將;該指令完成將R2所指向的存儲器中的字節(jié)數據與所指向的存儲器中的字節(jié)數據與R1中的低中的低8位數據交換。位數據交換。3.2.4 ARM 數據處理類指令數據處理類指令u數據處理指令只能對寄存器的內容進行操作,不允許數據處理指令只能對寄存器的內容進行操作,不允許對存儲器中的數據進行操作,也不允許指令直接使用對存儲器中的數據進行操作,也不允許指令直接使用存儲器的數據或在寄存器與存儲器之間傳送數據。存儲器的數據或在寄存器與存儲器之間傳送數據。u數據處理指令可分為數據處理指令可分為3大類:大類:u數據傳送指令數據傳送指令

52、u算術邏輯運算指令算術邏輯運算指令u比較指令比較指令3.2.4 ARM 數據處理類指令數據處理類指令u數據傳送指令數據傳送指令用于在寄存器和存儲器之間進行數用于在寄存器和存儲器之間進行數據的雙向傳輸。據的雙向傳輸。u算術邏輯運算指令算術邏輯運算指令完成常用的算術與邏輯的運算,完成常用的算術與邏輯的運算,該類指令不但將運算結果保存在目的寄存器中,該類指令不但將運算結果保存在目的寄存器中,同時更新同時更新CPSR中的相應條件標志位。中的相應條件標志位。u比較指令比較指令是完成對指定的兩個寄存器(或是完成對指定的兩個寄存器(或1個寄存?zhèn)€寄存器,器,1個立即數)進行比較,不保存運算結果,只個立即數)進

53、行比較,不保存運算結果,只影響影響CPSR中相應的條件標志位。中相應的條件標志位。數據傳送指令數據傳送指令1.數據傳送指令數據傳送指令MOV和和MVN(1)MOV指令指令 格式為:格式為: MOV條件條件S 目的寄存器,源操作數目的寄存器,源操作數 MOV指令可完成在寄存器之間或寄存器與第指令可完成在寄存器之間或寄存器與第2操作數之間進行數據傳送。操作數之間進行數據傳送。 其中其中S選項決定指令的操作是否影響選項決定指令的操作是否影響CPSR中中條件標志位的值,當沒有條件標志位的值,當沒有S時指令不更新時指令不更新CPSR中中條件標志位的值。條件標志位的值。數據傳送指令數據傳送指令指令示例:指

54、令示例:MOVR4,R5;將寄存器;將寄存器R5的內容傳送到寄存器的內容傳送到寄存器R4MOVPC,R14;將寄存器;將寄存器R14的內容傳送到的內容傳送到PC,常用于子程序返,常用于子程序返回回MOVNE R4,R5,LSL2;當;當Z=0時,將寄存器時,將寄存器R5的內容邏輯左移的內容邏輯左移2位后傳送位后傳送到到R4數據傳送指令數據傳送指令(2)MVN指令指令格式為:格式為:MVN條件條件S 目的寄存器,源操作數目的寄存器,源操作數 MVN指令可完成在寄存器之間或寄存器與第指令可完成在寄存器之間或寄存器與第2操作數之間進行數據非傳送。與操作數之間進行數據非傳送。與MOV指令不同指令不同之

55、處是在傳送之前按位被取反了,即把一個被取之處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。反的值傳送到目的寄存器中。 其中其中S決定指令的操作是否影響決定指令的操作是否影響CPSR中條件中條件標志位的值,當沒有標志位的值,當沒有S時指令不更新時指令不更新CPSR中條件中條件標志位的值。標志位的值。數據傳送指令數據傳送指令(2)MVN指令指令格式為:格式為:MVN條件條件S 目的寄存器,源操作數目的寄存器,源操作數 MVN指令可完成在寄存器之間或寄存器與第指令可完成在寄存器之間或寄存器與第2操作數之間進行數據非傳送。與操作數之間進行數據非傳送。與MOV指令不同之指令不同之處是在

56、傳送之前按位被取反了,即把一個被取反處是在傳送之前按位被取反了,即把一個被取反的值傳送到目的寄存器中。的值傳送到目的寄存器中。 其中其中S決定指令的操作是否影響決定指令的操作是否影響CPSR中條件中條件標志位的值,當沒有標志位的值,當沒有S時指令不更新時指令不更新CPSR中條件中條件標志位的值。標志位的值。數據傳送指令數據傳送指令指令示例:指令示例:MVN R0,0;將立即數;將立即數0取反傳送到寄存器取反傳送到寄存器R0中,完成后中,完成后R0=-1 MVN R1,R2;將將R2取反,結果存到取反,結果存到R1算術邏輯運算指令算術邏輯運算指令2.算術邏輯運算指令算術邏輯運算指令(1)ADD指

57、令指令格式為:格式為: ADD條件條件S 目的寄存器,操作數目的寄存器,操作數1,操作數,操作數2 ADD指令是指令是加法指令加法指令,用于把兩個操作數相加,用于把兩個操作數相加,并將結果存放到目的寄存器中。并將結果存放到目的寄存器中。u 操作數操作數1應是一個寄存器。應是一個寄存器。u操作數操作數2可以是一個寄存器,被移位的寄存器,或可以是一個寄存器,被移位的寄存器,或一個立即數一個立即數 .算術邏輯運算指令算術邏輯運算指令指令示例:指令示例:ADDS R0,R3,R4 ; R0 = R3 + R4,設置標志位,設置標志位ADDC R0,R3,#10 ; R0 = R3 + 10ADD R0

58、,R2,R3,LSL#2 ; R0 = R2 + R34算術邏輯運算指令算術邏輯運算指令(2)ADC指令指令格式為:格式為: ADC條件條件S 目的寄存器,操作數目的寄存器,操作數1,操作數,操作數2ADC指令是指令是帶進位加法指令帶進位加法指令,用于把兩個操作數相加,用于把兩個操作數相加,再加上再加上CPSR中的中的C條件標志位的值,并將結果存放條件標志位的值,并將結果存放到目的寄存器中。它使用一個進位標志位,這樣就可到目的寄存器中。它使用一個進位標志位,這樣就可以做比以做比32位大的數的加法,注意不要忘記設置位大的數的加法,注意不要忘記設置S后綴后綴來更改進位標志。來更改進位標志。u操作數

59、操作數1應是一個寄存器。應是一個寄存器。u操作數操作數2可以是一個寄存器,被移位的寄存器,或一可以是一個寄存器,被移位的寄存器,或一個立即數。個立即數。算術邏輯運算指令算術邏輯運算指令以下指令序列實現以下指令序列實現64位二進制數的加法:位二進制數的加法:R2、R1= R2、R1+ R4、R3ADDS R1,R1,R3 ;R1= R1+ R3ADC R2,R2,R4 ;R2= R2+ R4+C算術邏輯運算指令算術邏輯運算指令(3)SUB指令指令格式為:格式為: SUB條件條件S 目的寄存器,操作數目的寄存器,操作數1,操作數,操作數2 SUB指令是指令是減法指令減法指令,用于把操作數,用于把操

60、作數1減去操作減去操作數數2,并將結果存放到目的寄存器中。該指令可用,并將結果存放到目的寄存器中。該指令可用于有符號數或無符號數的減法運算。于有符號數或無符號數的減法運算。u操作數操作數1應是一個寄存器。應是一個寄存器。u操作數操作數2可以是一個寄存器,被移位的寄存器,或可以是一個寄存器,被移位的寄存器,或一個立即數。一個立即數。算術邏輯運算指令算術邏輯運算指令指令示例:指令示例:SUBS R0,R3,R4 ; R0 = R3 R4,設置標志位,設置標志位SUB R0,R1,#0 x10 ; R0 = R1 - 0 x 10SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3

溫馨提示

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

評論

0/150

提交評論