ARM9_嵌入式系統(tǒng)原理及應(yīng)用教程第3章_第1頁(yè)
ARM9_嵌入式系統(tǒng)原理及應(yīng)用教程第3章_第2頁(yè)
ARM9_嵌入式系統(tǒng)原理及應(yīng)用教程第3章_第3頁(yè)
ARM9_嵌入式系統(tǒng)原理及應(yīng)用教程第3章_第4頁(yè)
ARM9_嵌入式系統(tǒng)原理及應(yīng)用教程第3章_第5頁(yè)
已閱讀5頁(yè),還剩133頁(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、第第3章章 ARM9指令系統(tǒng)指令系統(tǒng)uARM處理器的尋址方式處理器的尋址方式uARM指令集指令集 uThumb指令集指令集 3.1 ARM處理器的尋址方式處理器的尋址方式u尋址方式尋址方式是處理器根據(jù)指令中給出的地址信息來(lái)尋是處理器根據(jù)指令中給出的地址信息來(lái)尋找物理地址的方式。找物理地址的方式。u目前目前ARM指令系統(tǒng)支持指令系統(tǒng)支持7種種尋址方式。尋址方式。l寄存器尋址寄存器尋址l立即尋址立即尋址l寄存器間接尋址寄存器間接尋址l變址尋址變址尋址l多寄存器尋址多寄存器尋址l堆棧尋址堆棧尋址l相對(duì)尋址相對(duì)尋址3.1.1 寄存器尋址寄存器尋址 寄存器尋址寄存器尋址就是利用寄存器中的內(nèi)容作為操作數(shù),

2、就是利用寄存器中的內(nèi)容作為操作數(shù),寄存器本身就是操作數(shù)地址。這種尋址方式是各類微寄存器本身就是操作數(shù)地址。這種尋址方式是各類微處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式。的尋址方式。 例如指令:例如指令: MOV R2, R3 ;R2R3 R3中的內(nèi)容賦給中的內(nèi)容賦給R2ADD R2,R3,R4 ;R2R3R4 R3和和R4中的內(nèi)容相加,結(jié)果中的內(nèi)容相加,結(jié)果賦給賦給R20 xAA0 x55R3R2MOV R2,R30 xAA3.1.2 立即尋址立即尋址u立即尋址立即尋址也叫立即數(shù)尋址,這是一種特殊的尋址方式,也叫立即數(shù)尋址,這是一種

3、特殊的尋址方式,操作數(shù)沒(méi)有存儲(chǔ)在寄存器或存儲(chǔ)器中,而是包含在指令操作數(shù)沒(méi)有存儲(chǔ)在寄存器或存儲(chǔ)器中,而是包含在指令的操作碼中,只要取出指令也就取到了操作數(shù)。這個(gè)操的操作碼中,只要取出指令也就取到了操作數(shù)。這個(gè)操作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址。作數(shù)被稱為立即數(shù),對(duì)應(yīng)的尋址方式也就叫做立即尋址。例如指令:例如指令: MOV R0,#0 xFF000 ;將立即數(shù)將立即數(shù)0 xFF000裝入裝入R0寄存器寄存器 ADD R1,R1,0 x7f ; R1R10 x7f 在以上兩條指令中,第二個(gè)源操作數(shù)即為立在以上兩條指令中,第二個(gè)源操作數(shù)即為立即數(shù),要求以即數(shù),要求以“”為前綴,對(duì)于以十

4、六進(jìn)制表為前綴,對(duì)于以十六進(jìn)制表示的立即數(shù),還要求在示的立即數(shù),還要求在“”后加上后加上“0 x”。 0 x55R0MOV R0,#0 xFF00程序存儲(chǔ)程序存儲(chǔ)MOV R0,#0 xFF000 xFF00從代碼中獲得數(shù)據(jù)從代碼中獲得數(shù)據(jù)3.1.3 寄存器間接尋址寄存器間接尋址u寄存器間接尋址寄存器間接尋址就是以寄存器中的內(nèi)容作為操作數(shù)的就是以寄存器中的內(nèi)容作為操作數(shù)的地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如指令地址,而操作數(shù)本身存放在存儲(chǔ)器中。例如指令 : LDRR1,R2;R1R2 STRR1,R2;R2R1 第一條指令將以第一條指令將以R2中的內(nèi)容為地址,將該地址中中的內(nèi)容為地址,將該地址

5、中的數(shù)據(jù)傳送到的數(shù)據(jù)傳送到R1中。中。 第二條指令將第二條指令將R1中的內(nèi)容傳送到以中的內(nèi)容傳送到以R2中的內(nèi)容為中的內(nèi)容為地址的存儲(chǔ)器中。地址的存儲(chǔ)器中。0 x55R1R2 0 x400000000 xAA0 x40000000LDR R1,R20 xAA3.1.4 變址尋址變址尋址u變址尋址變址尋址就是將寄存器(該寄存器一般稱作基址寄存就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個(gè)操作數(shù)的有效地址。變址尋址方式常用于訪問(wèn)到一個(gè)操作數(shù)的有效地址。變址尋址方式常用于訪問(wèn)某基地址附近的地址單元。某基地址附近

6、的地址單元。例如指令:例如指令: LDR R0,R1,8 ;R0R18LDR R0,R1,8! ;R0R18,R1R18LDR R0,R1,2 ;R0R1,R1R12LDR R0,R1,R2 ;R0R1R20 x55R0R1 0 x600000000 xAA0 x60000008LDR R0,R1,#0 x080 xAA將將R1+0 x08作作為地址裝載數(shù)為地址裝載數(shù)據(jù)據(jù)3.1.5 寄存器移位尋址寄存器移位尋址u寄存器移位尋址寄存器移位尋址是是ARM指令集獨(dú)有的尋址方式,操作指令集獨(dú)有的尋址方式,操作數(shù)由寄存器的數(shù)值進(jìn)行相應(yīng)移位而得到;移位的方式在數(shù)由寄存器的數(shù)值進(jìn)行相應(yīng)移位而得到;移位的方式

7、在指令中以助記符的形式給出,而移位的位數(shù)可用立即數(shù)指令中以助記符的形式給出,而移位的位數(shù)可用立即數(shù)或寄存器尋址方式表示?;蚣拇嫫鲗ぶ贩绞奖硎尽ARM微處理器內(nèi)嵌的微處理器內(nèi)嵌的桶型移位器桶型移位器(Barrel Shifter),),移位操作在移位操作在ARM指令集中不作為單獨(dú)的指令使用,它指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中的一個(gè)字段,在匯編語(yǔ)言中表示為只能作為指令格式中的一個(gè)字段,在匯編語(yǔ)言中表示為指令中的選項(xiàng)。指令中的選項(xiàng)。例如,數(shù)據(jù)處理指令的第例如,數(shù)據(jù)處理指令的第2個(gè)操作數(shù)為寄存器時(shí),個(gè)操作數(shù)為寄存器時(shí),就可以加入移位操作選項(xiàng)對(duì)它進(jìn)行各種移位操作。移位就可以加入移位操

8、作選項(xiàng)對(duì)它進(jìn)行各種移位操作。移位操作包括如下操作包括如下6種類型種類型.3.1.5 寄存器移位尋址寄存器移位尋址uLSL(或(或ASL)操作操作 格式為:格式為: 通用寄存器,通用寄存器,LSL(或(或ASL) 操作數(shù)操作數(shù) LSL(或(或ASL)可完成對(duì)通用寄存器中的內(nèi)容進(jìn))可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行行邏輯(或算術(shù))的左移邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來(lái)填充,最后一個(gè)左移出的位量向左移位,低位用零來(lái)填充,最后一個(gè)左移出的位放在狀態(tài)寄存器的放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-1所示。所示。其中,操作數(shù)可以是通用寄存

9、器,也可以是立即其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(數(shù)(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, LSL #2;將;將R1中的內(nèi)容左移中的內(nèi)容左移2位后傳送到位后傳送到R0中,中,;其中把最后移出的位賦給程序狀態(tài)寄存器;其中把最后移出的位賦給程序狀態(tài)寄存器的的C位位CPSR29。31C30291000uLSR操作操作格式為:格式為: 通用寄存器,通用寄存器,LSR 操作數(shù)操作數(shù) LSR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行右移右移的操作,的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來(lái)填充,按操作數(shù)所指定

10、的數(shù)量向右移位,左端用零來(lái)填充,最后一個(gè)右移出的位放在狀態(tài)寄存器的最后一個(gè)右移出的位放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-2所示。其中,操作數(shù)可以是通用寄存器,所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(也可以是立即數(shù)(031)。)。 3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, LSR #4;將;將R1中的內(nèi)容右移中的內(nèi)容右移4位后傳送到位后傳送到R0中。中。;其中把最后移出的位賦給程序狀態(tài)寄存器;其中把最后移出的位賦給程序狀態(tài)寄存器的的C位位CPSR29。 3.1.5 寄存器移位尋址寄存器移位尋址31C302910003.1.

11、5 寄存器移位尋址寄存器移位尋址uROR操作操作格式為:格式為: 通用寄存器,通用寄存器,ROR 操作數(shù)操作數(shù) ROR可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,右端的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,右端移出的位填充在左側(cè)的空位處,最后一個(gè)右移出的位移出的位填充在左側(cè)的空位處,最后一個(gè)右移出的位同時(shí)也放在狀態(tài)寄存器的同時(shí)也放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-3所示。其中,操作數(shù)可以是通用寄存器,也可以是立所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(即數(shù)(031)。)。u操作示例:操作示例

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

13、存器的變,最后一個(gè)右移出的位放在狀態(tài)寄存器的C位位CPSR29 ,如圖,如圖3-4所示。其中,操作數(shù)可以是通用所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(寄存器,也可以是立即數(shù)(031)。)。 這種移位對(duì)有符號(hào)數(shù)據(jù)使用時(shí)可以保持符號(hào)位不變。這種移位對(duì)有符號(hào)數(shù)據(jù)使用時(shí)可以保持符號(hào)位不變。3.1.5 寄存器移位尋址寄存器移位尋址3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, ASR#4;將;將R1中的內(nèi)容右移中的內(nèi)容右移4位后傳送到位后傳送到R0中,符號(hào)位保持不中,符號(hào)位保持不變。變。;最后移出的位同時(shí)也送入狀態(tài)位;最后移出的位同時(shí)也送入狀態(tài)位C中。中

14、。3131C C303029291 10 0uRRX操作操作RRX操作的格式為:操作的格式為: 通用寄存器,通用寄存器,RRX RRX可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行可完成對(duì)通用寄存器中的內(nèi)容進(jìn)行帶擴(kuò)展的帶擴(kuò)展的循環(huán)右移循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,左側(cè)空位由狀態(tài)寄存器位,左側(cè)空位由狀態(tài)寄存器C位來(lái)填充,右側(cè)移出的位來(lái)填充,右側(cè)移出的位移進(jìn)狀態(tài)位位移進(jìn)狀態(tài)位C中,如圖中,如圖3-5所示。其中,操作數(shù)可以所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(是通用寄存器,也可以是立即數(shù)(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u

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

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

17、 x020 x030 x040 x400000040 x400000080 x4000000C存儲(chǔ)器存儲(chǔ)器LDMIA R1!,R2-R4,R5 0 x400000100 x010 x020 x030 x043.1.7 堆棧尋址堆棧尋址u堆棧堆棧是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(是一種數(shù)據(jù)結(jié)構(gòu),按先進(jìn)后出(First In Last Out,F(xiàn)ILO)的方式工作,使用一個(gè)稱作堆棧指針的)的方式工作,使用一個(gè)稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向?qū)S眉拇嫫髦甘井?dāng)前的操作位置,堆棧指針總是指向棧頂。棧頂。u當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱為當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時(shí),稱

18、為滿堆棧滿堆棧(Full Stack);而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)而當(dāng)堆棧指針指向下一個(gè)將要放入數(shù)據(jù)的空位置時(shí),稱為據(jù)的空位置時(shí),稱為空堆??斩褩#‥mpty Stack)。)。u同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧同時(shí),根據(jù)堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧()和遞減堆棧(Decending Stack),當(dāng)堆棧由低地址向高地址生成時(shí),稱為),當(dāng)堆棧由低地址向高地址生成時(shí),稱為遞遞增堆棧增堆棧,當(dāng)堆棧由高地址向低地址生成時(shí),稱為,當(dāng)堆棧由高地址向低地址生成時(shí),稱為遞減遞減堆棧堆棧。棧頂棧頂SP棧頂棧頂SP棧底棧底空堆??斩褩5讞5诐M

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

20、空遞增方式EA(Empty Ascending):堆棧指針指向):堆棧指針指向下一個(gè)入棧數(shù)據(jù)的空位置,且由低地址向高地址生成。下一個(gè)入棧數(shù)據(jù)的空位置,且由低地址向高地址生成。u空遞減方式空遞減方式ED(Empty Decending):堆棧指針指向):堆棧指針指向下一個(gè)入棧數(shù)據(jù)的空位置,且由高地址向低地址生成。下一個(gè)入棧數(shù)據(jù)的空位置,且由高地址向低地址生成。3.1.8 相對(duì)尋址相對(duì)尋址 u與基址變址尋址方式相類似,與基址變址尋址方式相類似,相對(duì)尋址相對(duì)尋址以程序計(jì)數(shù)器以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移的當(dāng)前值為基地址,指令中的地址標(biāo)號(hào)作為偏移量,將兩者相加之后得到操作數(shù)

21、的有效地址。以下程量,將兩者相加之后得到操作數(shù)的有效地址。以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令BL采用了采用了相對(duì)尋址方式:相對(duì)尋址方式: BL NEXT;跳轉(zhuǎn)到子程序;跳轉(zhuǎn)到子程序NEXT處執(zhí)行處執(zhí)行 NEXT MOVPC,LR;從子程序返回;從子程序返回3.2 ARM指令集指令集uARM微處理器的指令集是加載微處理器的指令集是加載/存儲(chǔ)型的存儲(chǔ)型的.u即指令集僅能處理寄存器中的數(shù)據(jù),處理結(jié)果仍要放即指令集僅能處理寄存器中的數(shù)據(jù),處理結(jié)果仍要放回寄存器中,而對(duì)回寄存器中,而對(duì)系統(tǒng)存儲(chǔ)器的訪問(wèn)則需要通過(guò)專門(mén)系統(tǒng)存儲(chǔ)器的訪問(wèn)則需要通過(guò)專門(mén)的加載的加載/存

22、儲(chǔ)指令來(lái)完成存儲(chǔ)指令來(lái)完成。uARM9指令集,包括指令集,包括ARM指令集指令集Thumb指令集。指令集。u首先介紹首先介紹ARM指令的基本格式及靈活的操作數(shù),然指令的基本格式及靈活的操作數(shù),然后介紹條件碼,再把后介紹條件碼,再把ARM指令集、指令集、Thumb指令集按類指令集按類分別說(shuō)明。分別說(shuō)明。ARM指令的基本格式如下: S , 其中其中號(hào)內(nèi)的項(xiàng)是必須的,號(hào)內(nèi)的項(xiàng)是必須的,號(hào)內(nèi)的項(xiàng)是可選的。號(hào)內(nèi)的項(xiàng)是可選的。各項(xiàng)的說(shuō)明如下:各項(xiàng)的說(shuō)明如下:opcode:指令助記符;:指令助記符;cond:執(zhí)行條件;:執(zhí)行條件;S:是否影響:是否影響CPSR寄存器的值;寄存器的值;Rd:目標(biāo)寄存器;:目標(biāo)

23、寄存器;Rn:第:第1個(gè)操作數(shù)的寄存器;個(gè)操作數(shù)的寄存器;op2:第:第2個(gè)操作數(shù);個(gè)操作數(shù);3.2.1 指令格式指令格式 ARM指令的基本格式如下:指令的基本格式如下:3.2 指令集介紹指令集介紹uARM指令集指令集第第2個(gè)操作數(shù)個(gè)操作數(shù) 靈活的使用第靈活的使用第2個(gè)操作數(shù)個(gè)操作數(shù)“op2”能夠提高能夠提高代碼效率。它有如下的形式:代碼效率。它有如下的形式:#immed_8r常數(shù)表達(dá)式;常數(shù)表達(dá)式;Rm寄存器方式;寄存器方式;Rm,shift寄存器移位方式;寄存器移位方式; S , 3.2 指令集介紹指令集介紹uARM指令集指令集第第2個(gè)操作數(shù)個(gè)操作數(shù)#immed_8r#immed_8r常數(shù)

24、表達(dá)式常數(shù)表達(dá)式 該常數(shù)必須對(duì)應(yīng)該常數(shù)必須對(duì)應(yīng)8 8位位圖,即必須是一個(gè)位位圖,即必須是一個(gè)8 8位的常位的常數(shù)通過(guò)循環(huán)右移偶數(shù)位可以得到的數(shù)。數(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 x801 0 0 0 0 0 0 00 x040 0 0 0 0 1 0 0移位前的8位常數(shù)0 x12移位后得到的常數(shù)0 x048000003.2 指令集介紹指令集

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

26、0(0 x5B循環(huán)右移18位)3.2 指令集介紹指令集介紹uARM指令集指令集第第2個(gè)操作數(shù)個(gè)操作數(shù)RmRm寄存器方式寄存器方式 在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:例如:SUBR1,R1,R2MOVPC,R03.2.2 條件碼條件碼u當(dāng)處理器工作在當(dāng)處理器工作在ARM狀態(tài)時(shí),幾乎所有的指令均根狀態(tài)時(shí),幾乎所有的指令均根據(jù)據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行條件滿足時(shí),指令被執(zhí)行,否則指行。當(dāng)指令的執(zhí)行條件滿足時(shí),指令被執(zhí)行,否則指令被忽略。令被忽略。u每一條每一條ARM指令包含

27、指令包含4位的條件碼位的條件碼,位于指令的最高,位于指令的最高4位位31:28。條件碼共有。條件碼共有16種,每種條件碼可用兩個(gè)種,每種條件碼可用兩個(gè)字符表示,這兩個(gè)字符可以添加在指令助記符的后面字符表示,這兩個(gè)字符可以添加在指令助記符的后面和指令同時(shí)使用。例如,跳轉(zhuǎn)指令和指令同時(shí)使用。例如,跳轉(zhuǎn)指令B可以加上后綴可以加上后綴EQ變?yōu)樽優(yōu)锽EQ表示表示“相等則跳轉(zhuǎn)相等則跳轉(zhuǎn)”,即當(dāng),即當(dāng)CPSR中的中的Z標(biāo)標(biāo)志置位時(shí)發(fā)生跳轉(zhuǎn)。志置位時(shí)發(fā)生跳轉(zhuǎn)。u在在16種條件標(biāo)志碼中,只有種條件標(biāo)志碼中,只有15種可以使用。種可以使用。3.2.2 條件碼條件碼C代碼:代碼:if(a b) a+;else b+

28、;對(duì)應(yīng)的匯編代碼:對(duì)應(yīng)的匯編代碼: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 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令uARM微處理器內(nèi)部沒(méi)有微處理器內(nèi)部沒(méi)有RAM,而,而ARM除了寄存器除了寄存器(即(即R0R15)外沒(méi)有別的存儲(chǔ)單元;在以)外沒(méi)有別的存儲(chǔ)單元;在以ARM為核為核的嵌入式系統(tǒng)中,所有的外圍模塊都和存儲(chǔ)單元一樣,的嵌入式系統(tǒng)中,所有的外圍模塊都和存儲(chǔ)單元一樣,是是ARM微處理器的不同的地址單元。不管這些模塊微處理

29、器的不同的地址單元。不管這些模塊的功能如何(如輸入的功能如何(如輸入/輸出、定時(shí)器、存儲(chǔ)器等),輸出、定時(shí)器、存儲(chǔ)器等),也不管這些模塊的位置如何(如片內(nèi)或片外),也不管這些模塊的位置如何(如片內(nèi)或片外),ARM微處理器都把它們看作是外部存儲(chǔ)器。其操作微處理器都把它們看作是外部存儲(chǔ)器。其操作過(guò)程和對(duì)存儲(chǔ)器的操作是相同的。過(guò)程和對(duì)存儲(chǔ)器的操作是相同的。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令u因此,在因此,在ARM微處理器的數(shù)據(jù)傳送中,微處理器的數(shù)據(jù)傳送中,數(shù)據(jù)數(shù)據(jù)的源和數(shù)據(jù)的目標(biāo)的源和數(shù)據(jù)的目標(biāo)只有兩種:一種是只有兩種:一種是ARM的的寄存器寄存器R0R15;另一種就是外部存儲(chǔ)器;另一

30、種就是外部存儲(chǔ)器(它(它們可能是外圍模塊的寄存器、外部數(shù)據(jù)存儲(chǔ)器們可能是外圍模塊的寄存器、外部數(shù)據(jù)存儲(chǔ)器或可訪問(wèn)的程序存儲(chǔ)器等)?;蚩稍L問(wèn)的程序存儲(chǔ)器等)。u我們把數(shù)據(jù)從存儲(chǔ)器到寄存器的傳送我們把數(shù)據(jù)從存儲(chǔ)器到寄存器的傳送叫加載,叫加載,數(shù)據(jù)從寄存器到存儲(chǔ)器的傳送數(shù)據(jù)從寄存器到存儲(chǔ)器的傳送叫存儲(chǔ)。叫存儲(chǔ)。存儲(chǔ)器存儲(chǔ)器寄存器(寄存器(R0-R15R0-R15)ARMARM微處理器微處理器外圍模塊或芯片外圍模塊或芯片存儲(chǔ)存儲(chǔ)加載加載加載指令:存儲(chǔ)指令:存儲(chǔ)器源地址源地址目標(biāo)寄存器目標(biāo)寄存器存儲(chǔ)器目標(biāo)地址目標(biāo)地址源寄存器源寄存器3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令3.2.3 ARM 存儲(chǔ)

31、器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令u加載加載/存儲(chǔ)指令可分為存儲(chǔ)指令可分為3類:類:u單一數(shù)據(jù)加載單一數(shù)據(jù)加載/存儲(chǔ)指令存儲(chǔ)指令u批量數(shù)據(jù)加載批量數(shù)據(jù)加載/存儲(chǔ)指令存儲(chǔ)指令u數(shù)據(jù)交換指令數(shù)據(jù)交換指令3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令1單一數(shù)據(jù)加載單一數(shù)據(jù)加載/存儲(chǔ)指令存儲(chǔ)指令(1)LDR指令指令格式為:格式為:LDR條件條件 目的寄存器,目的寄存器, LDR指令是指令是字加載指令字加載指令,用于從存儲(chǔ),用于從存儲(chǔ)器中將一個(gè)器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到目的寄存位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。器中。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令u指令示例:指令示例:LDR R3,R4 ;將存

32、儲(chǔ)器地址為;將存儲(chǔ)器地址為R4的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,R2 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,8 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,R2!;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新地址并將新地址R1R2寫(xiě)入寫(xiě)入R1。LDR R3,R1,8 ??;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并,并將新地址將新地址R18寫(xiě)入寫(xiě)入R1。零偏移:零

33、偏移: 如:如:LDR Rd,Rn前索引偏移前索引偏移: :如:如:LDR Rd,Rn,#0 x04!程序相對(duì)偏移程序相對(duì)偏移: :如:如:LDR Rd,labe1 后索引偏移后索引偏移: :如:如:LDR Rd,Rn,#0 x040 x55R3R4 0 x400000000 x123456780 x400000000 x40000000存儲(chǔ)器存儲(chǔ)器地址地址應(yīng)用示例:應(yīng)用示例:LDR R3,R4;將將R4指向地址的字?jǐn)?shù)據(jù)存入指向地址的字?jǐn)?shù)據(jù)存入R30 x123456783.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令LDR R3,R1,R2;將存

34、儲(chǔ)器地址為;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新,并將新地址地址R1R2寫(xiě)入寫(xiě)入R1。LDR R3,R1,R2,LSL3?。粚⒋鎯?chǔ)器地址為;將存儲(chǔ)器地址為R1R28的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新地址并將新地址R1R28寫(xiě)入寫(xiě)入R1。LDR R3,R1,R2,LSL3;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新,并將新地址地址R1R28寫(xiě)入寫(xiě)入R1。注:注:R15不可以作為偏移寄存器使用。不可以作為偏移寄存器使用。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(2)LDRB指令指令 格式為:格式為: LDR

35、條件條件B 目的寄存器,目的寄存器, LDRB指令是指令是字節(jié)加載指令字節(jié)加載指令,用于從存儲(chǔ)器中將,用于從存儲(chǔ)器中將一個(gè)一個(gè)8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時(shí)將寄位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高存器的高24位清零。位清零。該指令通常用于從存儲(chǔ)器中讀取該指令通常用于從存儲(chǔ)器中讀取8位的字節(jié)數(shù)據(jù)位的字節(jié)數(shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:LDRB R3,R1 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器的字節(jié)數(shù)據(jù)讀入寄存器R0,并,并將將R3的高的高24位清零。

36、位清零。LDRB R3,R1,8 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R18的字節(jié)數(shù)據(jù)讀入寄存器的字節(jié)數(shù)據(jù)讀入寄存器R3,并將并將R3的高的高24位清零。位清零。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(3)LDRH指令指令格式為:格式為:LDR條件條件H 目的寄存器,目的寄存器,LDRH指令是指令是無(wú)符號(hào)半字加載指令無(wú)符號(hào)半字加載指令,用于從存儲(chǔ),用于從存儲(chǔ)器中將一個(gè)器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將寄存器的高時(shí)將寄存器的高16位清零。該指令通常用于從存儲(chǔ)器位清零。該指令通常用于從存儲(chǔ)器中讀取中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)

37、據(jù)進(jìn)位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對(duì)數(shù)據(jù)進(jìn)行處理。行處理。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:LDRH R3,R1;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并將,并將R3的高的高16位清零。位清零。LDRH R3,R1,8 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R18的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并,并將將R3的高的高16位清零。位清零。LDRH R3,R1,R2 ;將存儲(chǔ)器地址為;將存儲(chǔ)器地址為R1R2的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并將并將R3的高的高16位清零。位清零。3.2.3 ARM 存儲(chǔ)

38、器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(4)STR指令指令格式為:格式為:STR條件條件 源寄存器,源寄存器, STR指令是指令是字存儲(chǔ)指令字存儲(chǔ)指令,用于從源寄,用于從源寄存器中將一個(gè)存器中將一個(gè)32位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器位的字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該指令在程序設(shè)計(jì)中比較常用,且尋中。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令址方式靈活多樣,使用方式可參考指令LDR。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:STRR3,R1,8;將;將R3中的字?jǐn)?shù)據(jù)寫(xiě)入以中的字?jǐn)?shù)據(jù)寫(xiě)入以R1為地址的存為地址的存儲(chǔ)器中,并將新地址儲(chǔ)器中,并將新地址R18寫(xiě)入寫(xiě)入R1。STRR

