第7講ARM體系結(jié)構(gòu)(9學(xué)時(shí))_第1頁(yè)
第7講ARM體系結(jié)構(gòu)(9學(xué)時(shí))_第2頁(yè)
第7講ARM體系結(jié)構(gòu)(9學(xué)時(shí))_第3頁(yè)
第7講ARM體系結(jié)構(gòu)(9學(xué)時(shí))_第4頁(yè)
第7講ARM體系結(jié)構(gòu)(9學(xué)時(shí))_第5頁(yè)
已閱讀5頁(yè),還剩119頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章ARM體系結(jié)構(gòu)ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)52ARM體系結(jié)構(gòu)概述ARM簡(jiǎn)介ARM體系結(jié)構(gòu)的特點(diǎn)ARM處理器結(jié)構(gòu)ARM體系的變種ARM處理器內(nèi)核ARM處理器核531.1ARM簡(jiǎn)介AdvancesRISCMachines(稱為ARM)由Acorn、Apple和VLSI公司1990年11月聯(lián)合建立的一家設(shè)計(jì)公司。ARM是16/32位嵌入式RISC處理器知識(shí)產(chǎn)權(quán)供應(yīng)商,該公司主要提供高性能,低價(jià)位,低功耗的RISC處理器、外圍設(shè)備,和系統(tǒng)芯片設(shè)計(jì)給重要的國(guó)際電子企業(yè)。ARM處理器有3大特點(diǎn)耗電少、成本低、功能強(qiáng)。16/32位雙指令集全球眾多合作伙伴保證供應(yīng)ARM目前主要有6個(gè)系列的產(chǎn)品:ARM7、ARM9、ARM10E、ARM11、SecurCore、CORTEX。另外還有Inter公司的Xscale和StrongARM。第3章

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

54市場(chǎng)份額手機(jī)處理器90%的市場(chǎng)份額上網(wǎng)本處理器30%的市場(chǎng)份額平板電腦處理器70%的市場(chǎng)份額2010年,ARM合作伙伴的出貨量達(dá)到了60億2007年底,ARM的雇員總數(shù)為1728人,持有專利700項(xiàng)(另有900項(xiàng)正在申請(qǐng)批準(zhǔn)中),全球分支機(jī)構(gòu)31家,合作伙伴200家,年收入2.6億英鎊。

55ARM合作伙伴561.1ARM體系結(jié)構(gòu)的特點(diǎn)RISC型處理器結(jié)構(gòu):指令相對(duì)比較精簡(jiǎn),降低了處理器的負(fù)載性,提高了處理器的速度。Thumb指令集:在新型的ARM體系結(jié)構(gòu)中定義了16位的Thumb指令集,彌補(bǔ)了RISC型處理器占用指令存儲(chǔ)空間大的缺點(diǎn)。多處理器狀態(tài)模式:支持7種處理器模式,可以大大提高ARM處理器的效率。嵌入式在線仿真調(diào)試:內(nèi)嵌在線仿真ICE-RT邏輯,便于通過JTAG來仿真調(diào)試ARM體系結(jié)構(gòu)芯片。靈活和方便的接口:有16的協(xié)處理器接口,方便擴(kuò)充各種功能;具有片上總線AMBA,它定義了3組總線,可方便地?cái)U(kuò)充各種處理器及I/O,便于集成。低電壓低功耗的設(shè)計(jì)第3章

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

571.2ARM處理器結(jié)構(gòu)由32位ALU、31個(gè)32位通用寄存器及6個(gè)狀態(tài)寄存器、乘法器、32×32位桶形移位寄存器、指令譯碼機(jī)控制邏輯、指令流水線和數(shù)據(jù)/地址寄存器組成。ARM的流水線結(jié)構(gòu):ARM7體系結(jié)構(gòu)采用3級(jí)流水線ARM9體系結(jié)構(gòu)采用5級(jí)流水線ARM10體系結(jié)構(gòu)采用6級(jí)流水線ARM存儲(chǔ)器結(jié)構(gòu):ARM處理器不帶有片內(nèi)存儲(chǔ)器,系統(tǒng)所需的RAM和ROM通過總線外接,部分處理器片內(nèi)帶有存儲(chǔ)器管理單元MMU。ARM的I/O結(jié)構(gòu):ARM處理器不帶有I/O部件和模塊,需要通過總線來擴(kuò)充。第3章

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

58ARM結(jié)構(gòu)示意圖159流水線結(jié)構(gòu)示意圖601.2ARM處理器結(jié)構(gòu)存儲(chǔ)器映射I/O:ARM處理器對(duì)I/O端口地址采用統(tǒng)一編址方式,即把I/O端口地址作為特殊的存儲(chǔ)器地址。直接存儲(chǔ)器存取DMA:ARM處理器一般沒有DMA部件,高檔ARM處理器有。中斷IRQ和快速中斷FIQ:ARM提供一般中斷和快速中斷,通常用快速中斷代替DMA的功能。主要通過采用大量后備寄存器保存現(xiàn)場(chǎng)、片內(nèi)RAM等加速中斷的進(jìn)入時(shí)間。ARM協(xié)處理器接口:ARM通過增加協(xié)處理器來支持一個(gè)通用的指令集的擴(kuò)充。可以擴(kuò)展16個(gè)協(xié)處理器,每個(gè)協(xié)處理器可有16個(gè)寄存器。第3章

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

611.2ARM處理器結(jié)構(gòu)ARMAMBA接口:采用先進(jìn)微控制器總線(AMBA)擴(kuò)展不同體系架構(gòu)的宏單元及I/O部件。AMBA總線包括三類:先進(jìn)系統(tǒng)總線ASB:作為系統(tǒng)總線,用來連接高性能系統(tǒng)模塊。先進(jìn)高性能總線AHB:作為系統(tǒng)總線,用來連接高性能系統(tǒng)模塊。比ASB功能強(qiáng)。先進(jìn)外圍總線APB:用于連接外圍宏單元。ARMJTAG調(diào)試接口:用于處理器狀態(tài)測(cè)試JTAG是英文“JointTestActionGroup(聯(lián)合測(cè)試行為組織)”縮寫,主要用于芯片內(nèi)部測(cè)試。主要有4根線:TMS、TCK、TDI、TDO

第3章

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

621.3ARM體系的變種Thumb指令集(T變種):Thumb指令集是將ARM指令集的一個(gè)子集重新編碼而形成的一個(gè)指令集。ARM指令長(zhǎng)度為32位,Thumb指令長(zhǎng)度為16位。這樣,使用Thumb指令可以得到密度更高的代碼,這對(duì)于需要嚴(yán)格控制產(chǎn)品成本的設(shè)計(jì)是非常有意義的。長(zhǎng)乘法指令(M變種):M變種增加了兩條用于進(jìn)行長(zhǎng)乘法的ARM指令。其中一條用于實(shí)現(xiàn)32位整數(shù)乘以32位整數(shù),生成64位整數(shù)的長(zhǎng)乘法操作;另一條指令用于實(shí)現(xiàn)32位整數(shù)乘以32位位整數(shù),然后加上32位整數(shù),生成64位整數(shù)的長(zhǎng)乘加操作。增強(qiáng)型DSP指令(E變種):E變種包含了一些附加的指令,這些指令用于增強(qiáng)處理器對(duì)一些典型的DSP算法的處理性能。主要包括:

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

