ARM體系結(jié)構(gòu)課件_第1頁
ARM體系結(jié)構(gòu)課件_第2頁
ARM體系結(jié)構(gòu)課件_第3頁
ARM體系結(jié)構(gòu)課件_第4頁
ARM體系結(jié)構(gòu)課件_第5頁
已閱讀5頁,還剩103頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

ARM體系結(jié)構(gòu)

2.1ARM體系結(jié)構(gòu)簡介

ARM(AdvancedRISCMachines)公司1991年成立于英國劍橋,是專門從事基于RISC技術(shù)芯片設(shè)計開發(fā)的公司,主要出售芯片設(shè)計技術(shù)的授權(quán),作為知識產(chǎn)權(quán)供應(yīng)商,本身不直接從事芯片生產(chǎn),靠轉(zhuǎn)讓設(shè)計許可由合作公司生產(chǎn)各具特色的芯片,半導(dǎo)體生產(chǎn)商從ARM公司購買其設(shè)計的ARM微處理器核,根據(jù)各自不同的應(yīng)用領(lǐng)域,加入適當(dāng)?shù)耐鈬娐罚瑥亩纬勺约旱腁RM微處理器芯片進入市場。據(jù)最新統(tǒng)計,全球有103家巨型IT公司在采用ARM技術(shù),20家最大的半導(dǎo)體廠商中有19家是ARM的用戶,包括德州儀器,意法半導(dǎo)體,Philips,Intel等。ARM系列芯片已經(jīng)被廣泛的應(yīng)用于移動電話、手持式計算機以及各種各樣的嵌入式應(yīng)用領(lǐng)域,成為世界上銷量最大的32位微處理器。

ARM授權(quán)費IPARM創(chuàng)造和設(shè)計IPPartner產(chǎn)品,例如:芯片Partner把ARMIP和其他IP集成進產(chǎn)品OEMCustomer版權(quán)費單價OEM用來自ARMPartner的芯片設(shè)計制造最終用戶產(chǎn)品業(yè)務(wù)拓展/市場格局

采用RISC架構(gòu)的ARM微處理器一般具有如下特點:●支持Thumb(16位)/ARM(32位)雙指令集,能很好的兼容8位/16位器件。Thumb指令集比通常的8位和16位CISC/RISC處理器具有更好的代碼密度;●指令執(zhí)行采用3級流水線/5級流水線技術(shù);●帶有指令Cache和數(shù)據(jù)Cache,大量使用寄存器,指令執(zhí)行速度更快。大多數(shù)數(shù)據(jù)操作都在寄存器中完成。尋址方式靈活簡單,執(zhí)行效率高。指令長度固定(在ARM狀態(tài)下是32位,在Thumb狀態(tài)下是16位);●支持大端格式和小端格式兩種方法存儲字數(shù)據(jù);●支持Byte(字節(jié),8位)、Halfword(半字,16位)和Word(字,32位)三種數(shù)據(jù)類型。●支持用戶、快中斷、中斷、管理、中止、系統(tǒng)和未定義等7種處理器模式,除了用戶模式外,其余的均為特權(quán)模式;●處理器芯片上都嵌入了在線仿真ICE-RT邏輯,便于通過JTAG來仿真調(diào)試ARM體系結(jié)構(gòu)芯片,可以避免使用昂貴的在線仿真器。另外,在處理器核中還可以嵌入跟蹤宏單元ETM,用于監(jiān)控內(nèi)部總線,實時跟蹤指令和數(shù)據(jù)的執(zhí)行;具有片上總線AMBA(AdvancedMicro-controllerBusArchitecture)。AMBA定義了3組總線:先進高性能總線AHB(AdvancedHighperformanceBus);先進系統(tǒng)總線ASB(AdvancedSystemBus);先進外圍總線APB(AdvancedPeripheralBus)。通過AMBA可以方便地擴充各種處理器及I/O,可以把DSP、其他處理器和I/O(如UART、定時器和接口等)都集成在一塊芯片中;

ARM微處理器包括ARM7、ARM9、ARM9E、ARM10E、SecurCore、Cortex系列以及Intel的StrongARM、XScale和其它廠商基于ARM體系結(jié)構(gòu)的處理器,除了具有ARM體系結(jié)構(gòu)的共同特點以外,每一個系列的ARM微處理器都有各自的特點和應(yīng)用領(lǐng)域。

2.2ARM微處理器結(jié)構(gòu)

經(jīng)過近20年的發(fā)展,ARM體系結(jié)構(gòu)發(fā)展日趨成熟,功能越來越強,應(yīng)用領(lǐng)域越來越廣泛;從最初到現(xiàn)在,已經(jīng)有七個主要的版本:ARMv1,ARMv2,ARMv3,ARMv4,ARMv5,ARMv6,ARMv7;

ARMv1系列的CPU主要還是作為研究之用,后面幾種都得到了較為廣泛的應(yīng)用;特別是ARMv4系列的CPU目前仍然是ARM芯片的主要開發(fā)版本;

ARM公司開發(fā)了很多系列的ARM處理器核,目前最新的系列已經(jīng)是ARM11了,而ARM6核以及更早的系列已經(jīng)很罕見了。目前應(yīng)用比較廣泛的系列是:ARM7ARM9ARM9EARM10SecurCoreXscaleARM7微處理器系列

該系列包括ARM7TDMI、ARM7TDMI-S、帶有高速緩存處理器宏單元的ARM720T和擴充了Jazelle的ARM7EJ-S。

ARM7系列廣泛應(yīng)用于多媒體和嵌入式設(shè)備,包括Internet設(shè)備、網(wǎng)絡(luò)和調(diào)制解調(diào)器設(shè)備,以及移動電話、PDA等無線設(shè)備。

ARM7TDMI基于體系結(jié)構(gòu)V4版本,支持32位尋址范圍;

ARM7TDMI的后綴意義為:支持高密度16位的Thumb指令集;支持片上調(diào)試;支持64位乘法;支持EmbededICE觀察硬件;ARM7TDMI的可綜合(synthesizable)版本(軟核),對應(yīng)用工程師來說其編程模型與ARM7TDMI一致;ARM7TDMI-SARM7芯片示例

ARM9微處理器系列

ARM9系列微處理器在高性能和低功耗特性方面提供最佳的性能,具有以下特點:5級整數(shù)流水線,指令執(zhí)行效率更高;基于體系結(jié)構(gòu)V4版本提供1.1MIPS/MHZ的哈佛結(jié)構(gòu),支持數(shù)據(jù)Cache和指令Cache,具有更高的的指令和數(shù)據(jù)處理能力;全性能的MMU支持WindowsCE、Linux、PalmOs等多種主流嵌入式操作系統(tǒng);