39、3,R1,8;將;將R3中的字?jǐn)?shù)據(jù)寫(xiě)入以中的字?jǐn)?shù)據(jù)寫(xiě)入以R18為地址的為地址的存儲(chǔ)器中。存儲(chǔ)器中。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(5)STRB指令指令格式為:格式為: STR條件條件B 源寄存器,源寄存器, STRB指令是指令是無(wú)符號(hào)字節(jié)存儲(chǔ)指令無(wú)符號(hào)字節(jié)存儲(chǔ)指令,用,用于從源寄存器中將一個(gè)于從源寄存器中將一個(gè)8位的字節(jié)數(shù)據(jù)傳位的字節(jié)數(shù)據(jù)傳送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中送到存儲(chǔ)器中。該字節(jié)數(shù)據(jù)為源寄存器中的低的低8位。位。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:STRB R3,R1 ;將寄存器;將寄存器R3中的字節(jié)數(shù)據(jù)寫(xiě)入以中的字節(jié)數(shù)據(jù)寫(xiě)入以

40、R1為地為地址的存儲(chǔ)器中。址的存儲(chǔ)器中。STRB R3,R1,8;將寄存器;將寄存器R3中的字節(jié)數(shù)據(jù)寫(xiě)入以中的字節(jié)數(shù)據(jù)寫(xiě)入以R18為為地址的存儲(chǔ)器中。地址的存儲(chǔ)器中。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(6)STRH指令指令格式為:格式為: STR條件條件H 源寄存器,源寄存器, STRH指令是指令是無(wú)符號(hào)半字存儲(chǔ)指令無(wú)符號(hào)半字存儲(chǔ)指令,用,用于從源寄存器中將一個(gè)于從源寄存器中將一個(gè)16位的半字?jǐn)?shù)據(jù)傳位的半字?jǐn)?shù)據(jù)傳送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中送到存儲(chǔ)器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低的低16位。位。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:STRH