631.3ARM體系的變種幾條新的實(shí)現(xiàn)16位數(shù)據(jù)乘法和乘加操作的指令實(shí)現(xiàn)飽和的帶符號(hào)數(shù)的加減法操作的指令。即在加減法操作溢出時(shí),結(jié)果并不進(jìn)行卷繞,而是使用最大整數(shù)或最小負(fù)數(shù)來表示進(jìn)行雙字?jǐn)?shù)據(jù)操作的指令Cache預(yù)取指令PLDJava加速器Jazelle(J變種):ARM的Jazelle技術(shù)將Java的優(yōu)勢(shì)和先進(jìn)的32位RISC芯片完美地結(jié)合在一起。Jazelle技術(shù)提供了Java加速功能,可以得到比普通Java虛擬機(jī)高得多的性能。ARM媒體功能擴(kuò)展(SIMD變種):將音頻/視頻處理提高2-4倍,可以同時(shí)進(jìn)行兩個(gè)16位操作數(shù)或者4個(gè)8位操作數(shù)的運(yùn)算,并提供了小數(shù)算術(shù)運(yùn)算

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

6416bit16bit16bit16bit16bit16bit16bit16bitSIMD指令示意圖16bit源A源B結(jié)果同一個(gè)操作16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit16bit651.4ARM處理器內(nèi)核ARM微處理器目前包括下面幾個(gè)系列除了具有ARM體系結(jié)構(gòu)的共同特點(diǎn)以外,每一個(gè)系列的ARM微處理器都有各自的特點(diǎn)和應(yīng)用領(lǐng)域。ARM7、ARM9、ARM10E、ARM11、Cortex、Inter的Xscale和StrongARM。ARM內(nèi)核芯片具有RISC體系的一般特點(diǎn):具有大量寄存器。絕大多數(shù)操作都是在寄存器中進(jìn)行,寄存器與內(nèi)存打交道的唯一是通過Load/Store的體系結(jié)構(gòu)在內(nèi)存和寄存器之間傳遞數(shù)據(jù)。尋址方式簡(jiǎn)單。采用固定長(zhǎng)度的指令。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

661.4.1ARM7微處理器系列ARM7系列微處理器:低功耗的32位RISC處理器,適合用于對(duì)價(jià)位和功耗要求較高的消費(fèi)類應(yīng)用。特點(diǎn)如下:具有嵌入式ICE-RT邏輯,調(diào)試開發(fā)方便。極低的功耗,適合對(duì)功耗要求較高的應(yīng)用,如便攜式產(chǎn)品。能夠提供0.9MIPS/MHz的三級(jí)流水線結(jié)構(gòu)。代碼密度高并兼容16位的Thumb指令集。對(duì)操作系統(tǒng)的支持廣泛,包括WindowsCE、Linux、PalmOS等。指令系統(tǒng)與ARM9系列、ARM9E系列和ARM10E系列兼容,便于用戶的產(chǎn)品升級(jí)換代。主頻最高可達(dá)130MIPS,高速的運(yùn)算處理能力能勝任絕大多數(shù)的復(fù)雜應(yīng)用。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

671.4.1ARM7微處理器系列應(yīng)用領(lǐng)域:工業(yè)控制、Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備、移動(dòng)電話等多種多媒體和嵌入式應(yīng)用。ARM7系列微處理器包括如下幾種類型的核:ARM7TDMI、ARM7TDMI-S、ARM720T、ARM7EJ。其中,ARM7TMDI是目前使用最廣泛的32位嵌入式RISC處理器,屬低端ARM處理器核。T代表支持Thumb指令集;M代表支持長(zhǎng)乘法;D代表支持片上調(diào)試;I代表支持嵌入式跟蹤宏單元,便于實(shí)現(xiàn)調(diào)試中的斷點(diǎn)和變量觀察;J代表支持Java加速;S代表可綜合。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

681.4.2ARM9微處理器系列ARM9系列微處理器在高性能和低功耗特性方面提供最佳的性能。具有以下特點(diǎn):5級(jí)整數(shù)流水線,指令執(zhí)行效率更高。提供1.1MIPS/MHz的哈佛結(jié)構(gòu)。支持32位ARM指令集和16位Thumb指令集。支持32位的高速AMBA總線接口。全性能的MMU,支持WindowsCE、Linux、等多種主流嵌入式操作系統(tǒng)。MPU支持實(shí)時(shí)操作系統(tǒng)。支持?jǐn)?shù)據(jù)Cache和指令Cache。應(yīng)用領(lǐng)域:無線設(shè)備、儀器儀表、安全系統(tǒng)、機(jī)頂盒、高端打印機(jī)、數(shù)字照相機(jī)和數(shù)字?jǐn)z像機(jī)等。ARM9系列微處理器包括如下幾種類型的核:ARM920T、ARM922T和ARM940T三種類型。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型ARM基本尋址方式

691.4.3ARM11微處理器系列ARM11系列微處理器是目前ARM家族中性能最好的一個(gè)系列,尤其是在多媒體處理能力方面,在先進(jìn)的0.13μm工藝下,主頻可達(dá)750MHz;ARM11核包含一個(gè)64位端口、4種狀態(tài)的跳轉(zhuǎn)目的地址緩存,支持SIMD指令,可使某些算法的運(yùn)算速度提高2~3倍。(1)多媒體處理擴(kuò)展,使MPEG-4編碼/解碼速度加快一倍,音頻處理速度加快一倍;(2)增強(qiáng)的Cache結(jié)構(gòu),實(shí)地址Cache,減少Cache的刷新和重載,減少上下文切換的開銷;

(3)增強(qiáng)的異常和中斷處理,使實(shí)時(shí)任務(wù)的處理更加迅速;(4)支持Unaligned和Mixed-endian數(shù)據(jù)訪問,使數(shù)據(jù)共享、軟件移植更簡(jiǎn)單,也有利于節(jié)省存儲(chǔ)器空間。701.4.4ARMCortex處理器ARMCortex系列產(chǎn)品由三個(gè)系列所組成,全都采用V7/Thumb-2指令集設(shè)計(jì),定位如下:ARMCortex-A系列:復(fù)雜操作系統(tǒng)及客戶端裝置之應(yīng)用處理器;A多媒體,開放式操作系統(tǒng),dsp加速。高端ARMCortex-R系列:針對(duì)實(shí)時(shí)系統(tǒng)的嵌入式處理器;R實(shí)時(shí),可預(yù)測(cè)性,超級(jí)穩(wěn)定性。中端ARMCortex-M系列:價(jià)格敏感型應(yīng)用裝置之嵌入式處理器,包括微處理器應(yīng)用;M為工控設(shè)計(jì),小巧快速。低端712.