應(yīng)用領(lǐng)域:無線設(shè)備、儀器儀表、安全系統(tǒng)、機頂盒等

ARM10系列微處理器

該系列包括ARM1020E和ARM1022E處理器核,其核心在于使用向量浮點(VFP)單元VFP10提供高性能的浮點解決方案,從而極大提高了處理器的整型和浮點運算性能。可以用于視頻游戲機和高性能打印機等場合。SecurCore內(nèi)核系列

該系列涵蓋了SC100、SC110、SC200和SC210處理器核。該系列處理器主要針對新興的安全市場,以一種全新的安全處理器設(shè)計為智能卡和其它安全IC開發(fā)提供獨特的32位系統(tǒng)設(shè)計,并具有特定反偽造方法,從而有助于防止對硬件和軟件的盜版。StrongARM微處理器系列

InterStrongARMSA-1100處理器是采用ARM體系結(jié)構(gòu)高度集成的32位RISC微處理器;它融合了Inter公司的設(shè)計和處理技術(shù)以及ARM體系結(jié)構(gòu)的電源效率,采用在軟件上兼容ARMv4體系結(jié)構(gòu)、同時采用具有Intel技術(shù)優(yōu)點的體系結(jié)構(gòu);已成功應(yīng)用于多家公司的掌上電腦系列產(chǎn)品;Xscale處理器

Scale處理器是基于ARMv5TE體系結(jié)構(gòu)的解決方案,是一款全性能、高性價比、低功耗的處理器;Xscale

處理器是Intel目前主要推廣的一款A(yù)RM微處理器;2.3ARM微處理器的寄存器結(jié)構(gòu)ARM處理器共有37個寄存器,被分為若干個組(BANK),這些寄器包括:31個通用寄存器,包括程序計數(shù)器(PC指針),均為32位的寄存器。6個狀態(tài)寄存器,用以標(biāo)識CPU的工作狀態(tài)及程序的運行狀態(tài),均為32位,目前只使用了其中的一部分。2.3.1處理器運行模式ARM微處理器支持7種運行模式,分別為:usr(用戶模式):ARM處理器正常程序執(zhí)行模式。fiq(快速中斷模式):用于高速數(shù)據(jù)傳輸或通道處理irq(外部中斷模式):用于通用的中斷處理svc(管理模式):操作系統(tǒng)使用的保護模式abt(數(shù)據(jù)訪問終止模式):當(dāng)數(shù)據(jù)或指令預(yù)取終止時進入該模式,可用于虛擬存儲及存儲保護。sys(系統(tǒng)模式):運行具有特權(quán)的操作系統(tǒng)任務(wù)。und(未定義指令中止模式):當(dāng)未定義的指令執(zhí)行時進入該模式,可用于支持硬件協(xié)處理器的軟件仿真。

注:大多數(shù)的應(yīng)用程序運行在用戶模式下,當(dāng)處理器運行在用戶模式下時,某些被保護的系統(tǒng)資源是不能被訪問的。

特權(quán)模式

異常模式

用戶與系統(tǒng)模式2.3.2處理器工作狀態(tài)

ARM處理器有32位ARM和16位Thumb兩種工作狀態(tài)。在32位ARM狀態(tài)下執(zhí)行字對齊的ARM指令在16位Thumb狀態(tài)下執(zhí)行半字對齊的Thumb指令在Thumb狀態(tài)下,程序計數(shù)器PC(ProgramCounter)使用位[1]選擇另一個半字。

注意:

兩個狀態(tài)之間的切換并不影響處理器模式或寄存器內(nèi)容。

使用BX指令將ARM內(nèi)核的操作狀態(tài)在ARM狀態(tài)和Thumb狀態(tài)之間進行切換,程序如下所示。;從Arm狀態(tài)切換到Thumb狀態(tài)

LDRR0,=Lable+1BXR0;從Thumb狀態(tài)切換到ARM狀態(tài)

LDRR0,=LableBXR0地址最低位為1,表示切換到Thumb狀態(tài)地址最低位為0,表示切換到ARM狀態(tài)跳轉(zhuǎn)地址標(biāo)號2.3.3ARM處理器的寄存器組織