41、R3,R1 ;將寄存器;將寄存器R3中的半字?jǐn)?shù)據(jù)寫(xiě)入以中的半字?jǐn)?shù)據(jù)寫(xiě)入以R1為地址的存儲(chǔ)器中。為地址的存儲(chǔ)器中。STRH R3,R1,8 ;將寄存器;將寄存器R3中的半字?jǐn)?shù)據(jù)寫(xiě)中的半字?jǐn)?shù)據(jù)寫(xiě)入以入以R18為地址的存儲(chǔ)器中。為地址的存儲(chǔ)器中。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令2批量數(shù)據(jù)加載批量數(shù)據(jù)加載/存儲(chǔ)指令存儲(chǔ)指令 ARM微處理器所支持批量數(shù)據(jù)加載微處理器所支持批量數(shù)據(jù)加載/存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單存儲(chǔ)指令可以一次在一片連續(xù)的存儲(chǔ)器單元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載元和多個(gè)寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)的存儲(chǔ)器中的數(shù)據(jù)傳指令用于將一片連續(xù)的存儲(chǔ)器

42、中的數(shù)據(jù)傳送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完送到多個(gè)寄存器,批量數(shù)據(jù)存儲(chǔ)指令則完成相反的操作。成相反的操作。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令常用的加載存儲(chǔ)指令如下:常用的加載存儲(chǔ)指令如下:LDM(或(或STM)指令)指令格式為:格式為:LDM(或(或STM)條件條件類型類型 基址寄存器基址寄存器!,寄,寄存器列表存器列表 LDM(或(或STM)指令用于從由基址寄存器所指示的一)指令用于從由基址寄存器所指示的一片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送片連續(xù)存儲(chǔ)器到寄存器列表所指示的多個(gè)寄存器之間傳送數(shù)據(jù),該指令的常見(jiàn)用途是將多個(gè)寄存器的內(nèi)容入棧或出數(shù)據(jù),該指令的常見(jiàn)用

43、途是將多個(gè)寄存器的內(nèi)容入?;虺鰲?。其中,棧。其中,類型類型為以下幾種情況:為以下幾種情況:3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令uIA 每次傳送后地址加每次傳送后地址加1,遞增方式;,遞增方式;uIB 每次傳送前地址加每次傳送前地址加1,遞增方式;,遞增方式;uDA 每次傳送后地址減每次傳送后地址減1,遞減方式;,遞減方式;uDB 每次傳送前地址減每次傳送前地址減1,遞減方式;,遞減方式;uFD 滿遞減堆棧;滿遞減堆棧;uED 空遞減堆棧;空遞減堆棧;uFA 滿遞增堆棧;滿遞增堆棧;uEA 空遞增堆棧;空遞增堆棧;3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令u!為可選后綴,若選用

44、該后綴,則當(dāng)數(shù)據(jù)傳送完畢為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫(xiě)入基址寄存器,否則基址寄存之后,將最后的地址寫(xiě)入基址寄存器,否則基址寄存器的內(nèi)容不改變。器的內(nèi)容不改變。u基址寄存器不允許為基址寄存器不允許為R15。u寄存器列表可以為寄存器列表可以為R0R15的任意組合,若使用連續(xù)的任意組合,若使用連續(xù)的寄存器時(shí),可以使用的寄存器時(shí),可以使用“-”表示省略。表示省略。u為可選后綴,這是一個(gè)只是在數(shù)據(jù)塊傳送中使用為可選后綴,這是一個(gè)只是在數(shù)據(jù)塊傳送中使用的后綴,當(dāng)指令為的后綴,當(dāng)指令為L(zhǎng)DM且寄存器列表中包含且寄存器列表中包含R15,選,選用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之

45、外,還將用該后綴時(shí)表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到復(fù)制到CPSR。同時(shí),該后綴還表示傳入或傳出。同時(shí),該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。器。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:STMFD R13!,R0,R4-R12,LR;將寄存器列表中的寄存器(;將寄存器列表中的寄存器(R0,R4到到R12,LR)存入堆棧。)存入堆棧。LDMFD R13!,R0,R4-R12,PC;將堆棧內(nèi)容恢復(fù)到寄存器(;將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到到R12,LR)。)。在通用存儲(chǔ)區(qū)