ARM編程模型處理器模式與狀態(tài)ARM寄存器組織異常Exceptions存儲(chǔ)器和存儲(chǔ)器映射I/O722.1處理器模式與狀態(tài)ARM處理器支持7種不同的處理器模式,除用戶模式外的其它模式通稱為特權(quán)模式,主要是為了服務(wù)中斷或異常,或訪問保護(hù)的資源。除用戶和系統(tǒng)模式外的其它模式通稱為異常模式。處理器模式描述用戶usr正常程序執(zhí)行的模式快速中斷fiq用于高速數(shù)據(jù)傳輸和通道處理外部中斷irq用于通常的中斷處理管理svc供操作系統(tǒng)使用的一種保護(hù)模式中止abt用于虛擬存儲(chǔ)及存儲(chǔ)保護(hù)未定義und用于支持硬件協(xié)處理器的軟件仿真系統(tǒng)sys用于運(yùn)行特權(quán)級(jí)的操作系統(tǒng)任務(wù)ARM處理器的7種處理器模式異常模式特權(quán)模式

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

732.1處理器模式與狀態(tài)ARM處理器有2種工作狀態(tài)Thumb指令集的功能是32位ARM指令集的功能子集。Thumb在性能和代碼大小之間提供了出色的折中。正在執(zhí)行Thumb指令集的處理器是工作在Thumb狀態(tài)下。正在執(zhí)行ARM指令集的處理器是工作在ARM狀態(tài)下。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

742.2ARM寄存器組織ARM處理器共有37個(gè)寄存器。其中包括:31個(gè)通用寄存器,包括R0~R15,其中R15為程序計(jì)數(shù)器(PC)。這些寄存器都是32位寄存器。在每種處理器模式中都有一組這樣的寄存器。任意模式下,可見的寄存器包括16個(gè)通用寄存器(R0~R15)、一個(gè)或兩個(gè)狀態(tài)寄存器。在所有的寄存器中,有些是各模式共用的一個(gè)物理寄存器;有一些寄存器是各模式自己擁有的獨(dú)立的物理寄存器。6個(gè)狀態(tài)寄存器,這些寄存器也是32位寄存器,但只使用了其中的12位。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

752.2.1通用寄存器不分組寄存器R0~R7:任何模式下所訪問的都是同樣的物理寄存器。分組寄存器R8~R14:每一個(gè)訪問的物理寄存器取決于當(dāng)前的處理器模式,若要訪問特定的物理寄存器而不依賴于當(dāng)前的處理器模式,則要使用規(guī)定的名字。其中:R13通常用作堆棧指針,稱為SPR14用于子程序連接寄存器,稱為L(zhǎng)R程序計(jì)數(shù)器R15:由于ARM體系結(jié)構(gòu)采用了多級(jí)流水線技術(shù),PC總是指向當(dāng)前指令的下兩條指令的地址,即PC的值=當(dāng)前指令的地址+8。并且在ARM狀態(tài),位[1:0]為0(字對(duì)齊)在Thumb狀態(tài)位[0]為0,(半字對(duì)齊)

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

762.2.1通用寄存器

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