ARM處理器的37個寄存器被安排成部分重疊的組,不能在任何模式都可以使用,寄存器的使用與處理器狀態(tài)和工作模式有關(guān)。如圖2.3.1所示,每種處理器模式使用不同的寄存器組。其中15個通用寄存器(R0~R14)、1或2個狀態(tài)寄存器和程序計數(shù)器是通用的。31個通用32位寄存器,包括程序計數(shù)器PC:未分組寄器R0-R7;分組寄存器R8-R14;程序計數(shù)器PC(R15);6個狀態(tài)寄存器;可訪問的寄存器取決于處理器的模式寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統(tǒng)管理中止未定義中斷快中斷通用寄存器和程序計數(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一般的通用寄存器

寄存器R13、R14分別有6個分組的物理寄存器。一個用于用戶和系統(tǒng)模式,其余5個分別用于5種異常模式。R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13Lable程序A程序BR14R14寄存器與子程序調(diào)用:BLLable地址A???MOVPC,LRR14(地址A)Lable???1.程序A執(zhí)行過程中調(diào)用程序B;操作流程2.程序跳轉(zhuǎn)至標(biāo)號Lable,執(zhí)行程序B。同時硬件將“BLLable”指令的下一條指令所在地址存入R14;3.程序B執(zhí)行最后,將R14寄存器的內(nèi)容放入PC,返回程序A;讀R15的限制

正常操作時,從R15讀取的值是處理器正在取指的地址,即當(dāng)前正在執(zhí)行指令的地址加上8個字節(jié)(兩條ARM指令的長度)。LDRR0,PC??????PCPC-4PC-8正在執(zhí)行正在譯碼正在取指流水線狀態(tài)地址程序代碼程序狀態(tài)寄存器(CPSR)

ARM內(nèi)核包含1個CPSR和5個供異常處理程序使用的SPSR。CPSR反映了當(dāng)前處理器的狀態(tài),其包含:4個條件代碼標(biāo)志(負(N)、零(Z)、進位(C)和溢出(V);2個中斷禁止位,分別控制一種類型的中斷;5個對當(dāng)前處理器模式進行編碼的位;1個用于指示當(dāng)前執(zhí)行指令(ARM還是Thumb)的位。

每個異常模式還帶有一個程序狀態(tài)保存寄存器(SPSR),它用于保存在異常事件發(fā)生之前的CPSR。CPSR和SPSR通過特殊指令進行訪問。注意:如果通過程序修改CPSR寄存器中的模式位進入異常模式,那么硬件將不會把CPSR保存至SPSR中.條件代碼標(biāo)志

大多數(shù)“數(shù)值處理指令”可以選擇是否影響條件代碼標(biāo)志位。通常如果指令帶S后綴,則該指令的執(zhí)行會影響條件代碼標(biāo)志;但有一些指令的執(zhí)行總是會影響條件代碼標(biāo)志(比如CMP、TST、TEQ等)。

N、Z、C和V位都是條件代碼標(biāo)志。通過算術(shù)操作、邏輯操作、MSR或者LDM指令可以對這些位進行設(shè)置。所有ARM指令都可按條件來執(zhí)行,而Thumb指令中只有分支指令可按條件執(zhí)行。舉例:

ADDR0,R0,R1ADDSR0,R0,R1ADDEQSR0,R0,R1控制位

CPSR的最低8位為控制位,當(dāng)發(fā)生異常時,這些位被硬件改變。當(dāng)處理器處于一個特權(quán)模式時,可用軟件操作這些位。

它們分別是:中斷禁止位;T位;模式位。中斷禁止位包括I和F位:當(dāng)I位置位時,IRQ中斷被禁止;當(dāng)F位置位時,F(xiàn)IQ中斷被禁止。T位反映了正在操作的狀態(tài):當(dāng)T位置位時,處理器正在Thumb狀態(tài)下運行;當(dāng)T位清零時,處理器正在ARM狀態(tài)下運行。模式位包括M4、M3、M2、M1和M0,這些位決定處理器的操作模式。程序狀態(tài)寄存器

條件位:N=1-結(jié)果為負,0-結(jié)果為正或0Z=1-結(jié)果為0,0-結(jié)果不為0C=1-進位,0-借位V=1-結(jié)果溢出,0結(jié)果沒溢出Q位:僅ARM5TE/J架構(gòu)支持指示增強型DSP指令是否溢出J位僅ARM5TE/J架構(gòu)支持J=1:處理器處于Jazelle狀態(tài)中斷禁止位:I=1:禁止IRQ.F=1:禁止FIQ.TBit僅ARMxT架構(gòu)支持T=0:處理器處于ARM狀態(tài)T=1:處理器處于Thumb狀態(tài)Mode位(處理器模式位):0b10000 User0b10001 FIQ0b10010 IRQ0b10011 Supervisor0b10111 Abort0b11011 Undefined0b11111 System2731NZCVQ2867IFTmode1623

815

54024fsxc

UndefinedJ2.4ARM微處理器的異常處理

在一個正常的程序流程執(zhí)行過程中,由內(nèi)部或外部源產(chǎn)生的一個事件使正常的程序產(chǎn)生暫時的停止時,稱之為異常。在處理異常之前,當(dāng)前處理器的狀態(tài)必須保留,當(dāng)異常處理完成之后,恢復(fù)保留的當(dāng)前處理器狀態(tài),繼續(xù)執(zhí)行當(dāng)前程序。多個異常同時發(fā)生時,處理器將會按固定的優(yōu)先級進行處理。2.4.1ARM體系結(jié)構(gòu)的異常類型

ARM體系結(jié)構(gòu)支持7種類型的異常,異常類型、異常處理模式和優(yōu)先級如表2.4.1所示。異常出現(xiàn)后,強制從異常類型對應(yīng)的固定存儲器地址開始執(zhí)行程序。這些固定的地址稱為異常向量(ExceptionVectors)。異常類型異常進入模式地址(異常向量)優(yōu)先級復(fù)位復(fù)位管理模式0x0000,00001(最高)未定義指令未定義指令未定義模式0x0000,00046(最低)軟件中斷軟件中斷管理模式0x0000,00086(最低)指令預(yù)取中止中止(預(yù)取指令)中止模式0x0000,000C5數(shù)據(jù)中止中止(數(shù)據(jù))中止模式0x0000,00102IRQ(外部中斷請求)IRQIRQ0x0000,00184FIQ(快速中斷請求)FIQFIQ0x0000,001C3表2.4.1ARM體系結(jié)構(gòu)的異常類型和異常處理模式2.4.2異常類型的含義(1)復(fù)位當(dāng)處理器的復(fù)位電平有效時,產(chǎn)生復(fù)位異常,ARM處理器立刻停止執(zhí)行當(dāng)前指令。復(fù)位后,ARM處理器在禁止中斷的管理模式下,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行(從地址0x00000000或0xFFFF0000開始執(zhí)行指令)。(2)未定義指令異常當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時,產(chǎn)生未定義指令異常。當(dāng)ARM處理器執(zhí)行協(xié)處理器指令時,它必須等待任一外部協(xié)處理器應(yīng)答后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有響應(yīng),就會出現(xiàn)未定義指令異常。若試圖執(zhí)行未定義的指令,也會出現(xiàn)未定義指令異常。未定義指令異常可用于在沒有物理協(xié)處理器(硬件)的系統(tǒng)上,對協(xié)處理器進行軟件仿真,或在軟件仿真時進行指令擴展。(3)軟件中斷異常(SoftWareInterrupt,SWI)軟件中斷異常由執(zhí)行SWI指令產(chǎn)生,可使用該異常機制實現(xiàn)系統(tǒng)功能調(diào)用,用于用戶模式下的程序調(diào)用特權(quán)操作指令,以請求特定的管理(操作系統(tǒng))函數(shù)。(4)指令預(yù)取中止若處理器預(yù)取指令的地址不存在,或該地址不允許當(dāng)前指令訪問,存儲器會向處理器發(fā)出存儲器中止(Abort)信號,但當(dāng)預(yù)取的指令被執(zhí)行時,才會產(chǎn)生指令預(yù)取中止異常。(5)數(shù)據(jù)中止(數(shù)據(jù)訪問存儲器中止)若處理器數(shù)據(jù)訪問指令的地址不存在,或該地址不允許當(dāng)前指令訪問時,產(chǎn)生數(shù)據(jù)中止異常。存儲器系統(tǒng)發(fā)出存儲器中止信號。響應(yīng)數(shù)據(jù)訪問(加載或存儲)激活中止,標(biāo)記數(shù)據(jù)為無效。在后面的任何指令或異常改變CPU狀態(tài)之前,數(shù)據(jù)中止異常發(fā)生。(6)外部中斷請求(IRQ)異常當(dāng)處理器的外部中斷請求引腳有效,且CPSR中的I位為0時,產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過該異常請求中斷服務(wù)。IRQ異常的優(yōu)先級比FIQ異常的低。當(dāng)進入FIQ處理時,會屏蔽掉IRQ異常。(7)快速中斷請求(FIQ)異常當(dāng)處理器的快速中斷請求引腳有效,且CPSR中的F位為0時,產(chǎn)生FIQ異常。FIQ支持數(shù)據(jù)傳送和通道處理,并有足夠的私有寄存器。2.4.3異常的響應(yīng)過程當(dāng)一個異常出現(xiàn)以后,ARM微處理器會執(zhí)行以下幾步操作:①將下一條指令的地址存入相應(yīng)連接寄存器LR,以便程序在處理異常返回時能從正確的位置重新開始執(zhí)行。若異常是從ARM狀態(tài)進入,LR寄存器中保存的是下一條指令的地址(當(dāng)前PC+4或PC+8,與異常的類型有關(guān));若異常是從Thumb狀態(tài)進入,則在LR寄存器中保存當(dāng)前PC的偏移量。②將CPSR狀態(tài)傳送到相應(yīng)的SPSR中。③根據(jù)異常類型,強制設(shè)置CPSR的運行模式位。④強制PC從相關(guān)的異常向量地址取下一條指令執(zhí)行,跳轉(zhuǎn)到相應(yīng)的異常處理程序。還可以設(shè)置中斷禁止位,以禁止中斷發(fā)生。注:異常總是在ARM狀態(tài)中進行處理。如果異常發(fā)生時,處理器處于Thumb狀態(tài),則當(dāng)異常向量地址加載入PC時,處理器自動切換到ARM狀態(tài)。

異常處理完畢之后,ARM微處理器會執(zhí)行以下幾步操作從異常返回:①將連接寄存器LR的值減去相應(yīng)的偏移量后送到PC中。②將SPSR內(nèi)容送回CPSR中。③若在進入異常處理時設(shè)置了中斷禁止位,要在此清除。可以認為應(yīng)用程序總是從復(fù)位異常處理程序開始執(zhí)行的,因此復(fù)位異常處理程序不需要返回。注:恢復(fù)CPSR的動作會將T、F和I位自動恢復(fù)為異常發(fā)生前的值。程序AIRQ服務(wù)程序系統(tǒng)模式IRQ模式程序寄存器組圖示進入異常過程1.程序在系統(tǒng)模式下運行用戶程序,假定當(dāng)前處理器狀態(tài)為Thumb狀態(tài)、允許IRQ中斷;2.用戶程序運行時發(fā)生IRQ中斷,硬件完成以下動作:LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV置位I位(禁止IRQ中斷)清零T位(進入ARM狀態(tài))設(shè)置MOD位,切換處理器模式至IRQ模式將下一條指令的地址存入IRQ模式的LR寄存器將CPSR寄存器內(nèi)容存入IRQ模式的SPSR寄存器將跳轉(zhuǎn)地址存入PC,實現(xiàn)跳轉(zhuǎn)IRQ0?1...????BackAddrJumpAddrJumpSYS1?0...????“?”表示對該位不關(guān)心在異常處理結(jié)束后,異常處理程序完成以下動作:程序AIRQ服務(wù)程序系統(tǒng)模式IRQ模式程序寄存器組圖示退出異常過程LR_sysSPSR_irqLR_irqLRPCCPSRSPSRSYS1?0...????MODTFI...NZCV將SPSR寄存器的值復(fù)制回CPSR寄存器;將LR寄存的值減去一個常量后復(fù)制到PC寄存器,跳轉(zhuǎn)到被中斷的用戶程序。IRQ0?1...????BackAddrJumpAddrreturnSYS1?0...????SYS1?0...????BackAddr-4Jump“?”表示對該位不關(guān)心

當(dāng)多個異常同時發(fā)生時,一個固定的優(yōu)先級系統(tǒng)決定它們被處理的順序:異常優(yōu)先級異常類型優(yōu)先級復(fù)位1(最高優(yōu)先級)數(shù)據(jù)中止2FIQ3IRQ4預(yù)取中止5未定義指令6SWI7(最低優(yōu)先級)優(yōu)先級降低2.4.4應(yīng)用程序中的異常處理

在應(yīng)用程序的設(shè)計中,異常處理采用的方式是在異常向量表中的特定位置放置一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序。當(dāng)ARM處理器發(fā)生異常時,程序計數(shù)器PC會被強制設(shè)置為對應(yīng)的異常向量,從而跳轉(zhuǎn)到異常處理程序,當(dāng)異常處理完成以后,返回到主程序繼續(xù)執(zhí)行。2.5ARM微處理器指令系統(tǒng)

2.5.1基本尋址方式

尋址方式是根據(jù)指令中給出的地址碼字段來實現(xiàn)尋找真實操作數(shù)地址的方式。ARM處理器具有9種基本尋址方式。1.寄存器尋址; 2.立即尋址;3.寄存器移位尋址; 4.寄存器間接尋址;5.基址尋址; 6.多寄存器尋址;7.堆棧尋址; 8.塊拷貝尋址;9.相對尋址。操作數(shù)的值在寄存器中,指令中的地址碼字段指出的是寄存器編號,指令執(zhí)行時直接取出寄存器值來操作。寄存器尋址指令舉例如下:MOVR1,R2 ;將R2的值存入R1SUBR0,R1,R2;將R1的值減去R2的值,結(jié)果保存到R0

0xAA0x55R2R11.寄存器尋址MOVR1,R20xAA立即尋址指令中的操作碼字段后面的地址碼部分即是操作數(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程序存儲2.立即尋址MOVR0,#0xFF000xFF00從代碼中獲得數(shù)據(jù)寄存器移位尋址是ARM指令集特有的尋址方式。當(dāng)?shù)?個操作數(shù)是寄存器移位方式時,第2個寄存器操作數(shù)在與第1個操作數(shù)結(jié)合之前,選擇進行移位操作。寄存器移位尋址指令舉例如下:MOV R0,R2,LSL#3

;R2的值左移3位,結(jié)果放入R0, ;即是R0=R2×8ANDS R1,R1,R2,LSLR3

;R2的值左移R3位,然后和R1相 ;“與”操作,結(jié)果放入R1,并影響標(biāo)志位0x55R0R20x013.寄存器移位尋址MOVR0,R2,LSL#30x080x08邏輯左移3位寄存器間接尋址指令中的地址碼給出的是一個通用寄存器的編號,所需的操作數(shù)保存在寄存器指定地址的存儲單元中,即寄存器為操作數(shù)的地址指針。寄存器間接尋址指令舉例如下:LDR R1,[R2] ;將R2指向的存儲單元的數(shù)據(jù)讀出,保存在R1中

SWP R1,R1,[R2] ;將寄存器R1的值和R2指定的存儲

;單元的內(nèi)容交換

0x55R0R20x400000000xAA0x400000004.寄存器間接尋址LDRR0,[R2]0xAA

基址尋址就是將基址寄存器的內(nèi)容與指令中給出的偏移量相加,形成操作數(shù)的有效地址。基址尋址用于訪問基址附近的存儲單元,常用于查表、數(shù)組操作、功能部件寄存器訪問等。基址尋址指令舉例如下:LDR R2,[R3,#0x0C];讀取R3+0x0C地址上的存儲單元的內(nèi)容,放入R2STR R1,[R0,#-4]! ;先R0=R0-4,然后把R1的值寄存

;到保存到R0指定的存儲單元5.基址尋址0x55R2R30x400000000xAA0x4000000CLDRR2,[R3,#0x0C]0xAA將R3+0x0C作為地址裝載數(shù)據(jù)

多寄存器尋址一次可傳送幾個寄存器值,允許一條指令傳送16個寄存器的任何子集或所有寄存器。多寄存器尋址指令舉例如下:LDMIA R1!,{R2-R7,R12};將R1指向的單元中的數(shù)據(jù)讀出到

R2~R7、R12中(R1自動加1)STMIA R0!,{R2-R7,R12};將寄存器R2~R7、R12的值保

;存到R0指向的存儲單元中

;(R0自動加1)注:使用多寄存器尋址指令時,寄存器子集的順序是由小到大排列,連續(xù)的寄存器用“-”連接,否則用“,”分隔書寫。0x40000000R1R20x??0x010x400000000x??R3R40x??R60x??0x020x030x040x400000040x400000080x4000000C存儲器6.多寄存器尋址LDMIAR1!,{R2-R4,R6}0x010x020x030x040x40000000

堆棧是一個按特定順序進行存取的存儲區(qū),操作順序為“后進先出”和“先進后出”。堆棧尋址是隱含的,它使用一個專門的寄存器(堆棧指針)指向一塊存儲區(qū)域(堆棧),指針?biāo)赶虻拇鎯卧词嵌褩5臈m敗4鎯ζ鞫褩?煞譃閮煞N:向上生長:向高地址方向生長,稱為遞增堆棧向下生長:向低地址方向生長,稱為遞減堆棧7.堆棧尋址棧底棧頂棧區(qū)SP

堆棧存儲區(qū)棧頂棧底棧區(qū)

SP向下增長向上增長0x123456780x12345678堆棧壓棧堆棧壓棧棧頂SP

棧頂SP

棧底空堆棧棧底滿堆棧

堆棧指針指向最后壓入的堆棧的有效數(shù)據(jù)項,稱為滿堆棧;堆棧指針指向下一個待壓入數(shù)據(jù)的空位置,稱為空堆棧。0x123456780x12345678棧頂SP

0x12345678棧頂SP

壓棧壓棧所以可以組合出四種類型的堆棧方式:滿遞增:堆棧向上增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最高地址。指令如LDMFA、STMFA等;空遞增:堆棧向上增長,堆棧指針指向堆棧上的第一個空位置。指令如LDMEA、STMEA等;滿遞減:堆棧向下增長,堆棧指針指向內(nèi)含有效數(shù)據(jù)項的最低地址。指令如LDMFD、STMFD等;空遞減:堆棧向下增長,堆棧指針向堆棧下的第一個空位置。指令如LDMED、STMED等。

快拷貝尋址指令用于將一塊數(shù)據(jù)從存儲器的某一位置拷貝到另一位置。如:STMIA R0!,{R1-R7} ;將R1~R7的數(shù)據(jù)保存到存儲器中。

;存儲指針在保存第一個值之后增加,增長方向為向上增長;STMIB R0!,{R1-R7} ;將R1~R7的數(shù)據(jù)保存到存儲器中。

;存儲指針在保存第一個值之前增加,增長方向為向上增長

8.塊拷貝尋址相對尋址是基址尋址的一種變通。由程序計數(shù)器PC提供基準(zhǔn)地址,指令中的地址碼字段作為偏移量,兩者相加后得到的地址即為操作數(shù)的有效地址。相對尋址指令舉例如下:

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

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

...LOOP MOV R6,#1 ...SUBR1 ...9.相對尋址簡單的ARM程序:;文件名:TEST1.S

;功能:實現(xiàn)兩個寄存器相加;說明:使用ARMulate軟件仿真調(diào)試

AREA Example1,CODE,READONLY ;聲明代碼段Example1 ENTRY ;標(biāo)識程序入口,相當(dāng)于main() 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é)束,必須與entry配合使用使用“;”進行注釋標(biāo)號頂格寫實際代碼段聲明文件結(jié)束2.5.2ARM指令集1.指令格式(1)基本格式

ARM指令的基本格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

其中<>號內(nèi)的項是必須的,{}號內(nèi)的項是可選的。各項的說明如下:opcode:指令助記符; cond:執(zhí)行條件;S:是否影響CPSR寄存器的值;Rd:目標(biāo)寄存器; Rn:第1個操作數(shù)的寄存器;operand2:第2個操作數(shù);

ARM指令的基本格式如下:ARM指令集——第2個操作數(shù):<opcode>{<cond>}{S}<Rd>,<Rn>{,<operand2>}

靈活的使用第2個操作數(shù)“operand2”能夠提高代碼效率。它有如下的形式:Rm——寄存器方式;Rm,shift——寄存器移位方式;Rm——寄存器方式在寄存器方式下,操作數(shù)即為寄存器的數(shù)值。例如:SUB R1,R1,R2MOV PC,R0Rm,shift——寄存器移位方式將寄存器的移位結(jié)果作為操作數(shù),但Rm值保持不變,移位方法如下:操作碼說明操作碼說明ASR#n算術(shù)右移n位ROR#n循環(huán)右移n位LSL#n邏輯左移n位RRX帶擴展的循環(huán)右移1位LSR#n邏輯右移n位TypeRsType為移位的一種類型,Rs為偏移量寄存器,低8位有效。Rm,shift——寄存器移位方式例如:

ADD R1,R1,R1,LSL#3 ;R1=R1+R1*8=9R1SUB R1,R1,R2,LSRR3 ;R1=R1-(R2/2R3)(2)條件碼幾乎所有的ARM指令都包含一個可選擇的條件碼,即{<cond>}。使用指令條件碼,可實現(xiàn)高效的邏輯操作,提高代碼效率。當(dāng)處理器工作在ARM狀態(tài)時,幾乎所有的指令均根據(jù)CPSR中條件碼的狀態(tài)和指令的條件域有條件的執(zhí)行。當(dāng)指令的執(zhí)行條件滿足時,指令被執(zhí)行,否則指令被忽略。每一條ARM指令包含4位的條件碼,位于指令的最高4位[31:28]。條件碼共有16種,每種條件碼可用兩個字符表示,這兩個字符可以添加在指令助記符的后面和指令同時使用。例如,跳轉(zhuǎn)指令B可以加上后綴EQ變?yōu)锽EQ表示“相等則跳轉(zhuǎn)”,即當(dāng)CPSR中的Z標(biāo)志置位時發(fā)生跳轉(zhuǎn)。ARM條件碼如表2.5.1所示。表2.5.1ARM條件碼操作碼條件助記符標(biāo)志含義0000EQZ=1相等0001NEZ=0不相等0010CS/HSC=1無符號數(shù)大于或等于0011CC/LOC=0無符號數(shù)小于0100MIN=1負數(shù)0101PLN=0正數(shù)或零0110VSV=1溢出0111VCV=0沒有溢出1000HIC=1,Z=0無符號數(shù)大于1001LSC=0,Z=1無符號數(shù)小于或等于1010GEN=V有符號數(shù)大于或等于

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

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

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

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

(指令默認條件)1111NV任何從不執(zhí)行(不要使用)條件碼應(yīng)用舉例比較兩個值大小,并進行相應(yīng)加1處理C代碼為:If(a>b)a++;Elseb++;對應(yīng)的ARM指令為(其中R0為a,R1為b)CMPR0,R1ADDHIR0,R0,#1ADDLSR1,R1,#1若兩個條件均成立,則將這兩個數(shù)相加C代碼為:If((a!=10)&&(b!=20))a=a+b;對應(yīng)ARM指令為:CMPR0,#10CMPNER1,#20ADDNER0,R0,R12.ARM存儲器訪問指令

ARM微處理器支持加載/存儲指令用于在寄存器和存儲器之間傳送數(shù)據(jù),加載指令用于將存儲器中的數(shù)據(jù)傳送到寄存器,存儲指令則完成相反的操作。

ARM的加載/存儲指令是可以實現(xiàn)字、半字、,無符/有符字節(jié)操作;批量加載/存儲指令可實現(xiàn)一條指令加載/存儲多個寄存器的內(nèi)容.SWP指令是一條寄存器和存儲器內(nèi)容交換的指令,可用于信號量操作等。

ARM存儲訪問指令表如表2.5.2所示。助記符說明操作條件碼位置LDRRd,addressing

加載字數(shù)據(jù)

Rd←[addressing],addressing

索引

LDR{cond}LDRBRd,addressing

加載無符字節(jié)數(shù)據(jù)

Rd←[addressing],addressing

索引

LDR{cond}B

LDRTRd,addressing以用戶模式加載字數(shù)據(jù)

Rd←[addressing],addressing

索引

LDR{cond}T

LDRBTRd,addressing以用戶模式加載無符號字數(shù)據(jù)

Rd←[addressing],addressing

索引LDR{cond}BT

LDRHRd,addressing加載無符半字數(shù)據(jù)

Rd←[addressing],addressing

索引

LDR{cond}H

表2.5.2ARM存儲訪問指令表STRBRd,addressing存儲字節(jié)數(shù)據(jù)

[addressing]←Rd,addressing

索引

STR{cond}B

STRTRd,addressing以用戶模式存儲字數(shù)據(jù)

[addressing]←Rd,addressing

索引

STR{cond}T

SRTBTRd,addressing以用戶模式存儲字節(jié)數(shù)據(jù)

[addressing]←Rd,addressing

索引

STR{cond}BT

STRHRd,addressing存儲半字數(shù)據(jù)

[addressing]←Rd,addressing

索引

STR{cond}H

LDM{mode}Rn{!},reglist

批量(寄存器)加載

reglist←[Rn…],Rn

回存等

LDM{cond}{more}STM{mode}Rn{!},rtglist

批量(寄存器)存儲

[Rn…]←reglist,Rn

回存等

STM{cond}{more}SWPRd,Rm,Rn

寄存器和存儲器字數(shù)據(jù)交換

Rd←[Rd],[Rn]←[Rm](Rn≠Rd

或Rm)SWP{cond}SWPBRd,Rm,Rn

寄存器和存儲器字節(jié)數(shù)據(jù)交換

Rd←[Rd],[Rn]←[Rm](Rn≠Rd

或Rm)SWP{cond}B

LDR和STR單寄存器加載/存儲指令

LDR指令用于從內(nèi)存中讀取單一字或字節(jié)數(shù)據(jù)存入寄存器中,STR指令用于將寄存器中的單一字或字節(jié)數(shù)據(jù)保存到內(nèi)存。指令格式如下:

LDR{cond}{T} Rd,<地址>;將指定地址上的字數(shù)據(jù)讀入RdSTR{cond}{T} Rd,<地址>;將Rd中的字數(shù)據(jù)存入指定地址

LDR{cond}B{T} Rd,<地址>;將指定地址上的字節(jié)數(shù)據(jù)讀入RdSTR{cond}B{T} Rd,<地址>;將Rd中的字節(jié)數(shù)據(jù)存入指定地址

其中,T為可選后綴。若指令有T,那么即使處理器是在特權(quán)模式下,存儲系統(tǒng)也將訪問看成是在用戶模式下進行的。T在用戶模式下無效,不能與前索引偏移一起使用T。

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

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

從尋址方式的地址計算方法分,加載/存儲指令有以下4種格式:

零偏移,Rn的值作為傳送數(shù)據(jù)的地址,即地址偏移量為0。

如:LDRRd,[Rn]前索引偏移。在數(shù)據(jù)傳送前,將偏移量加到Rn中,其結(jié)果作為傳送數(shù)據(jù)的存儲地址。若使用“!”號,則結(jié)果寫回Rn中。

如:LDRRd,[Rn,#0x04]!程序相對偏移。匯編器由PC計算偏移量,并將PC作為Rn生成前索引指令。如:LDRRd,labe1

后索引偏移。Rn的值用作傳送數(shù)據(jù)的存儲地址。在數(shù)據(jù)傳送后,將偏移量與Rn相加,結(jié)果寫回Rn中。 如:LDRRd,[Rn],#0x04LDM和STM多寄存器加載/存儲指令格式如下:LDM{cond}<模式>Rn{!},reglist{^}STM{cond}<模式>Rn{!},reglist{^}Rn:基址寄存器,裝有傳送數(shù)據(jù)的初始地址;模式:控制地址的增長方式,一共有8種模式;!:表示在操作結(jié)束后,將最后的地址寫回Rn中;reglist

:表示寄存器列表,可以包含多個寄存器,它們使用“,”隔開,如{R1,R2,R6-R9},寄存器由小到大排列;^:加入該后綴后,進行數(shù)據(jù)傳送且寄存器列表不包含PC時,加載/存儲的寄存器是用戶模式下的,而不是當(dāng)前模式的寄存器。若在LDM指令且寄存器列表中包含有PC時使用,那么除了正常的多寄存器傳送外,還將CPSR也拷貝到SPSR中,這可用于異常處理返回。注意:該后綴不允許在用戶模式或系統(tǒng)模式下使用。

多寄存器加載/存儲指令的8種模式如下表所示,右邊四種為堆棧操作、左邊四種為數(shù)據(jù)傳送操作。模式說明模式說明IA每次傳送后地址加4FD滿遞減堆棧IB每次傳送前地址加4ED空遞減堆棧DA每次傳送后地址減4FA滿遞增堆棧DB每次傳送前地址減4EA空遞增堆棧數(shù)據(jù)塊傳送操作堆棧操作助記符說明操作條件碼位置SWPRd,Rm,Rn

寄存器和存儲器字數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}SWPBRd,Rm,Rn

寄存器和存儲器字節(jié)數(shù)據(jù)交換Rd←[Rn],[Rn]←Rm(Rn≠Rd或Rm)SWP{cond}B

SWP指令用于將一個內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個寄存器Rd中,同時將另一個寄存器Rm的內(nèi)容寫入到該內(nèi)存單元中。使用SWP可實現(xiàn)信號量操作。指令格式如下:SWP{cond}{B}Rd,Rm,[Rn]

其中,B為可選后綴,若有B,則交換字節(jié),否則交換32位字;Rd用于保存從存儲器中讀入的數(shù)據(jù);Rm的數(shù)據(jù)用于存儲到存儲器中,若Rm與Rn相同,則為寄存器與存儲器內(nèi)容進行交換;Rn為要進行數(shù)據(jù)交換的存儲器地址,Rn不能與Rd和Rm相同。

指令示例:

LDRR0,[R1];將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0。

LDRR0,[R1,R2];將存儲器地址為R1+R2的字數(shù)據(jù)讀入寄存器R0。

LDRR0,[R1,#8];將存儲器地址為R1+8的字數(shù)據(jù)讀入寄存器R0。

LDRR0,[R1,R2]!;將存儲器地址為R1+R2的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1。

LDRR0,[R1,#8]!;將存儲器地址為R1+8的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+8寫入R1。

LDRR0,[R1],R2;將存儲器地址為R1的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2寫入R1。

LDRR0,[R1,R2,LSL#2]!;將存儲器地址為R1+R2×4的字數(shù)據(jù)讀入寄存器R0,并將新地址R1+R2×4寫入R1。

LDRBR0,[R1,#8];將存儲器地址為R1+8的字節(jié)數(shù)據(jù)讀入寄存器R0,并將R0的高24位清零。

LDRHR0,[R1,R2];將存儲器地址為R1+R2的半字數(shù)據(jù)讀入寄存器R0,并將R0的高16位清零。STRR0,[R1],#8;將R0中的字數(shù)據(jù)寫入以R1為地址的存儲器中,并將新地址R1+8寫入R1。

STRBR0,[R1,#8];將寄存器R0中的字節(jié)數(shù)據(jù)寫入以R1+8為地址的存儲器中。

STRHR0,[R1];將寄存器R0中的半字數(shù)據(jù)寫入以R1為地址的存儲器中

STMFDR13!,{R0,R4-R12,LR};將寄存器列表中的寄存器(R0,R4到R12,LR)存入堆棧。

LDMFDR13!,{R0,R4-R12,PC};將堆棧內(nèi)容恢復(fù)到寄存器(R0,R4到R12,LR)。

SWPR0,R1,[R2];將R2所指向的存儲器中的字數(shù)據(jù)傳送到R0,同時將R1中的字數(shù)據(jù)傳送到R2所指向的存儲單元。3.ARM數(shù)據(jù)處理指令數(shù)據(jù)處理指令可分為數(shù)據(jù)傳送指令、算術(shù)邏輯運算指令和比較指令等。數(shù)據(jù)傳送指令用于在寄存器和存儲器之間進行數(shù)據(jù)的雙向傳輸。所有ARM數(shù)據(jù)處理指令均可選擇使用S后綴,以影響狀態(tài)標(biāo)志。比較指令不需要后綴S,它們會直接影響狀態(tài)標(biāo)志。算術(shù)邏輯運算指令完成常用的算術(shù)與邏輯的運算,該類指令不但將運算結(jié)果保存在目的寄存器中,同時更新CPSR中的相應(yīng)條件標(biāo)志位。比較指令不保存運算結(jié)果,只更新CPSR中相應(yīng)的條件標(biāo)志位。數(shù)據(jù)處理指令如表2.5.3所示。注意:數(shù)據(jù)處理指令只能對寄存器的內(nèi)容進行操作,不能對內(nèi)存中的數(shù)據(jù)進行處理。助記符號說明操作條件碼位置MOVRd,operand2數(shù)據(jù)傳送

Rd←operand2MOV{cond}{S}MVNRd,operand2數(shù)據(jù)取反傳送

Rd←(operand2)MVN{cond}{S}ADDRd,Rnoperand2加法運算指令

Rd←Rn+operand2ADD{cond}{S}SUBRd,Rnoperand2減法運算指令

Rd←Rn-operand2SUB{cond}{S}RSBRd,Rnoperand2逆向減法指令

Rd←operand2-RnRSB{cond}{S}ADCRd,Rnoperand2帶進位加法

Rd←Rn+operand2+carryADC{cond}{S}SBCRd,Rnoperand2帶進位減法指令

Rd←Rn-operand2-(NOT)CarrySBC{cond}{S}RSCRd,Rnoperand2帶進位逆向減法指令

Rd←operand2-Rn-(NOT)CarryRSC{cond}{S}表2.5.3數(shù)據(jù)處理指令表ANDRd,Rnoperand2邏輯與操作指令

Rd←Rn&operand2AND{cond}{S}ORRRd,Rnoperand2邏輯或操作指令

Rd←Rn|operand2ORR{cond}{S}EORRd,Rnoperand2邏輯異或操作指令

Rd←Rn^operand2EOR{cond}{S}BICRd,Rnoperand2位清除指令

Rd←Rn&(~operand2)BIC{cond}{S}CMPRn,operand2比較指令

標(biāo)志N、Z、C、V←Rn-operand2CMP{cond}CMNRn,operand2負數(shù)比較指令

標(biāo)志N、Z、C、V←Rn+operand2CMN{cond}TSTRn,operand2位測試指令

標(biāo)志N、Z、C、V←Rn&operand2TST{cond}TEQRn,operand2相等測試指令

標(biāo)志N、Z、C、V←Rn^operand2TEQ{cond}位清除指令——BIC指令將寄存器Rn的值與operand2的值的反碼按位作邏輯“與”操作,結(jié)果保存到Rd中。BIC{cond}{S}Rd,Rn,operand2比較指令——CMP指令將寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。CMP{cond} Rn,operand2位測試指令——TST指令將寄存器Rn的值與operand2的值按位作邏輯“與”操作,根據(jù)操作的結(jié)果更新CPSR中的相應(yīng)條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。TST{cond}Rn,operand2

指令示例:

MOVR1,R0;將寄存器R0的值傳送到寄存器R1MOVPC,R14;將寄存器R14的值傳送到PC,常用于子程序返回MOVR1,R0,LSL#3;將寄存器R0的值左移3位后傳送到R1MVNR0,#0xff;將立即數(shù)ff取反傳送到寄存器R0中,完成后R0=oxffffff00CMPR1,R0;將寄存器R1的值與寄存器R0的值相減,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位CMNR1,R0;將寄存器R1的值與寄存器R0的值相加,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位TSTR1,#0xffe;將寄存器R1的值與立即數(shù)0xffe按位與,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位TEQR1,R2;將寄存器R1的值與寄存器R2的值按位異或,并根據(jù)結(jié)果設(shè)置CPSR的標(biāo)志位

ADDR0,R1,R2;R0=R1+R2ADCSR1,R5,R9;加第二個字,帶進位SUBR0,R1,#256;R0=R1-256RSBR0,R1,R2;R0=R2–R1RSCR0,R1,R2;R0=R2–R1-!CANDR0,R0,#3;該指令保持R0的0、1位,其余位清零。ORRR0,R0,#3;該指令設(shè)置R0的0、1位,其余位保持不變。EORR0,R0,#3;該指令反轉(zhuǎn)R0的0、1位,其余位保持不變BICR1,R1,#0x0F

;將R1的低4位清零,其它位不變

4.ARM跳轉(zhuǎn)指令

在ARM中有兩種方式可以實現(xiàn)程序的跳轉(zhuǎn),一種是使用分支指令直接跳轉(zhuǎn),另一種則是直接向PC寄存器賦值實現(xiàn)跳轉(zhuǎn)。分支指令有以下三種:分支指令B;帶鏈接的分支指令BL;帶狀態(tài)切換的分支指令BX。助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}分支指令——B指令,該指令跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。一旦遇到一個B指令,ARM處理器直接跳轉(zhuǎn)到給定的地址。指令格式如下:

B{cond}Label

應(yīng)用示例:

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

B 0x1234 ;跳轉(zhuǎn)到絕對地址0x1234處

助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}帶鏈接的分支指令——BL指令適用于子程序調(diào)用,使用該指令后,下一條指令的地址被拷貝到R14(即LR)鏈接寄存器中,然后跳轉(zhuǎn)到指定地址運行程序。跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BL{cond}LabelBLLabelxxxxxxLabelxxxMOVPC,LRAddr1Addr2xxxxxxLRPCAddr1LabelAddr2Addr21.當(dāng)程序執(zhí)行到BL跳轉(zhuǎn)指令時,硬件將下一條指令的地址Addr2裝入LR寄存器,并把跳轉(zhuǎn)地址裝入程序計數(shù)器(PC)2.程序跳轉(zhuǎn)到目標(biāo)地址Label繼續(xù)執(zhí)行,當(dāng)子程序執(zhí)行結(jié)束后,將LR寄存器內(nèi)容存入PC,返回調(diào)用函數(shù)繼續(xù)執(zhí)行助記符說明操作條件碼位置Blabel分支指令PC←labelB{cond}BLlabel帶鏈接的分支指令LR←PC-4,PC←labelBL{cond}BXRm帶狀態(tài)切換的分支指令PC←label,切換處理器狀態(tài)BX{cond}帶狀態(tài)切換的分支指令——BX指令,該指令可以根據(jù)跳轉(zhuǎn)地址(Rm)的最低位來切換處理器狀態(tài)。其跳轉(zhuǎn)范圍限制在當(dāng)前指令的±32M字節(jié)地址內(nèi)。指令格式如下:BX{cond}Rm跳轉(zhuǎn)地址Rm[0]跳轉(zhuǎn)后CPSR標(biāo)志T位處理器狀態(tài)00ARM11Thumb6.ARM雜項指令

ARM指令集中有三條指令作為雜項指令,實際上這三條指令非常重要。它們?nèi)缦滤荆褐浄f明操作條件碼位置SWIimmed_24軟中斷指令產(chǎn)生軟中斷,處理器進入管理模式SWI{cond}MRSRd,psr讀狀態(tài)寄存器指令Rd←psr,psr為CPSR或SPSRMRS{cond}MSRpsr_fields,Rd/#immed_8r寫狀態(tài)寄存器指令psr_fields←Rd/#immed_8r,psr為CPSR或SPSRMSR{cond}

SWI指令用于產(chǎn)生軟中斷,從而實現(xiàn)由用戶模式變換到管理模式,并且將CPSR保存到管理模式的SPSR中,然后程序跳轉(zhuǎn)到SWI異常入口。在其它模式下也可使用SWI指令,處理器同樣地切換到管理模式。該指令主要用于用戶程序調(diào)用操作系統(tǒng)的系統(tǒng)服務(wù),操作系統(tǒng)在SWI異常處理程序中進行相應(yīng)的系統(tǒng)服務(wù)。SWI{cond} immed_24SWI

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論