46、,數(shù)據(jù)存儲(chǔ)的方式和堆棧區(qū)相近。在通用存儲(chǔ)區(qū),數(shù)據(jù)存儲(chǔ)的方式和堆棧區(qū)相近。下面通過(guò)存儲(chǔ)下面通過(guò)存儲(chǔ)R1、R2和和R3 3個(gè)寄存器的個(gè)寄存器的4種后種后綴指令執(zhí)行前后的存儲(chǔ)情況如圖綴指令執(zhí)行前后的存儲(chǔ)情況如圖3-7所示。所示。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令3交換指令交換指令(1)SWP指令指令格式為:格式為: SWP條件條件 目的寄存器,源寄存器目的寄存器,源寄存器1,源源寄存器寄存器2 SWP指令是數(shù)據(jù)指令是數(shù)據(jù)字交換字交換指令,用于將源指令,用于將源寄存器寄存器2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時(shí)將源寄存器目的寄存器中,同時(shí)將源寄存

47、器1中的字?jǐn)?shù)中的字?jǐn)?shù)據(jù)傳送到源寄存器據(jù)傳送到源寄存器2所指向的存儲(chǔ)器中。顯所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器然,當(dāng)源寄存器1和目的寄存器為同一個(gè)寄和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:SWP R1,R2,R3 ;將;將R3所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)傳送到R1,同時(shí),同時(shí);將;將R2中的字?jǐn)?shù)據(jù)傳送到中的字?jǐn)?shù)據(jù)傳送到R3所指向的存儲(chǔ)單元。所指向的存儲(chǔ)單元。SWPEQ R1,R1,R2 ;Z=1時(shí),完成將時(shí),完成將R2所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)