77Lable程序A程序BR14BLLable地址A???MOVPC,LRR14(地址A)Lable???1.程序A執(zhí)行過程中調(diào)用程序B;操作流程2.程序跳轉(zhuǎn)至標(biāo)號(hào)Lable,執(zhí)行程序B。同時(shí)硬件將“BLLable”指令的下一條指令所在地址存入R14;3.程序B執(zhí)行最后,將R14寄存器的內(nèi)容放入PC,返回程序A;R14寄存器與子程序調(diào)用78寄存器類別寄存器在匯編中的名稱各模式下實(shí)際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計(jì)數(shù)器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態(tài)寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq程序計(jì)數(shù)器R15(PC)寄存器R15為程序計(jì)數(shù)器(PC),它指向正在取指的地址。可以認(rèn)為它是一個(gè)通用寄存器,但是對(duì)于它的使用有許多與指令相關(guān)的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結(jié)果將是不可預(yù)測(cè)的。79讀R15的限制正常操作時(shí),從R15讀取的值是處理器正在取指的地址,即當(dāng)前正在執(zhí)行指令的地址加上8個(gè)字節(jié)(兩條ARM指令的長(zhǎng)度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。LDRR0,PC??????PCPC-4PC-8正在執(zhí)行正在譯碼正在取指流水線狀態(tài)地址程序代碼80讀R15的限制當(dāng)使用STR或STM指令保存R15時(shí),會(huì)有一個(gè)例外。這些指令可能將當(dāng)前指令地址加8字節(jié)或加12字節(jié)保存(將來可能還有其它數(shù)字)。偏移量是8還是12取決于具體的ARM芯片,但是對(duì)于一個(gè)確定的芯片,這個(gè)值是一個(gè)常量。所以最好避免使用STR和STM指令來保存R15,如果很難做到,那么應(yīng)當(dāng)在程序中計(jì)算出該芯片的偏移量。81寫R15的限制

正常操作時(shí),寫入R15的值被當(dāng)作一個(gè)指令地址,程序從這個(gè)地址處繼續(xù)執(zhí)行(相當(dāng)于執(zhí)行一次無條件跳轉(zhuǎn))。82寫R15的限制

由于ARM指令以字節(jié)為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規(guī)則取決于內(nèi)核結(jié)構(gòu)的版本:在ARM結(jié)構(gòu)V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉(zhuǎn)地址由指令的實(shí)際目標(biāo)地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結(jié)構(gòu)V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結(jié)果將不可預(yù)測(cè)。832.2.2狀態(tài)寄存器寄存器R16用作當(dāng)前程序狀態(tài)寄存器CPSR,可在任何運(yùn)行模式下被訪問,它包括:每一種異常模式下有一個(gè)專用的物理狀態(tài)寄存器,稱為備份程序狀態(tài)寄存器SPSR,當(dāng)異常發(fā)生時(shí),SPSR用于保存CPSR的當(dāng)前值,從異常退出時(shí)則可由SPSR來恢復(fù)CPSR。用戶模式和系統(tǒng)模式下不應(yīng)該訪問SPSR。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

842.2.3Thumb狀態(tài)的寄存器集Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下寄存器集的一個(gè)子集,程序員可以直接訪問8個(gè)通用寄存器R0~7、PC、SP、LR、和CPSR。在每一種特權(quán)模式下都有一組SP、LR和SPSR。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

85862.2.4處理器狀態(tài)與寄存器對(duì)應(yīng)872.3異常Exceptions當(dāng)正常的程序執(zhí)行流程發(fā)生暫時(shí)的停止時(shí),稱之為異常,例如處理一個(gè)外部的中斷請(qǐng)求。在處理異常之前,當(dāng)前處理器的狀態(tài)必須保留,這樣當(dāng)異常處理完成之后,當(dāng)前程序可以繼續(xù)執(zhí)行。處理器允許多個(gè)異常同時(shí)發(fā)生,它們將會(huì)按固定的優(yōu)先級(jí)進(jìn)行處理。ARM體系結(jié)構(gòu)中的異常,與8位/16位體系結(jié)構(gòu)的中斷有很大的相似之處,但異常與中斷的概念并不完全等同。

當(dāng)異常出現(xiàn)后,ARM強(qiáng)制從異常類型對(duì)應(yīng)的固定存儲(chǔ)器地址開始執(zhí)行程序。這些固定的地址稱為異常向量ExceptionVectors(P40表3-6)

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

882.3.1異常的類型復(fù)位:當(dāng)處理器復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常。未定義指令:當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時(shí),產(chǎn)生未定義指令異常。軟件中斷:由執(zhí)行SWI指令產(chǎn)生,可使用該異常機(jī)制實(shí)現(xiàn)用戶模式下的系統(tǒng)功能調(diào)用。指令預(yù)取中止:當(dāng)指令預(yù)取訪問存儲(chǔ)器失敗并且無效的預(yù)取指令被執(zhí)行時(shí),產(chǎn)生指令預(yù)取中止異常。數(shù)據(jù)中止:若處理器數(shù)據(jù)訪問的地址不存在,或該地址不允許當(dāng)前指令訪問時(shí),產(chǎn)生數(shù)據(jù)中止異常。外部中斷請(qǐng)求IRQ:當(dāng)處理器的外部中斷請(qǐng)求引腳有效,且CPSR中的I位為0時(shí),產(chǎn)生IRQ異常。快速中斷請(qǐng)求FIQ:當(dāng)處理器的快速中斷請(qǐng)求引腳有效,且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

892.3.1異常的類型異常向量表

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

90優(yōu)先級(jí)異常優(yōu)先級(jí)異常1(最高)復(fù)位4IRQ2數(shù)據(jù)中止5預(yù)取中止3FIQ6(最低)未定義指令、SWI異常的優(yōu)先級(jí)912.3.2對(duì)異常的響應(yīng)和返回響應(yīng)將下一條指令的地址存入相應(yīng)LR,以便程序在處理異常返回時(shí)能從正確的位置重新開始執(zhí)行。將CPSR復(fù)制到相應(yīng)的SPSR中。根據(jù)異常類型,強(qiáng)制設(shè)置CPSR的運(yùn)行模式位。強(qiáng)制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,從而跳轉(zhuǎn)到相應(yīng)的異常處理程序處。返回:將LR的值回送到PC中。將SPSR復(fù)制回CPSR中。若進(jìn)入異常處理時(shí)設(shè)置了中斷禁止位,則清除。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

92異常發(fā)生時(shí),程序要跳轉(zhuǎn)至異常服務(wù)程序,對(duì)返回地址的處理與子程序調(diào)用類似,都是由硬件完成的。區(qū)別在于有些異常有一個(gè)小常量的偏移。R14寄存器與異常處理R14R14_irq用戶模式下的程序IRQ模式下的程序AareturnB...XA地址A地址A1.執(zhí)行用戶模式下的程序;2.發(fā)生IRQ中斷,硬件將某個(gè)地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務(wù)程序A執(zhí)行完畢,將R14_irq寄存器的內(nèi)容減去某個(gè)常量后存入PC,返回之前被中斷的程序;未被破壞93R14R14_irq用戶模式下的程序IRQ模式下的程序AaB...XA地址A地址A1.執(zhí)行用戶模式下的程序;2.發(fā)生IRQ中斷,硬件將某個(gè)地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務(wù)程序A執(zhí)行完畢,將R14_irq寄存器的內(nèi)容減去某個(gè)常量后存入PC,返回之前被中斷的程序;未被破壞IRQ模式下的程序BareturnB...XA地址B地址B4.如果在IRQ處理程序中打開IRQ中斷,并且再次發(fā)生IRQ中斷,或者調(diào)用子程序;5.硬件將返回地址保存在R14_irq寄存器中,原來保存的返回地址將被覆蓋,造成錯(cuò)誤;被破壞6.在程序B返回到程序A,然后在返回到用戶模式下被中斷的程序時(shí),發(fā)生錯(cuò)誤,將不能正確返回;returnreturn解決辦法是確保R14的對(duì)應(yīng)版本在發(fā)生中斷嵌套時(shí)不再保存任何有意義的值(將R14入棧),或者切換到其它處理器模式下。當(dāng)發(fā)生異常嵌套時(shí),這些異常之間可能會(huì)發(fā)生沖突。例如:如果用戶在用戶模式下執(zhí)行程序時(shí)發(fā)生了IRQ中斷,用戶模式寄存器不會(huì)被破壞。但是如果允許在IRQ模式下的中斷處理程序重新使能IRQ中斷,并且發(fā)生了嵌套的IRQ中斷時(shí),外部中斷處理程序保存在R14_irq中的任何值都將被嵌套中斷的返回地址所覆蓋。R14寄存器與異常處理942.4存儲(chǔ)器和存儲(chǔ)器映射I/O存儲(chǔ)器:ARM體系使用單一的平板地址空間。該地址空間的大小為232個(gè)8位字節(jié),即4G。存儲(chǔ)器訪問的地址要求對(duì)準(zhǔn),ARM存儲(chǔ)器的空間可以是:字節(jié)對(duì)齊,范圍為0~232-1半字對(duì)齊(A、A+1),范圍為0~231-1字對(duì)齊的(A、A+1、A+2、A+3),范圍為0~230-1存儲(chǔ)器映射I/O:I/O設(shè)別地址和存儲(chǔ)器統(tǒng)一編址,當(dāng)使用這些特定的存儲(chǔ)器地址讀寫時(shí),提供的是I/O功能。小端和大端:地址單元其所對(duì)應(yīng)的數(shù)據(jù)高低位順序與存儲(chǔ)系統(tǒng)是小端還是大端有關(guān)。小端低位在低地址,大端低位在高地址。

1

2

3ARM體系結(jié)構(gòu)概述ARM編程模型

ARM基本尋址方式

952.4存儲(chǔ)器和存儲(chǔ)器映射I/OARM處理器支持下列數(shù)據(jù)類型:字節(jié)8位半字16位(必須分配為占用2個(gè)字節(jié))字32為(必須分配為占用4個(gè)字節(jié))ARM體系結(jié)構(gòu)可以用兩種方法存儲(chǔ)字?jǐn)?shù)據(jù),稱為大端格式和小端格式。1112342字單元半字0半字1字單元半字1半字0963.ARM指令編碼方式與尋址方式ARM指令編碼的一般方式ARM指令的尋址方式ARM匯編程序?qū)嵗?73.1ARM指令編碼格式983.2一般尋址方式ARM指令匯編格式<opcode>{<cond>}{S}<Rd>,<Rn>,<operand2>使用條件碼“cond”可以實(shí)現(xiàn)高效的邏輯操作(節(jié)省跳轉(zhuǎn)和條件語(yǔ)句),提高代碼效率。所有的ARM指令都可以條件執(zhí)行,而Thumb指令只有B(跳轉(zhuǎn))指令具有條件執(zhí)行功能。如果指令不標(biāo)明條件代碼,將默認(rèn)為無條件(AL)執(zhí)行。Operand2形式#immed_8r、Rm、Rm,shift(寄存器+移位)尋址方式所謂尋址方式就是處理器根據(jù)指令中給出的地址信息來尋址物理地址的方式。對(duì)于ARM指令來說,就是如何找到operand2具體來說,有以下9種寄存器尋址;立即尋址;寄存器移位尋址;寄存器間接尋址;基址尋址;多寄存器尋址;堆棧尋址;塊拷貝尋址;相對(duì)尋址。99操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號(hào),指令執(zhí)行時(shí)直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R00xAA0x55R2R1ARM處理器尋址方式尋址方式分類——寄存器尋址MOVR1,R20xAA100立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(shù)本身,也就是說,數(shù)據(jù)就包含在指令當(dāng)中,取出指令也就取出了可以立即使用的操作數(shù)(這樣的數(shù)稱為立即數(shù))。立即尋址指令舉例如下:SUBS R0,R0,#1;R0減1,結(jié)果放入R0,并且影響標(biāo)志位MOV R0,#0xFF000;將立即數(shù)0xFF000裝入R0寄存器0x55R0MOVR0,#0xFF00程序存儲(chǔ)ARM處理器尋址方式尋址方式分類——立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)101寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個(gè)操作數(shù)是寄存器移位方式時(shí),第2個(gè)寄存器操作數(shù)在與第1個(gè)操作數(shù)結(jié)合之前,選擇進(jìn)行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3;R2的值左移3位,結(jié)果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3;R2的值左移R3位,然后 ;和R1相“與”操作,結(jié)果放入R10x55R0R20x01ARM處理器尋址方式尋址方式分類——寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位102寄存器間接尋址指令中的地址碼給出的是一個(gè)通用寄存器的編號(hào),所需的操作數(shù)保存在寄存器指定地址的存儲(chǔ)單元中,即寄存器為操作數(shù)的地址指針。例如:LDR R1,[R2] ;將R2指向的存儲(chǔ)單元的數(shù)據(jù)

