版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、嵌入式系統(tǒng)原理及應(yīng)用嵌入式系統(tǒng)原理及應(yīng)用電子信息工程電子信息工程楊健楊健主講內(nèi)容主講內(nèi)容第第1章章 嵌入式系統(tǒng)概述嵌入式系統(tǒng)概述第第2章章 ARM微處理器概述與編程模型微處理器概述與編程模型第第3章章 ARM9指令系統(tǒng)指令系統(tǒng)第第4章章 嵌入式程序設(shè)計(jì)基礎(chǔ)嵌入式程序設(shè)計(jì)基礎(chǔ)第第5章章 嵌入式內(nèi)部可編程模塊嵌入式內(nèi)部可編程模塊第第6章章 嵌入式接口技術(shù)應(yīng)用嵌入式接口技術(shù)應(yīng)用第第7章章 軟件開發(fā)環(huán)境軟件開發(fā)環(huán)境第第3章章 ARM9指令系統(tǒng)指令系統(tǒng)uARM處理器的尋址方式處理器的尋址方式uARM指令集指令集 uThumb指令集指令集 3.1 ARM處理器的尋址方式處理器的尋址方式u尋址方式尋址方式是
2、處理器根據(jù)指令中給出的地址信息來尋是處理器根據(jù)指令中給出的地址信息來尋找物理地址的方式。找物理地址的方式。u目前目前ARM指令系統(tǒng)支持指令系統(tǒng)支持8種種尋址方式。尋址方式。l 寄存器尋址寄存器尋址l 立即尋址立即尋址l 寄存器間接尋址寄存器間接尋址l 變址尋址變址尋址l 寄存器移位尋址寄存器移位尋址 l 多寄存器尋址多寄存器尋址l 堆棧尋址堆棧尋址l 相對尋址相對尋址3.1.1 寄存器尋址寄存器尋址 寄存器尋址寄存器尋址就是利用寄存器中的內(nèi)容作為操作數(shù),就是利用寄存器中的內(nèi)容作為操作數(shù),寄存器本身就是操作數(shù)地址。這種尋址方式是各類微寄存器本身就是操作數(shù)地址。這種尋址方式是各類微處理器經(jīng)常采用的
3、一種方式,也是一種執(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ù)尋址,這是一種特殊的尋址方式,操作數(shù)沒有存儲在寄存器或存儲器中,而是包含在指操作數(shù)沒有存儲在寄存器或存儲器中,而是包含在指令的操作碼中,只要取出指令也就取到
4、了操作數(shù)。這令的操作碼中,只要取出指令也就取到了操作數(shù)。這個操作數(shù)被稱為立即數(shù),對應(yīng)的尋址方式也就叫做立個操作數(shù)被稱為立即數(shù),對應(yīng)的尋址方式也就叫做立即尋址。即尋址。例如指令:例如指令: MOV R0,#0 xFF000 ;將立即數(shù)將立即數(shù)0 xFF000裝入裝入R0寄存器寄存器 ADD R1,R1,0 x7f ; R1R10 x7f 在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要在以上兩條指令中,第二個源操作數(shù)即為立即數(shù),要求以求以“”為前綴,對于以十六進(jìn)制表示的立即數(shù),還要為前綴,對于以十六進(jìn)制表示的立即數(shù),還要求在求在“”后加上后加上“0 x”。 0 x55R0MOV R0,#0 xFF
5、00程序存儲程序存儲MOV R0,#0 xFF000 xFF00從代碼中獲得數(shù)據(jù)從代碼中獲得數(shù)據(jù)3.1.3 寄存器間接尋址寄存器間接尋址u寄存器間接尋址寄存器間接尋址就是以寄存器中的內(nèi)容作為操作數(shù)的就是以寄存器中的內(nèi)容作為操作數(shù)的地址,而操作數(shù)本身存放在存儲器中。例如指令地址,而操作數(shù)本身存放在存儲器中。例如指令 : LDRR1,R2;R1R2 STRR1,R2;R2R1 第一條指令將以第一條指令將以R2中的內(nèi)容為地址,將該地址中中的內(nèi)容為地址,將該地址中的數(shù)據(jù)傳送到的數(shù)據(jù)傳送到R1中。中。 第二條指令將第二條指令將R1中的內(nèi)容傳送到以中的內(nèi)容傳送到以R2中的內(nèi)容為中的內(nèi)容為地址的存儲器中。地
6、址的存儲器中。0 x55R1R2 0 x400000000 xAA0 x40000000LDR R1,R20 xAA3.1.4 變址尋址變址尋址u變址尋址變址尋址就是將寄存器(該寄存器一般稱作基址寄存就是將寄存器(該寄存器一般稱作基址寄存器)的內(nèi)容與指令中給出的地址偏移量相加,從而得器)的內(nèi)容與指令中給出的地址偏移量相加,從而得到一個操作數(shù)的有效地址。變址尋址方式常用于訪問到一個操作數(shù)的有效地址。變址尋址方式常用于訪問某基地址附近的地址單元。某基地址附近的地址單元。例如指令:例如指令: LDR R0,R1,8 ;R0R18LDR R0,R1,8! ;R0R18,R1R18LDR R0,R1,2
7、 ;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)移位而得到;移位的方式在指令中以助記符的形式給出,而移位的位數(shù)可用立即數(shù)指令中以助記符的形式給出,而移位的位數(shù)可用立即數(shù)或寄存器尋址方式表示。或寄存器尋址方式表示。
8、uARM微處理器內(nèi)嵌的微處理器內(nèi)嵌的桶型移位器桶型移位器(Barrel Shifter),),移位操作在移位操作在ARM指令集中不作為單獨(dú)的指令使用,它指令集中不作為單獨(dú)的指令使用,它只能作為指令格式中的一個字段,在匯編語言中表示為只能作為指令格式中的一個字段,在匯編語言中表示為指令中的選項(xiàng)。指令中的選項(xiàng)。例如,數(shù)據(jù)處理指令的第例如,數(shù)據(jù)處理指令的第2個操作數(shù)為寄存器時,個操作數(shù)為寄存器時,就可以加入移位操作選項(xiàng)對它進(jìn)行各種移位操作。移位就可以加入移位操作選項(xiàng)對它進(jìn)行各種移位操作。移位操作包括如下操作包括如下6種類型種類型.3.1.5 寄存器移位尋址寄存器移位尋址uLSL(或(或ASL)操作操
9、作 格式為:格式為: 通用寄存器,通用寄存器,LSL(或(或ASL) 操作數(shù)操作數(shù) LSL(或(或ASL)可完成對通用寄存器中的內(nèi)容進(jìn))可完成對通用寄存器中的內(nèi)容進(jìn)行行邏輯(或算術(shù))的左移邏輯(或算術(shù))的左移操作,按操作數(shù)所指定的數(shù)操作,按操作數(shù)所指定的數(shù)量向左移位,低位用零來填充,最后一個左移出的位量向左移位,低位用零來填充,最后一個左移出的位放在狀態(tài)寄存器的放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-1所示。所示。其中,操作數(shù)可以是通用寄存器,也可以是立即其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(數(shù)(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:
10、MOV R0, R1, LSL#4;將;將R1中的內(nèi)容左移中的內(nèi)容左移4位后傳送到位后傳送到R0中,中,;其中把最后移出的位賦給程序狀態(tài)寄存器的;其中把最后移出的位賦給程序狀態(tài)寄存器的C位位CPSR29。31C30291000uLSR操作操作格式為:格式為: 通用寄存器,通用寄存器,LSR 操作數(shù)操作數(shù) LSR可完成對通用寄存器中的內(nèi)容進(jìn)行可完成對通用寄存器中的內(nèi)容進(jìn)行右移右移的操作,的操作,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充,按操作數(shù)所指定的數(shù)量向右移位,左端用零來填充,最后一個右移出的位放在狀態(tài)寄存器的最后一個右移出的位放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-2所示
11、。其中,操作數(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.5 寄存器移位尋址寄存器移位尋址uROR操作操作格式為:格式為: 通用寄存器,通用寄存器,ROR 操作數(shù)操作數(shù) ROR可完成對通用寄存器中的內(nèi)容進(jìn)
12、行可完成對通用寄存器中的內(nèi)容進(jìn)行循環(huán)右移循環(huán)右移的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,右端的操作,按操作數(shù)所指定的數(shù)量向右循環(huán)移位,右端移出的位填充在左側(cè)的空位處,最后一個右移出的位移出的位填充在左側(cè)的空位處,最后一個右移出的位同時也放在狀態(tài)寄存器的同時也放在狀態(tài)寄存器的C位位CPSR29中,如圖中,如圖3-3所示。其中,操作數(shù)可以是通用寄存器,也可以是立所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(即數(shù)(031)。)。u操作示例:操作示例:MOV R0, R1, ROR#4;將;將R1中的內(nèi)容循環(huán)右移中的內(nèi)容循環(huán)右移4位后傳送到位后傳送到R0中,中,;其中把最后移出的位賦給程序狀態(tài)
13、寄存器的;其中把最后移出的位賦給程序狀態(tài)寄存器的C位位CPSR29。 3131C C303029291 10 03.1.5 寄存器移位尋址寄存器移位尋址uASRASR操作操作格式為:格式為: 通用寄存器,通用寄存器,ASR 操作數(shù)操作數(shù) ASR可完成對通用寄存器中的內(nèi)容進(jìn)行可完成對通用寄存器中的內(nèi)容進(jìn)行右移右移的操作,的操作,按操作數(shù)所指定的數(shù)量向右移位,最左端的位保持不按操作數(shù)所指定的數(shù)量向右移位,最左端的位保持不變,最后一個右移出的位放在狀態(tài)寄存器的變,最后一個右移出的位放在狀態(tài)寄存器的C位位CPSR29 ,如圖,如圖3-4所示。其中,操作數(shù)可以是通用所示。其中,操作數(shù)可以是通用寄存器,也
14、可以是立即數(shù)(寄存器,也可以是立即數(shù)(031)。)。 這種移位對有符號數(shù)據(jù)使用時可以保持符號位不變。這種移位對有符號數(shù)據(jù)使用時可以保持符號位不變。3.1.5 寄存器移位尋址寄存器移位尋址3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, ASR#4;將;將R1中的內(nèi)容右移中的內(nèi)容右移4位后傳送到位后傳送到R0中,符號位保持不中,符號位保持不變。變。;最后移出的位同時也送入狀態(tài)位;最后移出的位同時也送入狀態(tài)位C中。中。3131C C303029291 10 0uRRX操作操作RRX操作的格式為:操作的格式為: 通用寄存器,通用寄存器,RRX 操作數(shù)操作數(shù) RRX
15、可完成對通用寄存器中的內(nèi)容進(jìn)行可完成對通用寄存器中的內(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位來填充,右側(cè)移出的位來填充,右側(cè)移出的位移進(jìn)狀態(tài)位位移進(jìn)狀態(tài)位C中,如圖中,如圖3-5所示。其中,操作數(shù)可以所示。其中,操作數(shù)可以是通用寄存器,也可以是立即數(shù)(是通用寄存器,也可以是立即數(shù)(031)。)。3.1.5 寄存器移位尋址寄存器移位尋址u操作示例:操作示例:MOV R0, R1, RRX#2;將;將R1中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移兩位后傳送中的內(nèi)容進(jìn)行帶擴(kuò)展的循環(huán)右移兩
16、位后傳送到到R0中。中。3131C C303029291 10 03.1.5 寄存器移位尋址寄存器移位尋址u采用采用多寄存器尋址方式多寄存器尋址方式,一條指令可以完成多個寄存,一條指令可以完成多個寄存器值的傳送。這種尋址方式可以一次對多個寄存器尋器值的傳送。這種尋址方式可以一次對多個寄存器尋址,多個寄存器由小到大排列,最多可傳送址,多個寄存器由小到大排列,最多可傳送16個寄存?zhèn)€寄存器。器。 例如例如: LDMIA R1!,R2-R4,R5 ;R2R1 ;R3R14 ;R4R18 ;R5R112 該指令的后綴該指令的后綴IA表示在每次執(zhí)行完加載表示在每次執(zhí)行完加載/存儲操作存儲操作后,后,R1按
17、字長度增加,因此,指令可將連續(xù)存儲單按字長度增加,因此,指令可將連續(xù)存儲單元的值傳送到元的值傳送到R2R5。3.1.6 多寄存器尋址多寄存器尋址 使用多寄存器尋址指令時,使用多寄存器尋址指令時,寄存器子集的順序是按由小到寄存器子集的順序是按由小到大的順序排列,連續(xù)的寄存器大的順序排列,連續(xù)的寄存器可用可用“”連接;否則用連接;否則用“,”分隔書寫。分隔書寫。0 x40000000R1R20 x?0 x010 x400000000 x?R3R40 x?R50 x?0 x020 x030 x040 x400000040 x400000080 x4000000C存儲器存儲器LDMIA R1!,R2-
18、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)的方式工作,使用一個稱作堆棧指針的)的方式工作,使用一個稱作堆棧指針的專用寄存器指示當(dāng)前的操作位置,堆棧指針總是指向?qū)S眉拇嫫髦甘井?dāng)前的操作位置,堆棧指針總是指向棧頂。棧頂。u當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為當(dāng)堆棧指針指向最后壓入堆棧的數(shù)據(jù)時,稱為滿堆棧滿堆棧(Full Stack);而當(dāng)堆棧指針指向下一個將要放入數(shù)而當(dāng)堆棧指針指向下一個將要放入數(shù)據(jù)的空位置時,稱為據(jù)的空位置
19、時,稱為空堆??斩褩#‥mpty Stack)。)。u同時,根據(jù)堆棧的生成方式,又可以分為遞增堆棧同時,根據(jù)堆棧的生成方式,又可以分為遞增堆棧(Ascending Stack)和遞減堆棧()和遞減堆棧(Decending Stack),當(dāng)堆棧由低地址向高地址生成時,稱為),當(dāng)堆棧由低地址向高地址生成時,稱為遞遞增堆棧增堆棧,當(dāng)堆棧由高地址向低地址生成時,稱為,當(dāng)堆棧由高地址向低地址生成時,稱為遞減遞減堆棧堆棧。棧頂棧頂SP棧頂棧頂SP棧底棧底空堆??斩褩5讞5诐M堆棧滿堆棧0 x123456780 x12345678棧頂棧頂SP0 x12345678棧頂棧頂SP壓棧壓棧壓棧壓棧3.1.7 堆棧
20、尋址堆棧尋址uARM微處理器支持這微處理器支持這四種類型的堆棧工作方式四種類型的堆棧工作方式,即:,即:u滿遞增方式滿遞增方式FA(Full Ascending):堆棧指針指向最):堆棧指針指向最后入棧的數(shù)據(jù)位置,且由低地址向高地址生成。后入棧的數(shù)據(jù)位置,且由低地址向高地址生成。u滿遞減方式滿遞減方式FD(Full Decending):堆棧指針指向最):堆棧指針指向最后入棧的數(shù)據(jù)位置,且由高地址向低地址生成。后入棧的數(shù)據(jù)位置,且由高地址向低地址生成。u空遞增方式空遞增方式EA(Empty Ascending):堆棧指針指向):堆棧指針指向下一個入棧數(shù)據(jù)的空位置,且由低地址向高地址生成。下一個
21、入棧數(shù)據(jù)的空位置,且由低地址向高地址生成。u空遞減方式空遞減方式ED(Empty Decending):堆棧指針指向):堆棧指針指向下一個入棧數(shù)據(jù)的空位置,且由高地址向低地址生成。下一個入棧數(shù)據(jù)的空位置,且由高地址向低地址生成。3.1.8 相對尋址相對尋址 u與基址變址尋址方式相類似,與基址變址尋址方式相類似,相對尋址相對尋址以程序計(jì)數(shù)器以程序計(jì)數(shù)器PC的當(dāng)前值為基地址,指令中的地址標(biāo)號作為偏移的當(dāng)前值為基地址,指令中的地址標(biāo)號作為偏移量,將兩者相加之后得到操作數(shù)的有效地址。以下程量,將兩者相加之后得到操作數(shù)的有效地址。以下程序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)指令序段完成子程序的調(diào)用和返回,跳轉(zhuǎn)
22、指令BL采用了采用了相對尋址方式:相對尋址方式: BL NEXT;跳轉(zhuǎn)到子程序;跳轉(zhuǎn)到子程序NEXT處執(zhí)行處執(zhí)行 NEXT MOVPC,LR;從子程序返回;從子程序返回3.2 ARM指令集指令集uARM微處理器的指令集是加載微處理器的指令集是加載/存儲型的存儲型的.u即指令集僅能處理寄存器中的數(shù)據(jù),處理結(jié)果仍要放即指令集僅能處理寄存器中的數(shù)據(jù),處理結(jié)果仍要放回寄存器中,而對回寄存器中,而對系統(tǒng)存儲器的訪問則需要通過專門系統(tǒng)存儲器的訪問則需要通過專門的加載的加載/存儲指令來完成存儲指令來完成。uARM9指令集,包括指令集,包括ARM指令集指令集Thumb指令集。指令集。u首先介紹首先介紹ARM指
23、令的基本格式及靈活的操作數(shù),然指令的基本格式及靈活的操作數(shù),然后介紹條件碼,再把后介紹條件碼,再把ARM指令集、指令集、Thumb指令集按類指令集按類分別說明。分別說明。ARM指令的基本格式如下: S , 其中其中號內(nèi)的項(xiàng)是必須的,號內(nèi)的項(xiàng)是必須的,號內(nèi)的項(xiàng)是可選的。號內(nèi)的項(xiàng)是可選的。各項(xiàng)的說明如下:各項(xiàng)的說明如下:opcode:指令助記符;:指令助記符;cond:執(zhí)行條件;:執(zhí)行條件;S:是否影響:是否影響CPSR寄存器的值;寄存器的值;Rd:目標(biāo)寄存器;:目標(biāo)寄存器;Rn:第:第1個操作數(shù)的寄存器;個操作數(shù)的寄存器;op2:第:第2個操作數(shù);個操作數(shù);3.2.1 指令格式指令格式 ARM指
24、令的基本格式如下:指令的基本格式如下:3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數(shù)個操作數(shù) 靈活的使用第靈活的使用第2個操作數(shù)個操作數(shù)“op2”能夠提高能夠提高代碼效率。它有如下的形式:代碼效率。它有如下的形式:#immed_8r常數(shù)表達(dá)式;常數(shù)表達(dá)式;Rm寄存器方式;寄存器方式;Rm,shift寄存器移位方式;寄存器移位方式; S , 3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數(shù)個操作數(shù)#immed_8r#immed_8r常數(shù)表達(dá)式常數(shù)表達(dá)式 該常數(shù)必須對應(yīng)該常數(shù)必須對應(yīng)8 8位位圖,即必須是一位位圖,即必須是一個個8 8位的常位的常數(shù)通過循環(huán)右移偶數(shù)位可
25、以得到的數(shù)數(shù)通過循環(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 指令集介紹指令集介紹uARM指令集指令集第第2個操作數(shù)個操作數(shù)#immed_8r常數(shù)表達(dá)式 該常數(shù)必須對應(yīng)8位位圖,即必須是一個8位的常數(shù)通過循環(huán)右移
26、偶數(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.請列舉2個8位圖立即數(shù)? 思考與練習(xí)?1.以下以下8位圖立即數(shù)是否合法?位圖立即數(shù)是否合法?0 x0103C0000 x0103C0000 x128000000 x128000000 x4000003B(0 xED循環(huán)右移2位)0 x0016C000(0 x5B循環(huán)右移18位)3.2 指令集介紹指令集介紹uARM指令集指令集第第2個操作數(shù)個操作數(shù)RmRm寄存器方式寄存器方式 在寄
27、存器方式下,操作數(shù)即為寄存器的數(shù)值。在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:例如:SUBR1,R1,R2MOVPC,R03.2.2 條件碼條件碼u當(dāng)處理器工作在當(dāng)處理器工作在ARM狀態(tài)時,幾乎所有的指令均根狀態(tài)時,幾乎所有的指令均根據(jù)據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行條件滿足時,指令被執(zhí)行,否則指行。當(dāng)指令的執(zhí)行條件滿足時,指令被執(zhí)行,否則指令被忽略。令被忽略。u每一條每一條ARM指令包含指令包含4位的條件碼位的條件碼,位于指令的最高,位于指令的最高4位位31:28。條件碼共有。條件碼共有16種,每種條件碼可用兩個種,每
28、種條件碼可用兩個字符表示,這兩個字符可以添加在指令助記符的后面字符表示,這兩個字符可以添加在指令助記符的后面和指令同時使用。例如,跳轉(zhuǎn)指令和指令同時使用。例如,跳轉(zhuǎn)指令B可以加上后綴可以加上后綴EQ變?yōu)樽優(yōu)锽EQ表示表示“相等則跳轉(zhuǎn)相等則跳轉(zhuǎn)”,即當(dāng),即當(dāng)CPSR中的中的Z標(biāo)標(biāo)志置位時發(fā)生跳轉(zhuǎn)。志置位時發(fā)生跳轉(zhuǎn)。u在在16種條件標(biāo)志碼中,只有種條件標(biāo)志碼中,只有15種可以使用。種可以使用。3.2.2 條件碼條件碼條件碼條件碼助記符后綴助記符后綴標(biāo)標(biāo) 志志含含 義義0000EQZ置位置位相等相等0001NEZ清零清零不相等不相等0010CSC置位置位無符號數(shù)大于或等于無符號數(shù)大于或等于0011C
29、CC清零清零無符號數(shù)小于無符號數(shù)小于0100MIN置位置位負(fù)數(shù)負(fù)數(shù)0101PLN清零清零正數(shù)或零正數(shù)或零0110VSV置位置位溢出溢出0111VCV清零清零未溢出未溢出1000HIC置位置位Z清零清零無符號數(shù)大于無符號數(shù)大于1001LSC清零清零Z置位置位無符號數(shù)小于或等于無符號數(shù)小于或等于1010GEN等于等于V帶符號數(shù)大于或等于帶符號數(shù)大于或等于1011LTN不等于不等于V帶符號數(shù)小于帶符號數(shù)小于1100GTZ清零且(清零且(N等于等于V)帶符號數(shù)大于帶符號數(shù)大于1101LEZ置位或(置位或(N不等于不等于V)帶符號數(shù)小于或等于帶符號數(shù)小于或等于1110AL忽略忽略無條件執(zhí)行無條件執(zhí)行C代
30、碼:代碼:if(a b) a+;else b+;對應(yīng)的匯編代碼:對應(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 存儲器訪問指令存儲器訪問指令uARM微處理器內(nèi)部沒有微處理器內(nèi)部沒有RAM,而,而ARM除了寄存器除了寄存器(即(即R0R15)外沒有別的存儲單元;在以)外沒有別的存儲單元;在以ARM為核為核的嵌入式系統(tǒng)中,所有的外圍模塊都和存儲單元一樣,的嵌入式系統(tǒng)中,所有的外圍模塊都和存儲單元一樣,是是AR
31、M微處理器的不同的地址單元。不管這些模塊微處理器的不同的地址單元。不管這些模塊的功能如何(如輸入的功能如何(如輸入/輸出、定時器、存儲器等),輸出、定時器、存儲器等),也不管這些模塊的位置如何(如片內(nèi)或片外),也不管這些模塊的位置如何(如片內(nèi)或片外),ARM微處理器都把它們看作是外部存儲器。其操作微處理器都把它們看作是外部存儲器。其操作過程和對存儲器的操作是相同的。過程和對存儲器的操作是相同的。3.2.3 ARM 存儲器訪問指令存儲器訪問指令u因此,在因此,在ARM微處理器的數(shù)據(jù)傳送中,微處理器的數(shù)據(jù)傳送中,數(shù)據(jù)的源和數(shù)據(jù)數(shù)據(jù)的源和數(shù)據(jù)的目標(biāo)的目標(biāo)只有兩種:一種是只有兩種:一種是ARM的寄存器
32、的寄存器R0R15;另一種;另一種就是外部存儲器就是外部存儲器(它們可能是外圍模塊的寄存器、外部數(shù)(它們可能是外圍模塊的寄存器、外部數(shù)據(jù)存儲器或可訪問的程序存儲器等)。據(jù)存儲器或可訪問的程序存儲器等)。u我們把數(shù)據(jù)從存儲器到寄存器的傳送我們把數(shù)據(jù)從存儲器到寄存器的傳送叫加載,叫加載,數(shù)據(jù)從寄存數(shù)據(jù)從寄存器到存儲器的傳送器到存儲器的傳送叫存儲。叫存儲。存儲器存儲器寄存器(寄存器(R0-R15R0-R15)ARMARM微處理器微處理器外圍模塊或芯片外圍模塊或芯片存儲存儲加載加載加載指令:存儲指令:存儲器源地址源地址目標(biāo)寄存器目標(biāo)寄存器存儲器目標(biāo)地址目標(biāo)地址源寄存器源寄存器3.2.3 ARM 存儲器
33、訪問指令存儲器訪問指令3.2.3 ARM 存儲器訪問指令存儲器訪問指令u加載加載/存儲指令可分為存儲指令可分為3類:類:u單一數(shù)據(jù)加載單一數(shù)據(jù)加載/存儲指令存儲指令u批量數(shù)據(jù)加載批量數(shù)據(jù)加載/存儲指令存儲指令u數(shù)據(jù)交換指令數(shù)據(jù)交換指令3.2.3 ARM 存儲器訪問指令存儲器訪問指令1單一數(shù)據(jù)加載單一數(shù)據(jù)加載/存儲指令存儲指令(1)LDR指令指令格式為:格式為:LDR條件條件 目的寄存器,目的寄存器, LDR指令是指令是字加載指令字加載指令,用于從存儲器中將,用于從存儲器中將一個一個32位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。位的字?jǐn)?shù)據(jù)傳送到目的寄存器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令u
34、指令示例:指令示例:LDR R3,R4 ;將存儲器地址為;將存儲器地址為R4的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,R2 ;將存儲器地址為;將存儲器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,8 ;將存儲器地址為;將存儲器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3。LDR R3,R1,R2?。粚⒋鎯ζ鞯刂窞?;將存儲器地址為R1+R2的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新地址,并將新地址R1R2寫入寫入R1。LDR R3,R1,8 !;將存儲器地址為;將存儲器地址為R1+8的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將
35、新地址,并將新地址R18寫入寫入R1。零偏移:零偏移: 如:如:LDR Rd,Rn前索引偏移前索引偏移: :如:如:LDR Rd,Rn,#0 x04!程序相對偏移程序相對偏移: :如:如:LDR Rd,labe1 后索引偏移后索引偏移: :如:如:LDR Rd,Rn,#0 x040 x55R3R4 0 x400000000 x123456780 x400000000 x40000000存儲器存儲器地址地址應(yīng)用示例:應(yīng)用示例:LDR R3,R4;將將R4指向地址的字?jǐn)?shù)據(jù)存入指向地址的字?jǐn)?shù)據(jù)存入R30 x123456783.2.3 ARM 存儲器訪問指令存儲器訪問指令3.2.3 ARM 存儲器訪問
36、指令存儲器訪問指令LDR R3,R1,R2;將存儲器地址為;將存儲器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新,并將新地址地址R1R2寫入寫入R1。LDR R3,R1,R2,LSL3!;將存儲器地址為;將存儲器地址為R1R28的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新地址并將新地址R1R28寫入寫入R1。LDR R3,R1,R2,LSL3;將存儲器地址為;將存儲器地址為R1的字?jǐn)?shù)據(jù)讀入寄存器的字?jǐn)?shù)據(jù)讀入寄存器R3,并將新,并將新地址地址R1R28寫入寫入R1。注:注:R15不可以作為偏移寄存器使用。不可以作為偏移寄存器使用。3.2.3 ARM 存儲器訪問指令存儲器訪問指令
37、(2)LDRB指令指令 格式為:格式為: LDR條件條件B 目的寄存器,目的寄存器, LDRB指令是指令是字節(jié)加載指令字節(jié)加載指令,用于從存儲器中將,用于從存儲器中將一個一個8位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄位的字節(jié)數(shù)據(jù)傳送到目的寄存器中,同時將寄存器的高存器的高24位清零。位清零。該指令通常用于從存儲器中讀取該指令通常用于從存儲器中讀取8位的字節(jié)數(shù)據(jù)位的字節(jié)數(shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:LDRB R3,R1 ;將存儲器地址為;將存儲器地址為R1的字節(jié)數(shù)據(jù)讀入寄存器的字節(jié)數(shù)據(jù)讀
38、入寄存器R0,并,并將將R3的高的高24位清零。位清零。LDRB R3,R1,8 ;將存儲器地址為;將存儲器地址為R18的字節(jié)數(shù)據(jù)讀入寄存器的字節(jié)數(shù)據(jù)讀入寄存器R3,并將并將R3的高的高24位清零。位清零。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(3)LDRH指令指令格式為:格式為:LDR條件條件H 目的寄存器,目的寄存器,LDRH指令是指令是無符號半字加載指令無符號半字加載指令,用于從存儲,用于從存儲器中將一個器中將一個16位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同位的半字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將寄存器的高時將寄存器的高16位清零。該指令通常用于從存儲器位清零。該指令通常用于從存儲器中
39、讀取中讀取16位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)位的半字?jǐn)?shù)據(jù)到通用寄存器,然后對數(shù)據(jù)進(jìn)行處理。行處理。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:LDRH R3,R1;將存儲器地址為;將存儲器地址為R1的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并將,并將R3的高的高16位清零。位清零。LDRH R3,R1,8 ;將存儲器地址為;將存儲器地址為R18的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并,并將將R3的高的高16位清零。位清零。LDRH R3,R1,R2 ;將存儲器地址為;將存儲器地址為R1R2的半字?jǐn)?shù)據(jù)讀入寄存器的半字?jǐn)?shù)據(jù)讀入寄存器R3,并將并將R3的高
40、的高16位清零。位清零。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(4)STR指令指令格式為:格式為:STR條件條件 源寄存器,源寄存器, STR指令是指令是字存儲指令字存儲指令,用于從源寄存器中將,用于從源寄存器中將一個一個32位的字?jǐn)?shù)據(jù)傳送到存儲器中。該指令在程位的字?jǐn)?shù)據(jù)傳送到存儲器中。該指令在程序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用序設(shè)計(jì)中比較常用,且尋址方式靈活多樣,使用方式可參考指令方式可參考指令LDR。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STRR3,R1,8;將;將R3中的字?jǐn)?shù)據(jù)寫入以中的字?jǐn)?shù)據(jù)寫入以R1為地址的存儲器中,為地址的存儲器中,
41、并將新地址并將新地址R18寫入寫入R1。STRR3,R1,8;將;將R3中的字?jǐn)?shù)據(jù)寫入以中的字?jǐn)?shù)據(jù)寫入以R18為地址的存儲器為地址的存儲器中。中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(5)STRB指令指令格式為:格式為: STR條件條件B 源寄存器,源寄存器, STRB指令是指令是無符號字節(jié)存儲指令無符號字節(jié)存儲指令,用于從源,用于從源寄存器中將一個寄存器中將一個8位的字節(jié)數(shù)據(jù)傳送到存儲器中。位的字節(jié)數(shù)據(jù)傳送到存儲器中。該字節(jié)數(shù)據(jù)為源寄存器中的低該字節(jié)數(shù)據(jù)為源寄存器中的低8位。位。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STRB R3,R1 ;將寄存器;
42、將寄存器R3中的字節(jié)數(shù)據(jù)寫入以中的字節(jié)數(shù)據(jù)寫入以R1為地址的存為地址的存儲器中。儲器中。STRB R3,R1,8;將寄存器;將寄存器R3中的字節(jié)數(shù)據(jù)寫入以中的字節(jié)數(shù)據(jù)寫入以R18為地址的為地址的存儲器中。存儲器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(6)STRH指令指令格式為:格式為: STR條件條件H 源寄存器,源寄存器, STRH指令是指令是無符號半字存儲指令無符號半字存儲指令,用于從源,用于從源寄存器中將一個寄存器中將一個16位的半字?jǐn)?shù)據(jù)傳送到存儲器中。位的半字?jǐn)?shù)據(jù)傳送到存儲器中。該半字?jǐn)?shù)據(jù)為源寄存器中的低該半字?jǐn)?shù)據(jù)為源寄存器中的低16位。位。3.2.3 ARM 存儲器訪問
43、指令存儲器訪問指令指令示例:指令示例:STRH R3,R1 ;將寄存器;將寄存器R3中的半字?jǐn)?shù)據(jù)寫入以中的半字?jǐn)?shù)據(jù)寫入以R1為地址的存儲器中。為地址的存儲器中。STRH R3,R1,8 ;將寄存器;將寄存器R3中的半字?jǐn)?shù)據(jù)寫中的半字?jǐn)?shù)據(jù)寫入以入以R18為地址的存儲器中。為地址的存儲器中。3.2.3 ARM 存儲器訪問指令存儲器訪問指令2批量數(shù)據(jù)加載批量數(shù)據(jù)加載/存儲指令存儲指令 ARM微處理器所支持批量數(shù)據(jù)加載微處理器所支持批量數(shù)據(jù)加載/存儲指存儲指令可以一次在一片連續(xù)的存儲器單元和多個寄存令可以一次在一片連續(xù)的存儲器單元和多個寄存器之間傳送數(shù)據(jù),批量加載指令用于將一片連續(xù)器之間傳送數(shù)據(jù),批量
44、加載指令用于將一片連續(xù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)的存儲器中的數(shù)據(jù)傳送到多個寄存器,批量數(shù)據(jù)存儲指令則完成相反的操作。存儲指令則完成相反的操作。3.2.3 ARM 存儲器訪問指令存儲器訪問指令常用的加載存儲指令如下:常用的加載存儲指令如下:LDM(或(或STM)指令)指令格式為:格式為:LDM(或(或STM)條件條件類型類型 基址寄存器基址寄存器!,寄存器列表,寄存器列表 LDM(或(或STM)指令用于從由基址寄存器所指示的一)指令用于從由基址寄存器所指示的一片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送片連續(xù)存儲器到寄存器列表所指示的多個寄存器之間傳送數(shù)據(jù),該指令的常見用途
45、是將多個寄存器的內(nèi)容入?;虺鰯?shù)據(jù),該指令的常見用途是將多個寄存器的內(nèi)容入?;虺鰲!F渲?,棧。其中,類型類型為以下幾種情況:為以下幾種情況:3.2.3 ARM 存儲器訪問指令存儲器訪問指令uIA 每次傳送后地址加每次傳送后地址加1,遞增方式;,遞增方式;uIB 每次傳送前地址加每次傳送前地址加1,遞增方式;,遞增方式;uDA 每次傳送后地址減每次傳送后地址減1,遞減方式;,遞減方式;uDB 每次傳送前地址減每次傳送前地址減1,遞減方式;,遞減方式;uFD 滿遞減堆棧;滿遞減堆棧;uED 空遞減堆棧;空遞減堆棧;uFA 滿遞增堆棧;滿遞增堆棧;uEA 空遞增堆棧;空遞增堆棧;3.2.3 ARM 存
46、儲器訪問指令存儲器訪問指令u!為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢為可選后綴,若選用該后綴,則當(dāng)數(shù)據(jù)傳送完畢之后,將最后的地址寫入基址寄存器,否則基址寄存之后,將最后的地址寫入基址寄存器,否則基址寄存器的內(nèi)容不改變。器的內(nèi)容不改變。u基址寄存器不允許為基址寄存器不允許為R15。u寄存器列表可以為寄存器列表可以為R0R15的任意組合,若使用連續(xù)的任意組合,若使用連續(xù)的寄存器時,可以使用的寄存器時,可以使用“-”表示省略。表示省略。u為可選后綴,這是一個只是在數(shù)據(jù)塊傳送中使用為可選后綴,這是一個只是在數(shù)據(jù)塊傳送中使用的后綴,當(dāng)指令為的后綴,當(dāng)指令為LDM且寄存器列表中包含且寄存器列表中包含R
47、15,選,選用該后綴時表示:除了正常的數(shù)據(jù)傳送之外,還將用該后綴時表示:除了正常的數(shù)據(jù)傳送之外,還將SPSR復(fù)制到復(fù)制到CPSR。同時,該后綴還表示傳入或傳出。同時,該后綴還表示傳入或傳出的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存的是用戶模式下的寄存器,而不是當(dāng)前模式下的寄存器。器。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:STMFD R13!,R0,R4-R12,LR;將寄存器列表中的寄存器(;將寄存器列表中的寄存器(R0,R4到到R12,LR)存入堆)存入堆棧。棧。LDMFD R13!,R0,R4-R12,PC;將堆棧內(nèi)容恢復(fù)到寄存器(;將堆棧內(nèi)容恢復(fù)到寄存器
48、(R0,R4到到R12,LR)。)。在通用存儲區(qū),數(shù)據(jù)存儲的方式和堆棧區(qū)相近。下面通過存在通用存儲區(qū),數(shù)據(jù)存儲的方式和堆棧區(qū)相近。下面通過存儲儲R1、R2和和R3 3個寄存器的個寄存器的4種后綴指令執(zhí)行前后的存儲種后綴指令執(zhí)行前后的存儲情況如圖情況如圖3-7所示。所示。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í)行后R0R0R3R3R2R2
49、R1R1R0R0地址增地址增STMDA R0!,R1,R2,R3STMDA 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 存儲器訪問指令存儲器訪問指令3交換指令交換指令(1)SWP指令指令格式為:格式為: SWP條件條件 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWP指令是數(shù)據(jù)指令是數(shù)據(jù)字交換字交換指令,用于將源寄存器指令,用于將源
50、寄存器2所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到目的寄存器中,同時將源寄存器同時將源寄存器1中的字?jǐn)?shù)據(jù)傳送到源寄存器中的字?jǐn)?shù)據(jù)傳送到源寄存器2所指所指向的存儲器中。顯然,當(dāng)源寄存器向的存儲器中。顯然,當(dāng)源寄存器1和目的寄存器為和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。容。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:SWP R1,R2,R3 ;將;將R3所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到所指向的存儲器中的字?jǐn)?shù)據(jù)傳送到R1,同時,同時;將;將R2中的字?jǐn)?shù)據(jù)傳送到中的字?jǐn)?shù)據(jù)傳送到R3
51、所指向的存儲單元。所指向的存儲單元。SWPEQ R1,R1,R2 ;Z=1時,完成將時,完成將R2所指向的存儲器中的字?jǐn)?shù)據(jù)與所指向的存儲器中的字?jǐn)?shù)據(jù)與;R1中的字?jǐn)?shù)據(jù)交換。中的字?jǐn)?shù)據(jù)交換。3.2.3 ARM 存儲器訪問指令存儲器訪問指令(2)SWPB指令指令格式為:格式為:SWP條件條件B 目的寄存器,源寄存器目的寄存器,源寄存器1,源寄存器源寄存器2 SWPB指令是指令是字節(jié)交換指令字節(jié)交換指令,用于將源寄存,用于將源寄存器器2所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到目的寄存所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到目的寄存器中,目的寄存器的高器中,目的寄存器的高24清零,同時將源寄存器清零,同時將源寄存器1
52、中的字節(jié)數(shù)據(jù)傳送到源寄存器中的字節(jié)數(shù)據(jù)傳送到源寄存器2所指向的存儲器中。所指向的存儲器中。顯然,當(dāng)源寄存器顯然,當(dāng)源寄存器1和目的寄存器為同一個寄存器和目的寄存器為同一個寄存器時,指令交換該寄存器和存儲器的內(nèi)容。時,指令交換該寄存器和存儲器的內(nèi)容。3.2.3 ARM 存儲器訪問指令存儲器訪問指令指令示例:指令示例:SWPB R1,R2,R3;將;將R3所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到所指向的存儲器中的字節(jié)數(shù)據(jù)傳送到R1,R1的的高高24位清零,同時將位清零,同時將R2中的低中的低8位數(shù)據(jù)傳送到位數(shù)據(jù)傳送到R3所指所指向的存儲單元。向的存儲單元。SWPB R1,R1,R2;該指令完成將;該指令完
53、成將R2所指向的存儲器中的字節(jié)數(shù)據(jù)與所指向的存儲器中的字節(jié)數(shù)據(jù)與R1中的低中的低8位數(shù)據(jù)交換。位數(shù)據(jù)交換。3.2.4 ARM 數(shù)據(jù)處理類指令數(shù)據(jù)處理類指令u數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進(jìn)行操作,不允許數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進(jìn)行操作,不允許對存儲器中的數(shù)據(jù)進(jìn)行操作,也不允許指令直接使用對存儲器中的數(shù)據(jù)進(jìn)行操作,也不允許指令直接使用存儲器的數(shù)據(jù)或在寄存器與存儲器之間傳送數(shù)據(jù)。存儲器的數(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ù)處理
54、類指令u數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令用于在寄存器和存儲器之間進(jìn)行數(shù)用于在寄存器和存儲器之間進(jìn)行數(shù)據(jù)的雙向傳輸。據(jù)的雙向傳輸。u算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令完成常用的算術(shù)與邏輯的運(yùn)算,完成常用的算術(shù)與邏輯的運(yùn)算,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,該類指令不但將運(yùn)算結(jié)果保存在目的寄存器中,同時更新同時更新CPSR中的相應(yīng)條件標(biāo)志位。中的相應(yīng)條件標(biāo)志位。u比較指令比較指令是完成對指定的兩個寄存器(或是完成對指定的兩個寄存器(或1個寄存?zhèn)€寄存器,器,1個立即數(shù))進(jìn)行比較,不保存運(yùn)算結(jié)果,只個立即數(shù))進(jìn)行比較,不保存運(yùn)算結(jié)果,只影響影響CPSR中相應(yīng)的條件標(biāo)志位。中相應(yīng)的條件標(biāo)志位。數(shù)據(jù)傳送指令
55、數(shù)據(jù)傳送指令1.數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令MOV和和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)沒有條件標(biāo)志位的值,當(dāng)沒有S時指令不更新時指令不更新CPSR中中條件標(biāo)志位的值。條件標(biāo)志位的值。數(shù)據(jù)傳送指令數(shù)據(jù)傳送指令指令示例:指令示例:MOV R4,R5;將寄存器;將寄存器R5的內(nèi)容傳送到寄存器的內(nèi)容傳送到寄存器R4MO
56、V PC,R14;將寄存器;將寄存器R14的內(nèi)容傳送到的內(nèi)容傳送到PC,常用于子程序返,常用于子程序返回回MOVNE R4,R5,LSL2;當(dāng);當(dāng)Z=0時,將寄存器時,將寄存器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指令不同指令不同之處是在傳送之前按位被取反了,即把一個被取之處是在傳送之前按位被取反了,即把一個被取反的值傳
57、送到目的寄存器中。反的值傳送到目的寄存器中。 其中其中S決定指令的操作是否影響決定指令的操作是否影響CPSR中條件中條件標(biāo)志位的值,當(dāng)沒有標(biāo)志位的值,當(dāng)沒有S時指令不更新時指令不更新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,
58、操作數(shù),操作數(shù)2 ADD指令是指令是加法指令加法指令,用于把兩個操作數(shù)相加,用于把兩個操作數(shù)相加,并將結(jié)果存放到目的寄存器中。并將結(jié)果存放到目的寄存器中。u 操作數(shù)操作數(shù)1應(yīng)是一個寄存器。應(yīng)是一個寄存器。u操作數(shù)操作數(shù)2可以是一個寄存器,被移位的寄存器,或可以是一個寄存器,被移位的寄存器,或一個立即數(shù)一個立即數(shù) .算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算指令指令示例:指令示例:ADDS R0,R3,R4 ; R0 = R3 + R4,設(shè)置標(biāo)志位,設(shè)置標(biāo)志位ADD R0,R3,#10 ; R0 = R3 + 10ADD R0,R2,R3,LSL#2 ; R0 = R2 + R34算術(shù)邏輯運(yùn)算指令算術(shù)邏輯運(yùn)算
59、指令(2)ADC指令指令格式為:格式為: ADC條件條件S 目的寄存器,操作數(shù)目的寄存器,操作數(shù)1,操作數(shù),操作數(shù)2ADC指令是指令是帶進(jìn)位加法指令帶進(jìn)位加法指令,用于把兩個操作數(shù)相加,用于把兩個操作數(shù)相加,再加上再加上CPSR中的中的C條件標(biāo)志位的值,并將結(jié)果存放條件標(biāo)志位的值,并將結(jié)果存放到目的寄存器中。它使用一個進(jìn)位標(biāo)志位,這樣就可到目的寄存器中。它使用一個進(jìn)位標(biāo)志位,這樣就可以做比以做比32位大的數(shù)的加法,注意不要忘記設(shè)置位大的數(shù)的加法,注意不要忘記設(shè)置S后綴后綴來更改進(jìn)位標(biāo)志。來更改進(jìn)位標(biāo)志。u操作數(shù)操作數(shù)1應(yīng)是一個寄存器。應(yīng)是一個寄存器。u操作數(shù)操作數(shù)2可以是一個寄存器,被移位的寄
60、存器,或一可以是一個寄存器,被移位的寄存器,或一個立即數(shù)。個立即數(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é)果存放到
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 現(xiàn)代科技輔助下的空間認(rèn)知教學(xué)
- 科技與健康的結(jié)合孕婦瑜伽的應(yīng)用
- 2024年臨床醫(yī)療管理信息系統(tǒng)項(xiàng)目資金需求報(bào)告代可行性研究報(bào)告
- 讓孩子在探索中學(xué)習(xí)
- 數(shù)學(xué)思維訓(xùn)練提升低年級學(xué)生問題解決能力的方法
- 科技企業(yè)創(chuàng)新型發(fā)展戰(zhàn)略研究
- 二零二五年度健康美食廚師聘用及合作開發(fā)合同3篇
- 2025年北師大版九年級歷史下冊階段測試試卷含答案
- 2025年新科版八年級地理上冊月考試卷
- 2025年華師大新版一年級語文下冊階段測試試卷含答案
- 定額〔2025〕1號文-關(guān)于發(fā)布2018版電力建設(shè)工程概預(yù)算定額2024年度價(jià)格水平調(diào)整的通知
- 2024年城市軌道交通設(shè)備維保及安全檢查合同3篇
- 【教案】+同一直線上二力的合成(教學(xué)設(shè)計(jì))(人教版2024)八年級物理下冊
- 湖北省武漢市青山區(qū)2023-2024學(xué)年七年級上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試卷(含解析)
- 單位往個人轉(zhuǎn)賬的合同(2篇)
- 電梯操作證及電梯維修人員資格(特種作業(yè))考試題及答案
- 科研倫理審查與違規(guī)處理考核試卷
- GB/T 44101-2024中國式摔跤課程學(xué)生運(yùn)動能力測評規(guī)范
- 鍋爐本體安裝單位工程驗(yàn)收表格
- 高危妊娠的評估和護(hù)理
- 2024年山東鐵投集團(tuán)招聘筆試參考題庫含答案解析
評論
0/150
提交評論