48、與所指向的存儲(chǔ)器中的字?jǐn)?shù)據(jù)與;R1中的字?jǐn)?shù)據(jù)交換。中的字?jǐn)?shù)據(jù)交換。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令STMIBSTMIB R0 R0!,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,R3STMDA R0!,R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0STMDB R0!,R

49、1,R2,R3STMDB R0!,R1,R2,R3指令執(zhí)行前指令執(zhí)行前指令執(zhí)行后指令執(zhí)行后R0R0R3R3R2R2R1R1R0R0地址減地址減3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令(2)SWPB指令指令格式為:格式為:SWP條件條件B 目的寄存器,源寄存器目的寄存器,源寄存器1,源源寄存器寄存器2 SWPB指令是指令是字節(jié)交換指令字節(jié)交換指令,用于將,用于將源寄存器源寄存器2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高傳送到目的寄存器中,目的寄存器的高24清零,同時(shí)將源寄存器清零,同時(shí)將源寄存器1中的字節(jié)數(shù)據(jù)傳中的字節(jié)數(shù)據(jù)傳送到源寄存器送到源

50、寄存器2所指向的存儲(chǔ)器中。顯然,所指向的存儲(chǔ)器中。顯然,當(dāng)源寄存器當(dāng)源寄存器1和目的寄存器為同一個(gè)寄存和目的寄存器為同一個(gè)寄存器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。器時(shí),指令交換該寄存器和存儲(chǔ)器的內(nèi)容。3.2.3 ARM 存儲(chǔ)器訪問(wèn)指令存儲(chǔ)器訪問(wèn)指令指令示例:指令示例:SWPB R1,R2,R3;將;將R3所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)傳送到R1,R1的的高高24位清零,同時(shí)將位清零,同時(shí)將R2中的低中的低8位數(shù)據(jù)傳送到位數(shù)據(jù)傳送到R3所指所指向的存儲(chǔ)單元。向的存儲(chǔ)單元。SWPB R1,R1,R2;該指令完成將;該指令完成將R2所指向的存儲(chǔ)器中的字節(jié)數(shù)據(jù)與所指向的存