;讀出保存在R1中SWP R1,R1,[R2] ;將寄存器R1的值和R2 ;指定的存儲(chǔ)單元的內(nèi)容交換0x55R0R20x400000000xAA0x40000000ARM處理器尋址方式尋址方式分類——寄存器間接尋址LDRR0,[R2]0xAA103移位操作LSL移位操作:0LSR移位操作:0ASR移位操作:ROR移位操作:RRX移位操作:C104基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量(<4K)相加/減,形成操作數(shù)的有效地址。基址尋址用于訪問基址附近的存儲(chǔ)單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等。寄存器間接尋址是偏移量為0的基址加偏移尋址?;穼ぶ分噶钆e例如下(前索引尋址):LDR R2,[R3,#0x0C];讀取R3+0x0C地址上的

;存儲(chǔ)單元的內(nèi)容,放入R2STR R1,[R0,#-4]!;先R0=R0-4,然后把R1的值

;寄存到保存到R0指定的存儲(chǔ)單元ARM處理器尋址方式尋址方式分類——基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)105基址尋址指令舉例如下:LDR R0,[R1],#4;R0=[R1],R1=R1+4 ;后索引基址尋址

LDRR0,[R1,R2];R0=[R1+R2]ARM處理器尋址方式尋址方式分類——基址尋址106多寄存器尋址一次可傳送幾個(gè)寄存器值,允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到R2~R7、R12中(R1自動(dòng)加4)STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保存到R0指向的存儲(chǔ);單元中(R0自動(dòng)加4)0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲(chǔ)器ARM處理器尋址方式尋址方式分類——多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000010107堆棧是一個(gè)按特定順序進(jìn)行存取的存儲(chǔ)區(qū),操作順序?yàn)椤昂筮M(jìn)先出”。堆棧尋址是隱含的,它使用一個(gè)專門的寄存器(堆棧指針)指向一塊存儲(chǔ)區(qū)域(堆棧),指針?biāo)赶虻拇鎯?chǔ)單元即是堆棧的棧頂。存儲(chǔ)器堆??煞譃閮煞N:向上生長(zhǎng):向高地址方向生長(zhǎng),稱為遞增堆棧向下生長(zhǎng):向低地址方向生長(zhǎng),稱為遞減堆棧ARM處理器尋址方式尋址方式分類——堆棧尋址108ARM處理器尋址方式尋址方式分類——堆棧尋址棧底棧頂棧區(qū)SP堆棧存儲(chǔ)區(qū)棧頂棧底棧區(qū)SP向下增長(zhǎng)向上增長(zhǎng)0x123456780x12345678堆棧壓棧堆棧壓棧109棧頂SP棧頂SP棧底空堆棧棧底滿堆棧堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項(xiàng),稱為滿堆棧;堆棧指針指向下一個(gè)待壓入數(shù)據(jù)的空位置,稱為空堆棧。ARM處理器尋址方式尋址方式分類——堆棧尋址0x123456780x12345678棧頂SP0x12345678棧頂SP壓棧壓棧110所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長(zhǎng),堆棧指針指向內(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等。ARM處理器尋址方式尋址方式分類——堆棧尋址111多寄存器傳送指令用于將一塊數(shù)據(jù)從存儲(chǔ)器的某一位置拷貝到另一位置。如:STMIA R0!,{R1-R7} ;將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針R0在保存第一個(gè)值之后增加,增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)。STMIB R0!,{R1-R7} ;將R1~R7的數(shù)據(jù)保存到存儲(chǔ)器中。存儲(chǔ)指針R0在保存第一個(gè)值之前增加,增長(zhǎng)方向?yàn)橄蛏显鲩L(zhǎng)。ARM處理器尋址方式尋址方式分類——塊拷貝尋址112相對(duì)尋址是基址尋址的一種變通。由程序計(jì)數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對(duì)尋址指令舉例如下:

BL SUBR1 ;調(diào)用到SUBR1子程序

BEQ LOOP ;條件跳轉(zhuǎn)到LOOP標(biāo)號(hào)處

...LOOPMOV R6,#1 ...SUBR1 ...ARM處理器尋址方式尋址方式分類——相對(duì)尋址113;文件名:TEST1.S;功能:實(shí)現(xiàn)兩個(gè)寄存器相加;說明:使用ARMulate軟件仿真調(diào)試

AREA Example1,CODE,READONLY ;聲明代碼段Example1

ENTRY ;標(biāo)識(shí)程序入口

CODE32 ;聲明32位ARM指令START MOV R0,#0 ;設(shè)置參數(shù)

MOV R1,#10LOOP BL ADD_SUB ;調(diào)用子程序ADD_SUB

B LOOP ;跳轉(zhuǎn)到LOOPADD_SUB

ADDS R0,R0,R1 ;R0=R0+R1 MOV PC,LR ;子程序返回

END ;文件結(jié)束

使用“;”進(jìn)行注釋標(biāo)號(hào)頂格寫實(shí)際代碼段聲明文件結(jié)束3.3簡(jiǎn)單的ARM程序1144.ARM指令集ARM指令的兩個(gè)特點(diǎn)ARM指令的分類Thumb指令集1154.1ARM指令的兩個(gè)特點(diǎn)條件執(zhí)行:幾乎所有的指令均可包含一個(gè)可選的條件碼,滿足條件碼的指令才能執(zhí)行。如:ADDEQ更新條件碼標(biāo)志S:幾乎所有的數(shù)據(jù)處理指令均可根具執(zhí)行結(jié)果來選擇是否更新條件碼標(biāo)志。若需要?jiǎng)t在指令中包含后綴“S”。如:SUBS助記符含義助記符含義助記符含義EQ:等于=LS無符號(hào)≤