51、儲(chǔ)器中的字節(jié)數(shù)據(jù)與R1中的低中的低8位數(shù)據(jù)交換。位數(shù)據(jù)交換。3.2.4 ARM 數(shù)據(jù)處理類指令數(shù)據(jù)處理類指令u數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,不數(shù)據(jù)處理指令只能對(duì)寄存器的內(nèi)容進(jìn)行操作,不允許對(duì)存儲(chǔ)器中的數(shù)據(jù)進(jìn)行操作,也不允許指令允許對(duì)存儲(chǔ)器中的數(shù)據(jù)進(jìn)行操作,也不允許指令直接使用存儲(chǔ)器的數(shù)據(jù)或在寄存器與存儲(chǔ)器之間直接使用存儲(chǔ)器的數(shù)據(jù)或在寄存器與存儲(chǔ)器之間傳送數(shù)據(jù)。傳送數(shù)據(jù)。u數(shù)據(jù)處理指令可分為數(shù)據(jù)處理指令可分為3大類:大類:u數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令u算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令u比較指令比較指令3.2.4 ARM 數(shù)據(jù)處理類指令數(shù)據(jù)處理類指令u數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用于在寄存器和

52、存儲(chǔ)器之間進(jìn)行數(shù)用于在寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)的雙向傳輸。據(jù)的雙向傳輸。u算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯的運(yùn)算,完成常用的算術(shù)與邏輯的運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時(shí)更新同時(shí)更新CPSR中的相應(yīng)條件標(biāo)志位。中的相應(yīng)條件標(biāo)志位。u比較指令比較指令是完成對(duì)指定的兩個(gè)寄存器(或是完成對(duì)指定的兩個(gè)寄存器(或1個(gè)寄存?zhèn)€寄存器,器,1個(gè)立即數(shù))進(jìn)行比較,不保存運(yùn)算結(jié)果,只個(gè)立即數(shù))進(jìn)行比較,不保存運(yùn)算結(jié)果,只影響影響CPSR中相應(yīng)的條件標(biāo)志位。中相應(yīng)的條件標(biāo)志位。數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令1.數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令MOV