PL正號(hào)NE:不等于≠GT帶符號(hào)>MI負(fù)號(hào)HI:無符號(hào)>GE帶符號(hào)≥VS溢出CS:無符號(hào)≥LT帶符號(hào)<VC未溢出CC無符號(hào)<LE帶符號(hào)≤AL/NV總是/從不34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

116操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號(hào)數(shù)大于或等于0011CC/LOC=0無符號(hào)數(shù)小于0100MIN=1負(fù)數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號(hào)數(shù)大于1001LSC=0,Z=1無符號(hào)數(shù)小于或等于1010GEN=V有符號(hào)數(shù)大于或等于

1011LTN!=V有符號(hào)數(shù)小于

1100GTZ=0,N=V有符號(hào)數(shù)大于

1101LEZ=1,N!=V有符號(hào)數(shù)小于或等于

1110AL任何無條件執(zhí)行

(指令默認(rèn)條件)1111NV任何從不執(zhí)行(不要使用)指令條件碼表117ExampleARM指令集——條件碼C代碼:If(a>b) a++;Else b++;對(duì)應(yīng)的匯編代碼:CMP R0,R1 ;R0(a)與R1(b)比較ADDHI R0,R0,#1;若R0>R1,則R0=R0+1ADDLS R1,R1,#1;若R0≤1,則R1=R1+1示例:1184.2ARM指令的分類32位ARM指令集有14種基本指令類型組成,可分為5大類:3種類型的存儲(chǔ)器訪問指令:控制存儲(chǔ)器和寄存器之間的數(shù)據(jù)傳送。3種類型的數(shù)據(jù)處理指令:使用片內(nèi)ALU、桶形移位器和乘法器針對(duì)31個(gè)寄存器完成高速數(shù)據(jù)處理操作。4種類型的轉(zhuǎn)移指令:控制程序執(zhí)行流程、指令優(yōu)先級(jí)以及ARM代碼和Thumb代碼的切換。3種類型的協(xié)處理器指令:專用于控制外部協(xié)處理器。這些指令以開放和統(tǒng)一的方式擴(kuò)展了指令集的片外功能。雜類指令:包括中斷調(diào)用、標(biāo)志傳入傳出等。34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

1194.2.1ARM存儲(chǔ)器訪問指令在存儲(chǔ)器和寄存器之間傳送單一數(shù)據(jù)指令LDR和STR指令格式:op{cond}typeRd,地址。

type表示傳送數(shù)據(jù)的類型,必須是下列值之一:D:表示雙字、空:表示字SH:帶符號(hào)半字、H:無符號(hào)半字B:無符號(hào)字節(jié)、SB:帶符號(hào)字節(jié)使用舉例:LDRBR0,[R1]LDRNEBR0,[R1,#1]!STRRd,placeSTRRd,[Rbase],Rindex34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

120LDR和STR——字和無符號(hào)字節(jié)加載/存儲(chǔ)指令編碼指令執(zhí)行的條件碼I為0時(shí),偏移量為12位立即數(shù),為1時(shí),偏移量為寄存器移位P表示前/后變址U表示加/減B為1表示字節(jié)訪問,為0表示字訪問W表示回寫為指令的尋址方式Rd為源/目標(biāo)寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0)121LDR和STR——字和無符號(hào)字節(jié)加載/存儲(chǔ)指令

LDR/STR指令尋址非常靈活,它由兩部分組成,其中一部分為一個(gè)基址寄存器,可以為任一個(gè)通用寄存器;另一部分為一個(gè)地址偏移量。地址偏移量有以下3種格式:立即數(shù)。立即數(shù)可以是一個(gè)無符號(hào)的數(shù)值。這個(gè)數(shù)據(jù)可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,#0x12]

;R1<-[R0+0x12]寄存器。寄存器中的數(shù)值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2]

;

R1<-[R0+R2]

LDRR1,[R0,-R2];R1<-[R0-R2]寄存器及移位常數(shù)。寄存器移位后的值可以加到基址寄存器,也可以從基址寄存器中減去這個(gè)數(shù)值。如:LDRR1,[R0,R2,LSL#2]

;R1<-[R0+R2*4]

122

從尋址方式的地址計(jì)算方法分,加載/存儲(chǔ)指令有以下4種格式:零偏移。 如:LDRRd,[Rn]

前索引偏移。 如:LDRRd,[Rn,#0x04]!程序相對(duì)偏移。 如:LDRRd,labe1

后索引偏移。 如:LDRRd,[Rn],#-0x04注意:必須保證字?jǐn)?shù)據(jù)操作的地址是32位對(duì)齊的。LDR和STR——字和無符號(hào)字節(jié)加載/存儲(chǔ)指令123LDR和STR——半字和有符號(hào)字節(jié)加載/存儲(chǔ)指令這類LDR/STR指令可加載有符號(hào)半字或字節(jié),可加載/存儲(chǔ)無符號(hào)半字。偏移量格式、尋址方式與加載/存儲(chǔ)字和無符號(hào)字節(jié)指令相同。

LDR{cond}SBRd,<地址>;將指定地址上的有符號(hào)字節(jié)讀入Rd

LDR{cond}SHRd,<地址>;將指定地址上的有符號(hào)半字讀入Rd

LDR{cond}HRd,<地址>;將指定地址上的半字?jǐn)?shù)據(jù)讀入Rd