53、和和MVN(1)MOV指令指令 格式為:格式為: MOV條件條件S 目的寄存器,源操作數(shù)目的寄存器,源操作數(shù) MOV指令可完成在寄存器之間或寄存器與第指令可完成在寄存器之間或寄存器與第2操作數(shù)之間進(jìn)行數(shù)據(jù)傳送。操作數(shù)之間進(jìn)行數(shù)據(jù)傳送。 其中其中S選項(xiàng)決定指令的操作是否影響選項(xiàng)決定指令的操作是否影響CPSR中中條件標(biāo)志位的值,當(dāng)沒(méi)有條件標(biāo)志位的值,當(dāng)沒(méi)有S時(shí)指令不更新時(shí)指令不更新CPSR中中條件標(biāo)志位的值。條件標(biāo)志位的值。數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令指令示例:指令示例:MOVR4,R5;將寄存器;將寄存器R5的內(nèi)容傳送到寄存器的內(nèi)容傳送到寄存器R4MOVPC,R14;將寄存器;將寄存器R14的內(nèi)容傳

54、送到的內(nèi)容傳送到PC,常用于子,常用于子程序返回程序返回MOVNE R4,R5,LSL2;當(dāng);當(dāng)Z=0時(shí),將寄存器時(shí),將寄存器R5的內(nèi)容邏輯左移的內(nèi)容邏輯左移2位后傳送到位后傳送到R4數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令(2)MVN指令指令格式為:格式為:MVN條件條件S 目的寄存器,源操作數(shù)目的寄存器,源操作數(shù) MVN指令可完成在寄存器之間或寄存器指令可完成在寄存器之間或寄存器與第與第2操作數(shù)之間進(jìn)行數(shù)據(jù)非傳送。與操作數(shù)之間進(jìn)行數(shù)據(jù)非傳送。與MOV指指令不同之處是在傳送之前按位被取反了,即把令不同之處是在傳送之前按位被取反了,即把一個(gè)被取反的值傳送到目的寄存器中。一個(gè)被取反的值傳送到目的寄存器中。 其中

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