STR{cond}HRd,<地址>;將Rd中的半字?jǐn)?shù)據(jù)存入指定地址注意:1.有符號(hào)位半字/字節(jié)加載是指用符號(hào)位加載擴(kuò)展到32位,無符號(hào)半字加載是指用零擴(kuò)展到32位;2.半字讀寫的指定地址必須為偶數(shù),否則將產(chǎn)生不可靠的結(jié)果;124ARM存儲(chǔ)器訪問指令——單寄存器存儲(chǔ)LDR和STR——半字和有符號(hào)字節(jié)加載/存儲(chǔ)指令編碼指令執(zhí)行的條件碼I為0時(shí),偏移量為12位立即數(shù),為1時(shí),偏移量為寄存器移位P表示前/后變址U表示加/減W表示回寫為指令的尋址方式Rd為源/目標(biāo)寄存器Rn為基址寄存器L用于區(qū)別加載(L為1)或存儲(chǔ)(L為0)S為1表示有符號(hào)訪問,為0表示無符號(hào)訪問H為1表示半字訪問,為0表示字節(jié)訪問125LDR和STR指令應(yīng)用示例:1.加載/存儲(chǔ)字和無符號(hào)字節(jié)指令LDR R2,[R5] ;將R5指向地址的字?jǐn)?shù)據(jù)存入R2STR R1,[R0,#0x04] ;將R1的數(shù)據(jù)存儲(chǔ)到R0+0x04地址LDRB R3,[R2],#-1 ;將R2指向地址的字節(jié)數(shù)據(jù)存入R3,R2=R2-1STRB R0,[R3,-R8ASR#2];R0->[R3-R8/4],存儲(chǔ)R0的最低有效字節(jié)2.加載/存儲(chǔ)半字和有符號(hào)字節(jié)指令LDRSBR1,[R0,R3] ;將R0+R3地址上的字節(jié)數(shù)據(jù)存入R1,

;高24位用符號(hào)擴(kuò)展LDRHR6,[R2],#2 ;將R2指向地址的半字?jǐn)?shù)據(jù)存入R6,高16位用0擴(kuò)展

;讀出后,R2=R2+2STRHR1,[R0,#2]! ;將R1的半字?jǐn)?shù)據(jù)保存到R0+2地址,

;只修改低2字節(jié)數(shù)據(jù),然后R0=R0+2ARM存儲(chǔ)器訪問指令——單寄存器存儲(chǔ)1264.2.1ARM存儲(chǔ)器訪問指令在存儲(chǔ)器和寄存器之間傳送多個(gè)數(shù)據(jù)指令LDM和STM,可以傳送R0~15的任何組合。指令格式:op{cond}modeRn{!},<reglist>{^}。

mode必須是下列值之一:IA或IB:每次傳送后或前地址加4DA或DB:每次傳送后或前地址減4FD或ED:滿或空遞減堆棧FA或EA:滿或空遞增堆棧使用舉例:STMIA

R8,{R0,R1,R9}LDMFDR13!,{R1,R0}LDMFDR13!,{R0,R4-R7,PC}34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

127ARM存儲(chǔ)器訪問指令——多寄存器存取多寄存器加載/存儲(chǔ)指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作

進(jìn)行數(shù)據(jù)復(fù)制時(shí),先設(shè)置好源數(shù)據(jù)指針和目標(biāo)指針,然后使用塊拷貝尋址指令LDMIA/STMIA、LDMIB/STMIB、LDMDA/STMDA、LDMDB/STMDB進(jìn)行讀取和存儲(chǔ)。進(jìn)行堆棧操作操作時(shí),要先設(shè)置堆棧指針(SP),然后使用堆棧尋址指令STMFD/LDMFD、STMED/LDMED、STMFA/LDMFA和STMEA/LDMEA實(shí)現(xiàn)堆棧操作。128ARM存儲(chǔ)器訪問指令——多寄存器存取數(shù)據(jù)塊傳送指令操作過程如右圖所示,其中R1為指令執(zhí)行前的基址寄存器,R1’則為指令執(zhí)行后的基址寄存器。R5R6R7R1R1’指令STMIAR1!,{R5-R7}空遞增4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMDAR1!,{R5-R7}空遞減4008H4004H4000H4014H4010H400CHR5R6R7R1R1’指令STMIBR1!,{R5-R7}滿遞增4008H4004H4000H4014H4010H400CHR5R6R7R1’R1指令STMDBR1!,{R5-R7}滿遞減4008H4004H4000H4014H4010H400CH129ARM存儲(chǔ)器訪問指令——多寄存器存取數(shù)據(jù)塊傳送存儲(chǔ)堆棧操作壓棧說明數(shù)據(jù)塊傳送加載堆棧操作出棧說明STMDASTMED空遞減LDMDALDMFA滿遞減STMIASTMEA空遞增LDMIALDMFD滿遞增STMDBSTMFD滿遞減LDMDBLDMEA空遞減STMIBSTMFA滿遞增LDMIBLDMED空遞增;使用數(shù)據(jù)塊傳送指令進(jìn)行堆棧操作STMDA R0!,{R5-R6}...LDMIB R0!,{R5-R6};使用堆棧指令進(jìn)行堆棧操作STMED R13!,{R5-R6}...LDMED R13!,{R5-R6}兩段代碼的執(zhí)行結(jié)果是一樣的,但是使用堆棧指令的壓棧和出棧操作編程很簡(jiǎn)單(只要前后一致即可),而使用數(shù)據(jù)塊指令進(jìn)行壓棧和出棧操作則需要考慮空滿一致、加與減對(duì)應(yīng)的問題。堆棧操作和數(shù)據(jù)塊傳送指令類似,也有4種模式,差別在于基地址寄存器不一樣。這兩類指令之間的關(guān)系如下表所示:1304.2.1ARM存儲(chǔ)器訪問指令預(yù)加載指令PLD:用于提示存儲(chǔ)系統(tǒng)將要加載的存儲(chǔ)器地址,提高存儲(chǔ)器的訪問速度。格式:PLD[Rn{,Flexoffset}]舉例:PLD[R2]、PLD[R0,R2]PLD[R15,#280]、PLD[R5,R8,LSL#2]單一數(shù)據(jù)交換指令SWP:在寄存器和存儲(chǔ)器之間進(jìn)行數(shù)據(jù)交換。格式:SWP{cond}{B}Rd,Rm,[Rn]舉例:SWPR1,R2,[R5]SWPBR1,R2,[R5]34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

1314.2.2ARM數(shù)據(jù)處理指令A(yù)DD、ADC、SUB、SBC、RSB、RSC格式:op{cond}{S}Rd,Rn,Operand2說明:ADD(ADC):Rn+Operand2→Rd(帶進(jìn)位加)SUB(SBC):Rn-Operand2→Rd(帶進(jìn)位減)RSB(RSC):Operand2-Rn→Rd(帶進(jìn)位減)與AND、或ORR、異或EOR和位清零BIC格式:op{cond}{S}Rd,Rn,Operand2說明:BIC:將Rn中的位與Operand2之中相應(yīng)位的反碼進(jìn)行與操作,結(jié)果送Rd

。其它命令實(shí)現(xiàn)RnOPOperand2→Rd34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

132助記符說明操作條件碼位置ADDRd,Rn,operand2加法運(yùn)算指令Rd←Rn+operand2ADD{cond}{S}SUBRd,Rn,operand2減法運(yùn)算指令Rd←Rn-operand2SUB{cond}{S}RSBRd,Rn,operand2逆向減法指令Rd←operand2-RnRSB{cond}{S}ADCRd,Rn,operand2帶進(jìn)位加法Rd←Rn+operand2+CarryADC{cond}{S}SBCRd,Rn,operand2帶進(jìn)位減法指令Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rn,operand2帶進(jìn)位逆向減法指令Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}133助記符說明操作條件碼位置ANDRd,Rn,operand2邏輯與操作指令Rd←Rn&operand2AND{cond}{S}ORRRd,Rn,operand2邏輯或操作指令Rd←Rn|operand2ORR{cond}{S}EORRd,Rn,operand2邏輯異或操作指令Rd←Rn^operand2EOR{cond}{S}BICRd,Rn,operand2位清除指令Rd←Rn&(~operand2)BIC{cond}{S}ARM數(shù)據(jù)處理指令——邏輯運(yùn)算指令注:當(dāng)后綴S時(shí),這些指令根據(jù)結(jié)果更新標(biāo)志N和Z,在計(jì)算Operand2時(shí)更新標(biāo)志C,不影響標(biāo)志V。1344.2.2ARM數(shù)據(jù)處理指令傳送MOV和傳送取反值MVN指令格式:OP{cond}{S}Rd,Operand2說明:MVN將Operand2按位取反送RdOperand2只能是寄存器或立即數(shù)舉例:MOVR0,R0;R0=R0相當(dāng)于NOP指令MVNR0,#0xff;R0=0xffffff00比較CMP和比較反值CMN格式:OP{cond}{S}Rd,Operand2說明:結(jié)果不保存但影響條件碼標(biāo)志,CMN做加法。34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

1354.2.2ARM數(shù)據(jù)處理指令測(cè)試位TST和測(cè)試等價(jià)TEQ指令格式:OP{cond}Rn,Operand2說明:結(jié)果不保存但影響條件碼標(biāo)志。TST實(shí)現(xiàn)按位與,TEQ實(shí)現(xiàn)按位異或前導(dǎo)零計(jì)數(shù)CLZ指令格式:OP{cond}Rd,Rm說明:CLZ指令對(duì)Rm中值的前導(dǎo)零的個(gè)數(shù)進(jìn)行計(jì)數(shù)結(jié)果送Rd中。若為[31]為1,則結(jié)果為0。Rd不允許是R1534

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

136助記符說明操作條件碼位置CMPRn,operand2比較指令標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負(fù)數(shù)比較指令標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測(cè)試指令標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測(cè)試指令標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}ARM數(shù)據(jù)處理指令——比較指令例如:比較指令——CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位(N/Z/C/V)。指令格式如下:CMP{cond} Rn,operand2例:CMP R1,#10

;R1與10比較,設(shè)置相關(guān)標(biāo)志位

CMPGT R1,R2 ;R1與R2比較,設(shè)置相關(guān)標(biāo)志位;若R1>10,則執(zhí)行本指令1374.2.2ARM數(shù)據(jù)處理指令乘法MUL和帶累加的乘法MLAMUL格式:OP{cond}{S}Rd,Rm,RsMLA格式:OP{cond}{S}Rd,Rm,Rs,Rn說明:實(shí)現(xiàn)32位乘32位,結(jié)果為低32位MLA實(shí)現(xiàn)Rm×Rs+Rn→Rd寄存器不能使用R15,Rd不能與Rm相同。UMULL、UMLAL、SMULL和SMLAL格式:OP{cond}{S}RdLo,RdHi,Rm,Rs說明實(shí)現(xiàn)32位乘32位,結(jié)果為64位。分別實(shí)現(xiàn)無符號(hào)數(shù)和有符號(hào)數(shù)乘合乘加。乘加LAL的加數(shù)保存在Rd。34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

1384.2.3ARM轉(zhuǎn)移指令轉(zhuǎn)移B和帶鏈接轉(zhuǎn)移BL指令格式:OP{cond}label說明:Label為程序相對(duì)偏移表達(dá)式BL指令先將下一條指令的地址拷貝到R14,然后轉(zhuǎn)移到label。舉例:BloopA、BLEng+8變換指令集轉(zhuǎn)移BX和BLX(帶鏈接)格式1:OP{cond}Rm、格式2:BLXlabel說明:Rm是含有轉(zhuǎn)移地址的寄存器,Rm的位[0]不作為地址,若位[0]=1,變換到Thumb指令集34

5ARM基本尋址方式ARM指令集匯編語(yǔ)言程序設(shè)計(jì)

139助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。指令格式如下:B{cond}Label

例:B WAITA ;跳轉(zhuǎn)到WAITA標(biāo)號(hào)處

B 0x1234 ;跳轉(zhuǎn)到絕對(duì)地址0x1234處140BLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPC助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)連接寄存器中,然后跳轉(zhuǎn)到指定地址運(yùn)行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelAddr1LabelAddr2Addr21.當(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í)行應(yīng)用示例(調(diào)用子程序):

BL Label 141助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←Rm,切換處理器狀態(tài)BX{cond}ARM指令——分支指令帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)(ARM指令為字對(duì)齊,最低2位地址固定為0)。Rm的位[0]不用作地址的一部分。若Rm的位[0]為1,則指令將CPSR中的標(biāo)志T置位,且將目標(biāo)地址的代碼解釋為Thumb代碼;否則為ARM代碼。指令格式如下:BX{cond}Rm例:ADRLR0,ThumbFun+1;將Thumb程序的入口地址加1存入R0BXR0 ;跳轉(zhuǎn)到R0指定的地址,

;并根據(jù)R0的最低位來切換處理器狀態(tài)1424.2.4ARM雜項(xiàng)指令——軟中斷指令

SWI指令用于產(chǎn)生SWI異常,使得CPU模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉(zhuǎn)到SWI異常入口。不影響條件碼標(biāo)志。該指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù),操作系統(tǒng)在SWI異常處理程序中進(jìn)行相應(yīng)的系統(tǒng)服務(wù)。SWI{cond} immed_24SWI指令格式SWI指令編碼指令執(zhí)行的條件碼指令傳遞的參數(shù)(24位立即數(shù),其值為0~224-1),執(zhí)行時(shí)CPU忽略該參數(shù)。143ARM雜項(xiàng)指令——軟中斷指令根據(jù)SWI指令傳遞的參數(shù)SWI異常處理程序可以作出相應(yīng)的處理。SWI指令傳遞參數(shù)有以下兩種方法,指令中的24位立即數(shù)指定了用戶請(qǐng)求的服務(wù)類型,參數(shù)通過通用寄存器傳遞。MOVR0,#34

;設(shè)置子功能號(hào)為34SWI12

;調(diào)用12號(hào)軟中斷指令中的24位立即數(shù)被忽略,用戶請(qǐng)求的服務(wù)類型由寄存器R0的值決定,參數(shù)通過其它的通用寄存器傳遞。MOVR0,#12

;調(diào)用12號(hào)軟中斷MOVR1,#34

;設(shè)置子功能號(hào)為34SWI0

144ARM雜項(xiàng)指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對(duì)SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場(chǎng)保護(hù)

MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測(cè)試T標(biāo)志位

LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)(低8位)

LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(shù)(低24位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回NE:Z=0EQ:Z=1145ARM雜項(xiàng)指令——軟中斷指令在SWI異常中斷處理程序中,取出SWI指令中立即數(shù)的步驟為:首先確定引起軟中斷的SWI指令是ARM指令還是Thumb指令,這可通過對(duì)SPSR訪問得到;然后取得該SWI指令的地址,這可通過訪問LR寄存器得到;接著讀出該SWI指令,分解出立即數(shù)。SWI_HandlerSTMFDSP!,{R0-R3,R12,LR} ;現(xiàn)場(chǎng)保護(hù)

MRSR0,SPSR ;讀取SPSRSTMFDSP!,{R0} ;保存SPSRTSTR0,#0x20 ;測(cè)試T標(biāo)志位

LDRNEHR0,[LR,#-2] ;若是Thumb指令,讀取指令碼(16位)BICNER0,R0,#0xFF00 ;取得Thumb指令的8位立即數(shù)(低8位)

LDREQR0,[LR,#-4] ;若是ARM指令,讀取指令碼(32位)BICEQR0,R0,#0xFF000000 ;取得ARM指令的24位立即數(shù)(低24位)

...LDMFDSP!,{R0-R3,R12,PC}^ ;SWI異常中斷返回NE:Z=0EQ:Z=1146ARM雜項(xiàng)指令—狀態(tài)寄存器讀指令在A

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論