56、定指令的操作是否影響決定指令的操作是否影響CPSR中條件中條件標(biāo)志位的值,當(dāng)沒(méi)有標(biāo)志位的值,當(dāng)沒(méi)有S時(shí)指令不更新時(shí)指令不更新CPSR中條件中條件標(biāo)志位的值。標(biāo)志位的值。數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令指令示例:指令示例:MVN R0,0;將立即數(shù);將立即數(shù)0取反傳送到寄存器取反傳送到寄存器R0中,完成中,完成后后R0=-1 MVN R1,R2;將將R2取反,結(jié)果存到取反,結(jié)果存到R1算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令2.算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令(1)ADD指令指令格式為:格式為: ADD條件條件S 目的寄存器,操作數(shù)目的寄存器,操作數(shù)1,操作數(shù),操作數(shù)2 ADD指令是指令是加法指令加法指令,用于

57、把兩個(gè)操作數(shù)相加,用于把兩個(gè)操作數(shù)相加,并將結(jié)果存放到目的寄存器中。并將結(jié)果存放到目的寄存器中。u 操作數(shù)操作數(shù)1應(yīng)是一個(gè)寄存器。應(yīng)是一個(gè)寄存器。u操作數(shù)操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)一個(gè)立即數(shù) .算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令指令示例:指令示例:ADDS R0,R3,R4 ; R0 = R3 + R4,設(shè)置標(biāo)志位,設(shè)置標(biāo)志位ADDC R0,R3,#10 ; R0 = R3 + 10ADD R0,R2,R3,LSL#2 ; R0 = R2 + R34算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令(2)ADC指令指令格式為:格式為: ADC條件條件

58、S 目的寄存器,操作數(shù)目的寄存器,操作數(shù)1,操作數(shù),操作數(shù)2ADC指令是指令是帶進(jìn)位加法指令帶進(jìn)位加法指令,用于把兩個(gè)操作數(shù)相,用于把兩個(gè)操作數(shù)相加,再加上加,再加上CPSR中的中的C條件標(biāo)志位的值,并將結(jié)條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,果存放到目的寄存器中。它使用一個(gè)進(jìn)位標(biāo)志位,這樣就可以做比這樣就可以做比32位大的數(shù)的加法,注意不要忘位大的數(shù)的加法,注意不要忘記設(shè)置記設(shè)置S后綴來(lái)更改進(jìn)位標(biāo)志。后綴來(lái)更改進(jìn)位標(biāo)志。u操作數(shù)操作數(shù)1應(yīng)是一個(gè)寄存器。應(yīng)是一個(gè)寄存器。u操作數(shù)操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)

59、。一個(gè)立即數(shù)。算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令以下指令序列實(shí)現(xiàn)以下指令序列實(shí)現(xiàn)64位二進(jìn)制數(shù)的加法:位二進(jìn)制數(shù)的加法:R2、R1= R2、R1+ R4、R3ADDS R1,R1,R3 ;R1= R1+ R3ADC R2,R2,R4 ;R2= R2+ R4+C算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令(3)SUB指令指令格式為:格式為: SUB條件條件S 目的寄存器,操作數(shù)目的寄存器,操作數(shù)1,操作數(shù),操作數(shù)2 SUB指令是指令是減法指令減法指令,用于把操作數(shù),用于把操作數(shù)1減去操作減去操作數(shù)數(shù)2,并將結(jié)果存放到目的寄存器中。該指令可用,并將結(jié)果存放到目的寄存器中。該指令可用于有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的減法運(yùn)算

60、。于有符號(hào)數(shù)或無(wú)符號(hào)數(shù)的減法運(yùn)算。u操作數(shù)操作數(shù)1應(yīng)是一個(gè)寄存器。應(yīng)是一個(gè)寄存器。u操作數(shù)操作數(shù)2可以是一個(gè)寄存器,被移位的寄存器,或可以是一個(gè)寄存器,被移位的寄存器,或一個(gè)立即數(shù)。一個(gè)立即數(shù)。算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令指令示例:指令示例:SUBS R0,R3,R4 ; R0 = R3 R4,設(shè)置標(biāo)志位,設(shè)置標(biāo)志位SUB R0,R1,#0 x10 ; R0 = R1 - 0 x 10SUB R0,R2,R3,LSL#1 ; R0 = R2 - (R3 1)算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令(4) SBC指令指令格式為:格式為: SBC條件條件S 目的寄存器,操作數(shù)目的寄存器,操作數(shù)1,操作

溫馨提示

  • 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)論