ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具課件_第1頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具課件_第2頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具課件_第3頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具課件_第4頁(yè)
ARM32位單片機(jī)的結(jié)構(gòu)編程和開發(fā)工具課件_第5頁(yè)
已閱讀5頁(yè),還剩239頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第12章

ARM32位單片機(jī)的結(jié)構(gòu)、編程和開發(fā)工具11第12章

ARM32位單片機(jī)的結(jié)構(gòu)、編程和開發(fā)工具1112.1ARM內(nèi)核體系結(jié)構(gòu)12.2ARM編程模型12.3ARM匯編指令12.4ARM匯編程序設(shè)計(jì)12.5ARM程序開發(fā)工具ADS

本章內(nèi)容212.1ARM內(nèi)核體系結(jié)構(gòu)本章內(nèi)容212.1ARM內(nèi)核體系結(jié)構(gòu)ARM是一類微處理器,同時(shí)也是一個(gè)公司的名字。ARM公司于1990年11月在英國(guó)劍橋成立(原名AdvancedRISCMachine),專門從事基于RISC技術(shù)的芯片設(shè)計(jì)、開發(fā)和授權(quán)。目前,ARM處理器(即采用ARMIP核的處理器)已遍及工業(yè)控制、通信系統(tǒng)、無線通訊、網(wǎng)絡(luò)系統(tǒng)、消費(fèi)類電子產(chǎn)品、成像和安全產(chǎn)品等各類產(chǎn)品市場(chǎng)。截止到2012年,基于ARM技術(shù)設(shè)計(jì)的處理器已經(jīng)占據(jù)32位RISC微處理器約80%以上的市場(chǎng)份額,ARM技術(shù)正在逐步滲入到我們生活的各方面。312.1ARM內(nèi)核體系結(jié)構(gòu)ARM是一類微處ARM處理器是第一個(gè)為商業(yè)用途開發(fā)的RISC微處理器。ARM所采用的體系結(jié)構(gòu)對(duì)于傳統(tǒng)的RISC體系結(jié)構(gòu)既有繼承,又有舍棄和發(fā)展,即完全根據(jù)實(shí)際設(shè)計(jì)的需要仔細(xì)研究,沒有機(jī)械照搬。最初的ARM設(shè)計(jì)最關(guān)心的是必須保持設(shè)計(jì)的簡(jiǎn)單性。ARM的簡(jiǎn)單性在ARM的硬件組織和實(shí)現(xiàn)方面比指令集的結(jié)構(gòu)方面體現(xiàn)的更明顯。但是ARM仍保留一些CISC的特征,并且因此達(dá)到比純粹的RISC更高的代碼密度,使得ARM在開始時(shí)就獲得了其功率效率和較小的核面積的優(yōu)勢(shì)。12.1.1ARM體系結(jié)構(gòu)版本4ARM處理器是第一個(gè)為商業(yè)用途開發(fā)的RISC微處理器。ARMARM微處理器內(nèi)核中普遍采用了流水線結(jié)構(gòu),隨著ARM內(nèi)核的發(fā)展,其流水線結(jié)構(gòu)越來越復(fù)雜。常見的ARM處理器內(nèi)核流水線如圖12-1所示。圖12-1ARM處理器內(nèi)核流水線工作示意圖12.1.1ARM體系結(jié)構(gòu)版本5ARM微處理器內(nèi)核中普遍采用了流水線結(jié)構(gòu),隨著ARM內(nèi)核的發(fā)

迄今為止,ARM體系結(jié)構(gòu)共定義了8個(gè)版本,版本號(hào)分別為v1~v8,從版本v1到v8,ARM體系的指令集功能不斷擴(kuò)大。同時(shí),各版本中還有一些變種,這些變種定義該版本指令集中不同的功能。ARM處理器系列中的各種處理器,實(shí)現(xiàn)技術(shù)各不相同,性能差別很大,應(yīng)用場(chǎng)合也不同,但只要它們支持同一ARM體系版本,基于它們的應(yīng)用軟件將是兼容的。

需要注意,ARM的體系結(jié)構(gòu)版本號(hào)并不是ARM核的版本號(hào)。12.1.1ARM體系結(jié)構(gòu)版本6迄今為止,ARM體系結(jié)構(gòu)共定義了8個(gè)版本,常見的ARM體系架構(gòu)與ARM核的版本對(duì)應(yīng)關(guān)系見表12-1。

ARM核體系結(jié)構(gòu)ARM1ARMv1ARM2ARMv2ARM6,ARM600,ARM610,ARM7,ARM700,ARM710ARMv3StrongARM,ARM8,ARM810,ARM810ARMv4ARM9E-S,ARM10TDM1,ARM1020EARMv5ARM1136J(F)-S,ARM1176JZ(F)-S,ARM11MPCoreARMv6ARMCortex-M,ARMCortex-R,ARMCortex-AARMv7表12-1常見的ARM體系架構(gòu)與ARM核的版本對(duì)應(yīng)關(guān)系12.1.1ARM體系結(jié)構(gòu)版本7常見的ARM體系架構(gòu)與ARM核的版本對(duì)應(yīng)關(guān)系見表12-1?;贏RM的處理器內(nèi)核簡(jiǎn)稱ARM內(nèi)核,內(nèi)核并不是芯片,ARM內(nèi)核與其他部件組合(如存儲(chǔ)器、定時(shí)器和片內(nèi)外設(shè)接口等)在一起才構(gòu)成芯片。圖12-2ARM芯片內(nèi)部主要模塊示意圖12.1.2ARM內(nèi)核ARM芯片中只有處理器內(nèi)核由ARM公司設(shè)計(jì),其他外圍模塊由獲得ARM公司處理器IP授權(quán)的芯片廠商自行設(shè)計(jì)。芯片廠商針對(duì)不同的應(yīng)用領(lǐng)域,通過設(shè)計(jì)具有很強(qiáng)針對(duì)性的專用硬件加速器,根據(jù)外設(shè)搭配不同的接口電路等設(shè)計(jì)出適用于專業(yè)領(lǐng)域的SOC芯片,從而實(shí)現(xiàn)基于相同處理器內(nèi)核芯片產(chǎn)品的差異化。8基于ARM的處理器內(nèi)核簡(jiǎn)稱ARM內(nèi)核,內(nèi)核并不是芯片,ARM

ARM處理器內(nèi)核不但包括CPU,還包括高速緩存、MMU控制器、嵌入式跟蹤宏單元、TCM接口、總線控制邏輯、AHB接口、協(xié)處理器、中斷控制器等電路模塊。整個(gè)ARM處理器內(nèi)核的核心是CPU。雖然隨著ARM處理器內(nèi)核的升級(jí),其CPU也不斷改進(jìn),但其基本結(jié)構(gòu)主要由32位ALU、31個(gè)32位通用寄存器及6個(gè)狀態(tài)寄存器、32個(gè)8位乘法器、32個(gè)桶形移位寄存器、指令譯碼及控制邏輯、指令流水線和數(shù)據(jù)/地址寄存器組成。12.1.2ARM內(nèi)核9ARM處理器內(nèi)核不但包括CPU,還包括高速緩存、MMU控制

圖12-3ARMCPU基本組成模型12.1.2ARM內(nèi)核10圖12-3ARMCPU基本組成模型12.1.2ARMARM處理器是32位處理器,但兼容16位指令集和數(shù)據(jù)類型。從編程的角度看,ARM處理器有以下兩種操作狀態(tài):ARM狀態(tài)32位,處理器執(zhí)行的是字的ARM指令;Thumb狀態(tài)

16位,處理器執(zhí)行的是半字的Thumb指令。在程序執(zhí)行過程中,處理器可以隨時(shí)在這兩種操作狀態(tài)之間切換。值得注意的是,操作狀態(tài)的切換并不影響處理器的工作模式或寄存器的內(nèi)容。ARM處理器復(fù)位后開始執(zhí)行代碼時(shí),應(yīng)該處于ARM狀態(tài)。12.2ARM編程模型12.2.1處理器狀態(tài)11ARM處理器是32位處理器,但兼容16位指令集和數(shù)據(jù)類型。從ARM指令集和Thumb指令集均有切換處理器狀態(tài)的指令,并可在兩種操作狀態(tài)之間切換。兩個(gè)狀態(tài)可以按以下方法切換:進(jìn)入Thumb狀態(tài)當(dāng)操作數(shù)寄存器的狀態(tài)位(最低位)為1時(shí),執(zhí)行BX指令就可以進(jìn)行Thumb狀態(tài)。如果處理器在Thumb狀態(tài)發(fā)生異常(所有異常處理都在ARM狀態(tài)下執(zhí)行),則當(dāng)異常處理返回時(shí)自動(dòng)切換到Thumb狀態(tài)。進(jìn)入ARM狀態(tài)操作數(shù)寄存器的狀態(tài)位(最低位)為0時(shí),執(zhí)行BX指令就可以進(jìn)行ARM狀態(tài)。處理器進(jìn)行異常處理時(shí),把PC的值放入異常模式鏈接寄存器中,從異常向量地址開始執(zhí)行程序,系統(tǒng)自動(dòng)進(jìn)入ARM狀態(tài)。處理器狀態(tài)的切換12ARM指令集和Thumb指令集均有切換處理器狀態(tài)的指令,并可ARM體系結(jié)構(gòu)支持7種處理器模式:用戶模式、快中斷模式、中斷模式、管理模式、中止模式、未定義模式和系統(tǒng)模式。具體參考表12-2。12.2.2處理器模式處理器模式用途備注用戶(usr)正常程序工作模式不能直接切換到其它模式快中斷(fiq)處理高速中斷,用于高速數(shù)據(jù)傳輸及通道處理FIQ異常響應(yīng)時(shí)進(jìn)入該模式中斷(irq)用于通用中斷處理IRQ異常響應(yīng)時(shí)進(jìn)入該模式管理(svc)操作系統(tǒng)使用的保護(hù)模式,系統(tǒng)復(fù)位后的默認(rèn)模式系統(tǒng)復(fù)位和軟件中斷響應(yīng)時(shí)進(jìn)入該模式中止(abt)用于支持虛擬內(nèi)存和存儲(chǔ)器保護(hù)數(shù)據(jù)或指令預(yù)取中止時(shí)進(jìn)入該模式未定義(und)用于支持硬件協(xié)處理器的軟件仿真未定義指令異常響應(yīng)時(shí)進(jìn)行該模式系統(tǒng)(sys)用于支持操作系統(tǒng)的特權(quán)任務(wù)等與用戶類似,但具有可以直接切換到其它模式等特權(quán)表12-2處理器模式及其用途13ARM體系結(jié)構(gòu)支持7種處理器模式:用戶模式、快中斷模式、中斷除用戶模式外,其它模式為特權(quán)模式。ARM內(nèi)部寄存器和一些片內(nèi)外設(shè)在硬件設(shè)計(jì)上只允許(或可選為只允許)特權(quán)模式下訪問。此處,特權(quán)模式可以自由地切換處理器模式,而用戶模式不能直接切換別的模式。有5種處理器模式稱為異常模式,它們是:快中斷模式、中斷模式、管理模式、中止模式、未定義模式。它們除了可以通過程序切換進(jìn)入外,也可以由特定的異常進(jìn)入。當(dāng)特定的異常出現(xiàn)時(shí),處理器進(jìn)入相應(yīng)的模式。每種模式都有某些附加的寄存器,以避免異常退出時(shí)用戶模式的狀態(tài)不可靠。系統(tǒng)模式與用戶模式一樣不能由異常進(jìn)入,且使用與用戶模式完全相同的寄存器。然而系統(tǒng)模式是特權(quán)模式,不受用戶模式的限制。有了系統(tǒng)模式,操作系統(tǒng)要訪問用戶模式的寄存器就比較方便。同時(shí),操作系統(tǒng)的一些特權(quán)任務(wù)可以使用這個(gè)模式,以訪問一些受控的資源而不必?fù)?dān)心異常出現(xiàn)時(shí)的任務(wù)狀態(tài)變得不可靠。14除用戶模式外,其它模式為特權(quán)模式。ARM內(nèi)部寄存器和一些片內(nèi)ARM處理器共有37個(gè)32位寄存器:31個(gè)通用寄存器

R0~R15、R13_svc、R14_svc、R13_abt、R14_abt、R13_unt、R14_unt、R13_irq、R14_irt和R8_frq~R14_frq;6個(gè)狀態(tài)寄存器

CPSR、SPSR_svc、SPSR_abt、SPSR_unt、SPSR_irq和SPSR_fiq。這些寄存器并不是在同一時(shí)間全都可以被訪問,具體哪些寄存器可編程訪問,取決于處理器狀態(tài)和具體的操作模式。12.2.3寄存器集15ARM處理器共有37個(gè)32位寄存器:12.2.3寄存器集1(1)通用寄存器(2)程序計(jì)數(shù)器(PC)(3)程序狀態(tài)寄存器(PSR)(4)條件碼標(biāo)志位(5)控制位(6)ARM狀態(tài)寄存器與Thumb狀態(tài)寄存器之間的關(guān)系12.2.3寄存器集16(1)通用寄存器12.2.3寄存器集1612.2.3寄存器集通用寄存器包括R0~R15,可以分為兩類:不分組寄存器(R0~R7)和分組寄存器(R8~R14)。1)不分組寄存器(R0~R7)。在處理器的所有模式下,不分組寄存器中的每個(gè)都指向一個(gè)物理寄存器,且未被系統(tǒng)用于特殊用途。因此,在中斷或異常處理中進(jìn)行模式切換時(shí),由于不同的處理器模式均使用相同的物理寄存器,可能會(huì)破壞寄存器中的數(shù)據(jù),進(jìn)行程序設(shè)計(jì)時(shí)應(yīng)引起注意。(1)通用寄存器1712.2.3寄存器集通用寄存器包括R0~R15,可以分為兩2)分組寄存器(R8~R14)。分組寄存器中的每一次所訪問的物理寄存器都與處理器當(dāng)前的模式有關(guān)。若要訪問特定的物理寄存器,則要使用規(guī)定的物理寄存器名字后綴。物理寄存器名字形式如下:R13_<mode>R14_<mode>其中,<mode>是寄存器后綴,分別使用usr、svc、fiq、irq、abt和und表示6種模式。182)分組寄存器(R8~R14)。分組寄存器中的每一次所訪問的對(duì)于寄存器R8~R12,每個(gè)寄存器對(duì)應(yīng)2個(gè)不同的物理寄存器,當(dāng)使用fiq模式時(shí)訪問寄存器R8_fiq~R12_fiq;當(dāng)使用除fiq模式外的其他模式時(shí)訪問寄存器R8~R12。對(duì)于寄存器R13和R14,每個(gè)寄存器對(duì)應(yīng)6個(gè)不同的物理寄存器。其中的一個(gè)物理寄存器是用戶模式和系統(tǒng)模式公用的,其余5個(gè)分別用于5種異常模式。寄存器R13通常作為堆棧指針(SP),用于保存當(dāng)前處理器工作模式下堆棧的棧頂?shù)刂?。寄存器R14作為鏈接寄存器(LR),用于保存子程序的返回地址。當(dāng)子程序折返回地址保存在堆棧中,R14也可作為通用寄存器。處理器在不同模式時(shí),允許每種模式都有自已的棧頂和鏈接寄存器。19對(duì)于寄存器R8~R12,每個(gè)寄存器對(duì)應(yīng)2個(gè)不同的物理寄存器,(2)程序計(jì)數(shù)器(PC)PC作為程序計(jì)數(shù)器,用于保存處理器要取的下一條指令的地址。R15作為程序計(jì)數(shù)器,用于保存處理器要取的下一條指令的地址。ARM狀態(tài)下,所有的ARM指令都是32位長(zhǎng)度的,指令以字對(duì)準(zhǔn)保存;Thumb狀態(tài)下,所有的Thumb指令都是16位長(zhǎng)度的,指令以半字對(duì)準(zhǔn)保存。由于ARM體系采用多級(jí)流水線技術(shù),對(duì)于ARM指令集而言,PC總是指向當(dāng)前指令之后兩條指令的地址,即PC的值為當(dāng)前指令的地址加8。20(2)程序計(jì)數(shù)器(PC)PC作為程序計(jì)數(shù)器,用于保存處理器要(3)程序狀態(tài)寄存器(PSR)程序狀態(tài)寄存包括當(dāng)前程序狀態(tài)寄存器(CPSR)和備份程序狀態(tài)寄存器(SPSR)。所有處理器模式下都可以訪問當(dāng)前程序狀態(tài)寄存器。CPSR包括條件標(biāo)志位、中斷禁止位、當(dāng)前處理器模式標(biāo)志,以及其他一些相關(guān)的控制和狀態(tài)位。在每一種異常工作模式下,都有一個(gè)備份狀態(tài)寄存器。當(dāng)異常發(fā)生時(shí),SPSR用于保存CPSR的當(dāng)前值,當(dāng)從異常退出時(shí),可用SPSR來恢復(fù)CPSR。用戶模式和系統(tǒng)模式不屬于異常模式,因此這兩種模式?jīng)]有SPSR,當(dāng)在這兩種情況下訪問SPSR時(shí),結(jié)果是未知的。CPSR和SPSR的格式如圖12-4所示。21(3)程序狀態(tài)寄存器(PSR)程序狀態(tài)寄存包括當(dāng)前程序狀態(tài)寄圖

12-4CPSR/SPSR格式22圖12-4CPSR/SPSR格式22(4)條件碼標(biāo)志位N、Z、C和V均為條件碼標(biāo)志位。其內(nèi)容可被算術(shù)或邏輯運(yùn)算指令的結(jié)果所改變,并全由條件碼標(biāo)志位狀態(tài)可以決定某條指令是否執(zhí)行。標(biāo)志N。當(dāng)兩個(gè)用補(bǔ)碼表示的帶符號(hào)數(shù)進(jìn)行運(yùn)算時(shí),N=1表示結(jié)果為負(fù)數(shù);N=0表示運(yùn)算結(jié)果為正數(shù)或零。標(biāo)志Z。Z=1表示指令運(yùn)算結(jié)果為0;Z=0表示指令運(yùn)算結(jié)果為非零。23(4)條件碼標(biāo)志位N、Z、C和V均為條件碼標(biāo)志位。其內(nèi)容可標(biāo)志C。對(duì)于加法運(yùn)算(包括比較指令CMN),C=1表示加法運(yùn)算產(chǎn)生進(jìn)位(即無符號(hào)數(shù)溢出),C=0表示加法運(yùn)算未產(chǎn)生進(jìn)位;對(duì)于減法運(yùn)算(包括比較指令CMP),C=0表示減法運(yùn)算產(chǎn)生借位(即無符號(hào)數(shù)溢出),C=1表示減法運(yùn)算未產(chǎn)生借位;對(duì)于包含移位操作的非加/減運(yùn)算指令,C為移出值的最后一位;對(duì)于其他非加/減運(yùn)算指令,C的值通常不改變。標(biāo)志V。對(duì)于加法/減法指令,當(dāng)操作數(shù)和運(yùn)算結(jié)果為二進(jìn)制的補(bǔ)碼表示的帶符號(hào)數(shù)時(shí),V=1表示符號(hào)位溢出,V=0表示符號(hào)位未溢出;對(duì)于其他的非加/減運(yùn)算指令,V的值通常不改變。24標(biāo)志C。對(duì)于加法運(yùn)算(包括比較指令CMN),C=1表示加法運(yùn)(5)控制位CPSR的低8位,即I、F、T和M0~M4稱為控制位。當(dāng)發(fā)生異常時(shí)這些位可以被改變。當(dāng)處理器運(yùn)行在特權(quán)模式時(shí),這些位也可以由程序修改。中斷禁止位I和F。I=1表示禁止IRQ中斷,F(xiàn)=1表示禁止FIQ中斷。T標(biāo)志位。對(duì)于ARM體系結(jié)構(gòu)v4及以上版本的T系列處理器,T=0表示程序運(yùn)行于ARM狀態(tài),T=1表示程序運(yùn)行于Thumb狀態(tài);對(duì)于ARM體系結(jié)構(gòu)v4及以上版本的非T系列處理器,T=0表示程序運(yùn)行于ARM狀態(tài),T=1表示執(zhí)行下一條指令以引起未定義的指令異常。注意:絕對(duì)不要強(qiáng)制改變CPSR寄存器中的T位。如果這樣做,處理器則會(huì)進(jìn)入一個(gè)無法預(yù)知的狀態(tài)。25(5)控制位CPSR的低8位,即I、F、T和M0~M4稱為運(yùn)行模式位M0~M4。這些模式位決定處理器的模式。見表12-4。不是所有模式位的組合都定義了有效的處理器模式,因此,請(qǐng)注意不要使用表中沒有列出的組合。保留位。CPSR中的其他位為保留位,當(dāng)改變CPSR中的條件碼標(biāo)專位或控制位時(shí),不要改變保留位,在程序中也不要使用保留位來存儲(chǔ)數(shù)據(jù)。保留位將用于ARM版本的擴(kuò)展。26運(yùn)行模式位M0~M4。這些模式位決定處理器的模式。見表12-M[4:0]處理器模式可訪問的Thumb狀態(tài)寄存器可訪問的ARM狀態(tài)寄存器10000用戶R0~R7,SP,LR,PC,CPSRR0~R14,

PC,CPSR10001快中斷R0~R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiqR0~R7,R8_fiq~R14_fiq,PC,CPSR,SPSR_fiq10010中斷R0~R7,SP_fiq,LR_fiq,PC,CPSR,SPSR_fiqR0~R7,SP_svc,LR_svc,PC,CPSR,SPSR_svcR0~R12,R13_fiq,R14_fiq,PC,CPSR,SPSR_fiq10011管理R0~R12,R13_svc,R14_svc,PC,CPSR,SPSR_svc10111中止R0~R7,SP_abt,LR_abt,PC,CPSR,SPSR_abtR0~R12,R13_abt,R14_abt,PC,CPSR,SPSR_abt11011未定義R0~R7,SP_und,LR_und,PC,CPSR,SPSR_undR0~R12,R13_und,R14_und,PC,CPSR,SPSR_und11111系統(tǒng)R0~R7,SP,LR,PC,CPSR,SPSRR0~R14,

PC,CPSR表12-4模式位的含義27M[4:0]處理器模式可訪問的Thumb狀態(tài)寄存器可訪問的A(6)ARM狀態(tài)寄存器與Thumb狀態(tài)寄存器之間的關(guān)系Thumb狀態(tài)下的寄存器集是ARM狀態(tài)下的寄存器集的子集。用戶可以訪問8個(gè)通用寄存器(R0~R7)、PC、SP、LR、SPSR和CPSR。每種特權(quán)模式都有一組SP、LR、SPSR。Thumb狀態(tài)寄存器與ARM狀態(tài)寄存器集有如下的關(guān)系:Thumb狀態(tài)R0~R7與ARM狀態(tài)R0~R7相同。Thumb狀態(tài)CPSR和SPSR與ARM狀態(tài)CPSR和SPSR相同。Thumb狀態(tài)SP映射到ARM狀態(tài)R13。Thumb狀態(tài)LR映射到ARM狀態(tài)R14。Thumb狀態(tài)PC映射到ARM狀態(tài)PC(R15)。具體關(guān)系如圖12-5所示。28(6)ARM狀態(tài)寄存器與Thumb狀態(tài)寄存器之間的關(guān)系Thu圖12-5Thumb寄存器在ARM狀態(tài)寄存器上的映射

Thumb狀態(tài)下,寄存器R8~R15并不是標(biāo)準(zhǔn)寄存器集的一部分,但用戶可以使用匯編語言程序有限制地訪問這些寄存器,將其用作快速的寄存器。使用帶特殊變量的MOV指令,數(shù)據(jù)可以在低寄存器(R0~R7)和高寄存器(R8~R15)之間進(jìn)行傳送;高寄存器的值可以使用CMP指令進(jìn)行比較或使用ADD指令加上低寄存器的值。29圖12-5Thumb寄存器在ARM狀態(tài)寄存器上的映射

ARM處理器支持的數(shù)據(jù)類型有字節(jié)、半字和字。字節(jié)字節(jié)的長(zhǎng)度為8位(bit);半字半字的長(zhǎng)度為16位(bit),半字必須以2字節(jié)為邊界對(duì)齊;字字的長(zhǎng)度為32位(bit)。字必須以4字節(jié)為邊界對(duì)齊。這三種數(shù)據(jù)類型都支持無符號(hào)數(shù)和帶符號(hào)數(shù),當(dāng)任意一種類型描述為unsigned時(shí),N位數(shù)值使用正常的二進(jìn)制格式表示范圍為的非負(fù)整數(shù);當(dāng)任意一種類型描述為signed時(shí),N位數(shù)值使用2的補(bǔ)碼格式表示范圍為的整數(shù)。ARM指令的長(zhǎng)度剛好是1個(gè)字(分配為占用4個(gè)字節(jié))。Thumb指令的長(zhǎng)度剛好一個(gè)半字(占用2個(gè)字節(jié))。所有數(shù)據(jù)操作都以字為單位。加載和存儲(chǔ)指令可以以字節(jié)、半字和字進(jìn)行操作,當(dāng)加載字節(jié)或半字時(shí)自動(dòng)實(shí)現(xiàn)零擴(kuò)展或符號(hào)擴(kuò)展。12.2.4體系結(jié)構(gòu)直接支持的數(shù)據(jù)類型30ARM處理器支持的數(shù)據(jù)類型有字節(jié)、半字和字。1212.2.5存儲(chǔ)器及存儲(chǔ)器映射I/OARM處理器采用馮﹒諾依曼結(jié)構(gòu),指令和數(shù)據(jù)共用一條32位數(shù)據(jù)總線,只有加載、存儲(chǔ)和交換指令可訪問存儲(chǔ)器中的數(shù)據(jù)。ARM公司的規(guī)范僅定義了內(nèi)核與存儲(chǔ)系統(tǒng)之間的信號(hào)及時(shí)序(局部總線),而現(xiàn)實(shí)的芯片一般在外部總線與內(nèi)核的局部總線之間有一個(gè)存儲(chǔ)器管理部件將局部總線的信號(hào)和時(shí)序轉(zhuǎn)換為現(xiàn)實(shí)的外部總線信號(hào)和時(shí)序。因此,外部總信的信號(hào)和時(shí)序與具體的芯片有關(guān),不是ARM的標(biāo)準(zhǔn)。具體到某個(gè)芯片的外部存儲(chǔ)系統(tǒng)的設(shè)計(jì),需要參考其芯片的數(shù)據(jù)手冊(cè)或使用手冊(cè)等資料。1.地址空間

2.存儲(chǔ)器格式

3.指令的預(yù)取和自修改代碼

4.存儲(chǔ)器映射的I/O

3112.2.5存儲(chǔ)器及存儲(chǔ)器映射I/OARM處理器采用馮﹒諾1.地址空間ARM體系結(jié)構(gòu)使用單個(gè)平面的232個(gè)8位字節(jié)地址空間,對(duì)存儲(chǔ)器能支持的最大尋址空間為4G(232)。ARM體系統(tǒng)結(jié)構(gòu)將存儲(chǔ)器看成從0x00000000地址開始的以字節(jié)為單位的線性組合。每個(gè)字?jǐn)?shù)據(jù)占4個(gè)字節(jié)單位,每個(gè)半字?jǐn)?shù)據(jù)占2個(gè)字節(jié)單位。字節(jié)地址按照無符號(hào)數(shù)排列,從0到232-1。地址空間可以看作是包含230個(gè)32位字,地址以字為單位進(jìn)行分配,也就是將地址除以4。地址為A的字包含4個(gè)字節(jié),地址分別為A、A+1、A+2和A+3。在ARM體系結(jié)構(gòu)v4及以上版本中,地址空間還可被看包含231個(gè)16位半字。地址按照半字進(jìn)行分配。地址為A的半字包含2個(gè)字節(jié),地址分別為A和A+1。321.地址空間ARM體系結(jié)構(gòu)使用單個(gè)平面的232個(gè)8位字節(jié)地址2.存儲(chǔ)器格式地址空間的規(guī)則要求地址A:位于地址A的字包含的字節(jié)位于地址A、A+1、A+2和A+3。位于地址A的半字包含的字節(jié)位于地址A、A+1。位于地址A+2的半字包含的字節(jié)位于地址A+2和A+3。位于地址A的字包含的字節(jié)位于地址A和A+3。332.存儲(chǔ)器格式地址空間的規(guī)則要求地址A:33小端格式(little-ednian)在小端格式中,一個(gè)字當(dāng)中最低地址的字節(jié)被看作是最低位字節(jié),最高地址的字節(jié)被看作是最高位字節(jié)。因此,存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線,如圖12-6所示。圖12-6字內(nèi)字節(jié)的小端地址34小端格式(little-ednian)在小端格式中,一個(gè)字當(dāng)大端格式(big-endian)在大端格式中,ARM處理器將最高位字節(jié)保存在最低地址字節(jié),將最低位字節(jié)保存在最高地址字節(jié)。因此,存儲(chǔ)器系統(tǒng)字節(jié)0連接到數(shù)據(jù)線31~24,如圖12-7所示。圖12-7字內(nèi)字節(jié)的大端地址35大端格式(big-endian)在大端格式中,ARM處理器將一個(gè)具體的的基于ARM的芯片可能只支持小端存儲(chǔ)器系統(tǒng),也可能只支持大端存儲(chǔ)器系統(tǒng),還可能兩者都支持,但默認(rèn)格式通常為小端格式。ARM指令集不包含任何直接選擇大、小端的指令。但是,一個(gè)同時(shí)支持大、小端的基于ARM的芯片,可以在硬件上配置(一般使用芯片的引腳來配置)來匹配存儲(chǔ)器系統(tǒng)所使用的規(guī)則。如果芯片有一個(gè)標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器,則系統(tǒng)控制協(xié)處理器的寄存器1的Bit7可用于改變配置輸入。36一個(gè)具體的的基于ARM的芯片可能只支持小端存儲(chǔ)器系統(tǒng),也可能如果一個(gè)基于ARM的芯片將存儲(chǔ)系統(tǒng)配置為其中一種存儲(chǔ)器格式(如小端),而實(shí)際連接的存儲(chǔ)器系統(tǒng)配置為相反的格式(如大端),那么只有以字為單位的指令取指、數(shù)據(jù)加載和數(shù)據(jù)存儲(chǔ)能夠可靠實(shí)現(xiàn)??辈斓拇鎯?chǔ)器訪問將出現(xiàn)不可預(yù)測(cè)的結(jié)果。當(dāng)標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器連接到支持大、小端的ARM處理器時(shí),協(xié)處理器寄存器1的Bit7在復(fù)位時(shí)清零。這表示ARM處理器在復(fù)位后立即配置為小端存儲(chǔ)器系統(tǒng)。如果它連接到一個(gè)大端存儲(chǔ)器系統(tǒng),那么復(fù)位處理程序要盡早做的事情之一就是切換到大端存儲(chǔ)器系統(tǒng),并必須在任何可能的字節(jié)或半字?jǐn)?shù)據(jù)訪問發(fā)生或Thumb指令執(zhí)行之前執(zhí)行。37如果一個(gè)基于ARM的芯片將存儲(chǔ)系統(tǒng)配置為其中一種存儲(chǔ)器格式(3.指令的預(yù)取和自修改代碼許多ARM處理器實(shí)現(xiàn)在前一條指令的執(zhí)行尚未完成時(shí)將指令從存儲(chǔ)器取出。這個(gè)動(dòng)作稱為指令的預(yù)取。指令的預(yù)取并不是實(shí)際執(zhí)行指令。如有下面兩種典型的情況時(shí),指令就可不被執(zhí)行:當(dāng)異常發(fā)生時(shí),當(dāng)前指令執(zhí)行完畢,所有預(yù)取的指令都被丟棄,指令的執(zhí)行從異常向量開始。當(dāng)發(fā)生跳轉(zhuǎn)時(shí),預(yù)取的在分支指令后的指令將被丟棄。ARM處理器可以自由選擇預(yù)取的指令比當(dāng)前執(zhí)行點(diǎn)提前多少(即半導(dǎo)體廠商在設(shè)計(jì)具體的芯片時(shí)可以自由選擇預(yù)取的指令比當(dāng)前執(zhí)行點(diǎn)提前多少),甚至可以動(dòng)態(tài)改變預(yù)取指令的數(shù)目。最初的ARM處理器實(shí)現(xiàn)在當(dāng)前執(zhí)行的指令之前預(yù)取兩條指令,不過現(xiàn)在可以選擇多于或少于兩條指令。383.指令的預(yù)取和自修改代碼許多ARM處理器實(shí)現(xiàn)在前一條指令的注意:當(dāng)指令讀取PC時(shí),它得到的指令地址比它自身地址落后了兩條地址:對(duì)于ARM指令,得到的地址是它自身地址+8;對(duì)于Thumb指令,得到的地址是它自身地址+4。最初的ARM處理器實(shí)現(xiàn)在PC讀取的兩指令偏移量和兩指令預(yù)取之間存在關(guān)聯(lián)。但這一關(guān)聯(lián)不是結(jié)構(gòu)上的。一個(gè)預(yù)取不同數(shù)目指令的ARM處理器實(shí)現(xiàn)仍能保證讀取PC所得的地址比它自身地址落后兩條指令。同自由選擇多少條預(yù)取指令一樣,ARM處理器實(shí)現(xiàn)可選擇沿著哪條可能的執(zhí)行路徑進(jìn)行預(yù)取指。例如,在一條分支指令之后,它可選擇預(yù)取分支指令之后的指令或者是轉(zhuǎn)移目標(biāo)地址的指令。這稱為“轉(zhuǎn)移預(yù)測(cè)”。39注意:當(dāng)指令讀取PC時(shí),它得到的指令地址比它自身地址落后了兩自修改代碼所有形式的指令預(yù)取都有一個(gè)潛在的問題,即存儲(chǔ)器中的指令可能在它被預(yù)取之后,被執(zhí)行之前發(fā)生改變。如果發(fā)生這種情況,對(duì)存儲(chǔ)器中的指令進(jìn)行修改通常并不妨礙已取指的指令備份執(zhí)行完畢。40自修改代碼所有形式的指令預(yù)取都有一個(gè)潛在的問題,即存儲(chǔ)器中的例如:在下面的代碼序列中,STR指令使用ADD指令的備份取代了它后面的SUB指令:LDRr0,AddInstrSTRr0,NextInstrNextInstrSUBr1,r1,#1?AddInstrADDr1,r1,#1當(dāng)代碼第一次執(zhí)行時(shí),STR指令之后執(zhí)行的指令通常是SUB指令,因?yàn)镾UB指令在存儲(chǔ)器中的指令發(fā)生改變之前已經(jīng)被預(yù)取了,ADD指令不會(huì)被執(zhí)行,除非第二次執(zhí)行該代碼序列。41例如:在下面的代碼序列中,STR指令使用ADD指令的備份取代ARM處理器不能保證上面所述的方式執(zhí)行,因此:當(dāng)代碼第一次執(zhí)行時(shí),在STR指令之后有可能立即產(chǎn)生一個(gè)中斷。如果這樣,已經(jīng)預(yù)取的SUB指令將被丟棄。當(dāng)中斷處理程序返回時(shí),位于NextInstr處的指令被再次預(yù)取,而這次則執(zhí)行ADD指令。因此,雖然SUB指令通常最有可能被執(zhí)行,但也有可能執(zhí)行ADD指令。如果指令被再次執(zhí)行,ARM處理器或存儲(chǔ)器系統(tǒng)允許預(yù)取指令的備份,并使用這些備份而不是重新預(yù)取。如果發(fā)生這種情況,在代碼序列按照第二及以下可能執(zhí)行時(shí),SUB指令可能被執(zhí)行。發(fā)生這種情況的主要原因是存儲(chǔ)器系統(tǒng)包含獨(dú)立的指令和數(shù)據(jù)緩存。但是,也存在其它可能性。例如,一些分支預(yù)測(cè)的硬件保存了分支后的指令。總之,應(yīng)當(dāng)盡可能避免使用涉及自修改代碼的編程技術(shù)。然而在許多系統(tǒng)中,幾乎不可能完全避免自修改代碼的使用。例如,任何一個(gè)允許將程序裝入存儲(chǔ)器然后執(zhí)行的系統(tǒng)都使用自修改代碼。42ARM處理器不能保證上面所述的方式執(zhí)行,因此:當(dāng)代碼第一次執(zhí)指令存儲(chǔ)器屏障(IMB)每個(gè)ARM處理器實(shí)現(xiàn)都定義了一系列的操作,使自修改代碼序列可以可靠地執(zhí)行。這一串代碼稱為指令存儲(chǔ)器屏障(IMB),它通常同時(shí)取決于ARM處理器的實(shí)現(xiàn)和存儲(chǔ)器系統(tǒng)的實(shí)現(xiàn)。IMB序列必須在新的指令已經(jīng)保存到存儲(chǔ)器之后而尚未執(zhí)行時(shí)執(zhí)行。例如,在程序被加載之后并且在轉(zhuǎn)移到它的入口之前。任何不以這種方式使用IMB的自修改代碼序列都可能會(huì)執(zhí)行不確定的動(dòng)作。根據(jù)IMB所執(zhí)行的確定的操作順序取決于ARM處理器和存儲(chǔ)器的實(shí)現(xiàn),建議在軟件設(shè)計(jì)時(shí)使IMB序列作為一個(gè)調(diào)用程序來替換與系統(tǒng)相關(guān)的模塊,而不是直接插入到需要的地方。這樣易于移植到其它ARM處理器和存儲(chǔ)器系統(tǒng)。43指令存儲(chǔ)器屏障(IMB)每個(gè)ARM處理器實(shí)現(xiàn)都定義了一系列的另外,在許多實(shí)現(xiàn)當(dāng)中,IMB序列包含了只能在特權(quán)模式下使用的操作,例如,標(biāo)準(zhǔn)系統(tǒng)控制協(xié)處理器提供的緩存清零和無效操作。為了允許用戶模式程序使用IMB序列,推薦將其作為一個(gè)操作系統(tǒng)調(diào)用程序,由SWI指令調(diào)用。在SWI指令使用24位立即數(shù)的系統(tǒng)中指定所要求的系統(tǒng)服務(wù),通過下面的指令即可請(qǐng)求IMB序列:SWI0xF00000這是一個(gè)無參數(shù)調(diào)用,不返回結(jié)果,應(yīng)當(dāng)使用與帶原型的C函數(shù)調(diào)用相同的調(diào)用約定:voidIMB(void);區(qū)別在于使用SWI指令而不是BL指令調(diào)用。44另外,在許多實(shí)現(xiàn)當(dāng)中,IMB序列包含了只能在特權(quán)模式下使用的有些實(shí)現(xiàn)可對(duì)已保存的新指令使用地址范圍的知識(shí)來減少IMB執(zhí)行的時(shí)間。因此,還可執(zhí)行另外一個(gè)操作系統(tǒng)調(diào)用程序。該調(diào)用程序只根據(jù)指定的地址范圍執(zhí)行IMB。在SWI指令使用24位立即數(shù)的系統(tǒng)中指定所要求的系統(tǒng)服務(wù),通過下面的指令來請(qǐng)求:SWI0xF00001應(yīng)當(dāng)使用與帶原型的C函數(shù)調(diào)用相似的調(diào)用約定:voidIMB—Range(unsignedlongstart_addr,unsignedlongend_addr);此處地址范圍從start_addr(包含)到end_addr(不包含)。45有些實(shí)現(xiàn)可對(duì)已保存的新指令使用地址范圍的知識(shí)來減少IMB執(zhí)行注意:當(dāng)使用標(biāo)準(zhǔn)的ARM過程調(diào)用標(biāo)準(zhǔn)時(shí),start_addr在R0中傳遞,而edd_addr則在R1中傳遞。對(duì)于某些ARM處理器實(shí)現(xiàn)來說,即使使用小地址范圍,IMB執(zhí)行的時(shí)間也可能非常長(zhǎng)(數(shù)千個(gè)時(shí)鐘周期)。對(duì)于自修改代碼的小規(guī)模使用,這樣很可能受到較大損失。因此,建議自修改代碼只用于不可避免或有足夠的執(zhí)行時(shí)間的情況。46注意:當(dāng)使用標(biāo)準(zhǔn)的ARM過程調(diào)用標(biāo)準(zhǔn)時(shí),start_addr4.存儲(chǔ)器映射的I/O執(zhí)行ARM體系統(tǒng)結(jié)構(gòu)I/O功能的標(biāo)準(zhǔn)是使用存儲(chǔ)器映射的I/O。加載或存儲(chǔ)I/O值時(shí),使用提供給I/O功能的特殊存儲(chǔ)器地址。通常,從存儲(chǔ)器映射的I/O地址加載用于輸入,而存儲(chǔ)到存儲(chǔ)器映射的I/O地址則用于輸出。加載和存儲(chǔ)都可用于執(zhí)行控制功能,用于取代它們正常的輸入或輸出功能。存儲(chǔ)器映射的I/O位置的動(dòng)作通常不同于正常的存儲(chǔ)器位置的動(dòng)作。例如,正常存儲(chǔ)器位置的兩次連續(xù)加載,每次都會(huì)返回相同的值,除非中間插入了保存的操作。對(duì)于存儲(chǔ)器映射的I/O位置,第二次加載返回的值可以不同于第一次返回的值。因?yàn)榈谝淮渭虞d的副作用(例如從緩沖區(qū)移走已加載的值)或是因?yàn)椴迦肓硪粋€(gè)存儲(chǔ)器映射I/O位置的加載和存儲(chǔ)的副作用。474.存儲(chǔ)器映射的I/O執(zhí)行ARM體系統(tǒng)結(jié)構(gòu)I/O功能的標(biāo)準(zhǔn)是(1)從存儲(chǔ)器映射的I/O取指在前面章節(jié)中講到,不同ARM處理器的實(shí)現(xiàn)(可以理解為不同的芯片)在存儲(chǔ)器取指時(shí)會(huì)有相當(dāng)大的區(qū)別。因此,建議存儲(chǔ)器映射的I/O位置只用于數(shù)據(jù)的加載和存儲(chǔ),而不用于取指。任何依賴于從存儲(chǔ)器映射I/O位置取指的系統(tǒng)設(shè)計(jì)都可能難于移植到將來的ARM實(shí)現(xiàn)。48(1)從存儲(chǔ)器映射的I/O取指在前面章節(jié)中講到,不同ARM處(2)對(duì)存儲(chǔ)器映射I/O的數(shù)據(jù)訪問一個(gè)指令序列在執(zhí)行時(shí),會(huì)在不同的點(diǎn)訪問數(shù)據(jù)存儲(chǔ)器,產(chǎn)生加載和存儲(chǔ)訪問的時(shí)序。如果這些加載和存儲(chǔ)訪問的是正常的存儲(chǔ)器位置,那么它們?cè)谠L問相同的存儲(chǔ)器位置時(shí)只是執(zhí)行交互操作。結(jié)果,對(duì)不同存儲(chǔ)器位置的加載和存儲(chǔ)可以按照不同于指令的順序執(zhí)行,但不會(huì)改變最終的結(jié)果。這種改變存儲(chǔ)器訪問順序的自由可被存儲(chǔ)器系統(tǒng)用來提高性能(例如,通過使用高速緩存和寫緩沖器)。49(2)對(duì)存儲(chǔ)器映射I/O的數(shù)據(jù)訪問一個(gè)指令序列在執(zhí)行時(shí),會(huì)在對(duì)同一存儲(chǔ)器位置的訪問還擁有其它可用于提升性能的特性從相同的位置連續(xù)加載(沒有產(chǎn)生存儲(chǔ))產(chǎn)生相同的結(jié)果。從一個(gè)位置執(zhí)行多加載操作,將返回最后保存到該位置的值。對(duì)某個(gè)數(shù)據(jù)規(guī)格的多次訪問,有時(shí)可合并成單個(gè)的更大規(guī)模的訪問。例如,分別存儲(chǔ)一個(gè)字所包含的兩個(gè)半字可合并成存儲(chǔ)單個(gè)字。50對(duì)同一存儲(chǔ)器位置的訪問還擁有其它可用于提升性能的特性從相同的訪問存儲(chǔ)器映射的I/O位置時(shí)不能進(jìn)行優(yōu)化,它們的時(shí)間順序絕對(duì)不能改變?nèi)绻鎯?chǔ)器字、半字或字節(jié)訪問的對(duì)象是存儲(chǔ)器映射的I/O位置,那么一次訪問會(huì)產(chǎn)生副作用,使后續(xù)訪問改變成一個(gè)不同的地址。如果是這樣,那么不同時(shí)間順序的訪問將會(huì)使代碼序列產(chǎn)生不同的最終結(jié)果。因此,當(dāng)訪問存儲(chǔ)器映射的I/O位置時(shí)不能進(jìn)行優(yōu)化,它們的時(shí)間順序絕對(duì)不能改變。51訪問存儲(chǔ)器映射的I/O位置時(shí)不能進(jìn)行優(yōu)化,它們的時(shí)間順序絕對(duì)存儲(chǔ)器訪問的數(shù)據(jù)規(guī)格都不會(huì)改變對(duì)于存儲(chǔ)器映射的I/O,另外還有很重要的一點(diǎn),那就是每次存儲(chǔ)器訪問的數(shù)據(jù)規(guī)格都不會(huì)改變。例如,在訪問存儲(chǔ)器映射的I/O時(shí),一個(gè)指定從4個(gè)連續(xù)字節(jié)地址讀出數(shù)據(jù)的代碼序列決不能合并成單個(gè)字的讀取,否則會(huì)使代碼序列的最終執(zhí)行結(jié)果不同于期望的結(jié)果。相似地,將字的訪問分解成多個(gè)字節(jié)的訪問可能會(huì)導(dǎo)致存儲(chǔ)器映射I/O設(shè)備無法按照預(yù)期進(jìn)行操作。52存儲(chǔ)器訪問的數(shù)據(jù)規(guī)格都不會(huì)改變對(duì)于存儲(chǔ)器映射的I/O,另外還訪問存儲(chǔ)器映射的I/O時(shí)的要求限制存儲(chǔ)器映射I/O位置的存儲(chǔ)器屬性。例如,在標(biāo)準(zhǔn)存儲(chǔ)器系統(tǒng)結(jié)構(gòu)中,存儲(chǔ)器位置必須是無高速緩存和無緩沖區(qū)的。限制訪問存儲(chǔ)器映射I/O位置的規(guī)格或?qū)R方式。例如,如果一個(gè)ARM實(shí)現(xiàn)帶有16位外部數(shù)據(jù)總線,它可以禁止對(duì)存儲(chǔ)器映射I/O使用32位訪問,因?yàn)?2位訪問無法在單個(gè)總線周期內(nèi)執(zhí)行。要求額外的外部硬件。例如,帶16位外部數(shù)據(jù)總線的ARM實(shí)現(xiàn)可以允許對(duì)存儲(chǔ)器映射的I/O使用32位訪問,但要求外部硬件將兩個(gè)16位總線訪問合并成對(duì)I/O設(shè)備的單個(gè)32位訪問。53訪問存儲(chǔ)器映射的I/O時(shí)的要求限制存儲(chǔ)器映射I/O位置的存儲(chǔ)如果數(shù)據(jù)存儲(chǔ)器訪問序列包含一些符合要求的訪問和一些不符合要求的訪問,那么:對(duì)于符合要求的訪問,其數(shù)據(jù)規(guī)格和數(shù)目都被保護(hù),沒有互相合并或沒有與不符合要示的訪問以任何方式合并。不符合要求的訪問可以互相合并。符合要求的訪問彼此的時(shí)間的順序被保護(hù),但它們相以于那些不符合要求的訪問的時(shí)間順序不能保證。54如果數(shù)據(jù)存儲(chǔ)器訪問序列包含一些符合要求的訪問和一些不符合要求12.2.6異常只要正常的程序流被暫時(shí)中止,處理器就進(jìn)入異常模式。當(dāng)發(fā)生異常時(shí),處理器在處理異常之前,必須先保存當(dāng)前的狀態(tài)。當(dāng)異常處理完成后,需要將處理器的狀態(tài)恢復(fù)到處理異常之前,之后當(dāng)前程序方可繼續(xù)執(zhí)行。ARM處理器允許多個(gè)異常同時(shí)發(fā)生,它們將會(huì)按固定的優(yōu)先級(jí)進(jìn)行處理。本小節(jié)內(nèi)容:1.ARM支持的異常類型2.異常優(yōu)化級(jí)與異常嵌套3.異常向量4.異常響應(yīng)和返回過程5.中斷延遲6.復(fù)位5512.2.6異常只要正常的程序流被暫時(shí)中止,處理器就進(jìn)入異1.ARM支持的異常類型

ARM體系結(jié)構(gòu)支持的異常類型有7種,如表12-5所示,分為如下3類:指令執(zhí)行引起的直接異常

軟件中斷、未定義指令和指令預(yù)取中止都屬于這一類;指令執(zhí)行引起的間接中斷

數(shù)據(jù)中止屬于這一類;外部產(chǎn)生的與指令流無關(guān)的異常

復(fù)位、IRQ和FIQ屬于這一類。561.ARM支持的異常類型 ARM體系結(jié)構(gòu)支持的異常類型有7種表12-5ARM體系結(jié)構(gòu)支持的異常類型異常類型具體功能復(fù)位(Reset)復(fù)位電平有效時(shí),產(chǎn)生復(fù)位異常,ARM處理器立刻停止執(zhí)行當(dāng)前指令,程序跳轉(zhuǎn)到復(fù)位異常處理程序處執(zhí)行指令未定義指令(Undefined)當(dāng)ARM處理器或協(xié)處理器遇到不能處理的指令時(shí),產(chǎn)生未定義指令異常??墒褂迷摦惓C(jī)制進(jìn)行軟件仿真擴(kuò)展ARM或Thumb指令集軟件中斷(SWI)該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權(quán)操作??墒褂迷摦惓C(jī)制實(shí)現(xiàn)系統(tǒng)功能調(diào)用,用于請(qǐng)求特定的管理功能指令預(yù)取中止(PrefetchAbort)當(dāng)處理器預(yù)取指令的地址不存在或該地址不允許當(dāng)前指令訪問時(shí),存儲(chǔ)器會(huì)向處理器發(fā)出中止信號(hào),但當(dāng)預(yù)取的指令被執(zhí)行時(shí),才會(huì)產(chǎn)生指令預(yù)取中止異常。當(dāng)預(yù)取指令未被執(zhí)行,如指令流水線中發(fā)生了跳轉(zhuǎn),則預(yù)取指令異常不會(huì)發(fā)生數(shù)據(jù)中止(DataAbort)當(dāng)處理器數(shù)據(jù)訪問指令的地址不存在或該地址不當(dāng)前指令訪問,則會(huì)產(chǎn)生數(shù)據(jù)中止異常。發(fā)生數(shù)據(jù)中止時(shí),系統(tǒng)的響應(yīng)與指令的類型有關(guān)外部中斷請(qǐng)求(IRQ)當(dāng)處理器的外部中斷請(qǐng)求引腳nIRQ有效時(shí),且CPSR中的1位為0時(shí),產(chǎn)生IRQ異常。系統(tǒng)的外設(shè)可通過該異常請(qǐng)求中斷服務(wù)快速中斷請(qǐng)求(FIQ)當(dāng)處理器的快速中斷請(qǐng)求引腳nFIQ有效時(shí),且CPSR中的F位為0時(shí),產(chǎn)生FIQ異常。FIQ異常是為了支持?jǐn)?shù)據(jù)傳輸或者通道處理而設(shè)計(jì)的57表12-5ARM體系結(jié)構(gòu)支持的異常類型異常類型具體功能復(fù)位當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),系統(tǒng)根據(jù)固定的優(yōu)化級(jí)處理異常的處理次序。異常優(yōu)先級(jí)按下列順序排列了優(yōu)先權(quán),復(fù)位優(yōu)先級(jí)最高,未定義指令和SWI優(yōu)先級(jí)最低。2.異常優(yōu)化級(jí)與異常嵌套58當(dāng)多個(gè)異常同時(shí)發(fā)生時(shí),系統(tǒng)根據(jù)固定的優(yōu)化級(jí)處理異常的處理次序(1)復(fù)位從確定的狀態(tài)啟動(dòng)處理器,使得所有其他未解決的異常都和當(dāng)前處理器運(yùn)行的狀態(tài)不再有關(guān),因此具有最高優(yōu)先級(jí)。(2)未定義指令和SWI都依靠指令的特殊譯碼產(chǎn)生,由于兩者是互斥的指令編碼,因此不能同時(shí)發(fā)生。59(1)復(fù)位從確定的狀態(tài)啟動(dòng)處理器,使得所有其他未解決的異常都(3)中斷優(yōu)先級(jí)判決最復(fù)雜的情況是FIQ、IRQ和第三個(gè)非復(fù)位的異常同時(shí)發(fā)生時(shí):由于FIQ比IRQ優(yōu)先級(jí)高并將IRQ屏蔽,所以IRQ被忽略,直到FIQ處理程序明確地將IRQ使用或返回到用戶代碼為止;如果第三個(gè)異常是數(shù)據(jù)中止,那是因?yàn)檫M(jìn)入數(shù)據(jù)中止異常并未將FIQ屏蔽,所以處理器將在進(jìn)入數(shù)據(jù)中止處理程序后立即進(jìn)入FIQ處理程序。數(shù)據(jù)中止將在FIQ處理程序返回時(shí)對(duì)其進(jìn)行處理;如果第三個(gè)異常不是數(shù)據(jù)中止,將立即進(jìn)入FIQ處理程序。當(dāng)FIQ和IRQ兩者都完成時(shí),程序?qū)⒎祷氐疆a(chǎn)生第三個(gè)異常的指令,在余下所有的情況下異常將重現(xiàn)并進(jìn)行相應(yīng)的處理。60(3)中斷優(yōu)先級(jí)判決最復(fù)雜的情況是FIQ、IRQ和第三個(gè)非復(fù)3.異常向量異常向量異常類型進(jìn)入模式0x00000000復(fù)位管理模式0x00000004未定義指令未定義模式0x00000008軟件中斷管理模式0x0000000C指令預(yù)取中止中止模式0x00000010數(shù)據(jù)中止中止模式0x00000014保留保留0x00000018IRQIRQ0x0000001CFIQFIQ表12-6ARM異常向量613.異常向量異常向量異常類型進(jìn)入模式0x00000000復(fù)位一般來說,在異常向量處將包含一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序。但由于FIQ占據(jù)最高向量地址,它可以立即執(zhí)行。當(dāng)ARM處理器發(fā)生異常時(shí),程序計(jì)數(shù)器PC被強(qiáng)制設(shè)置為對(duì)應(yīng)的異常向量,從而轉(zhuǎn)到異常處理程序,當(dāng)異常處理程序完成后,返回到主程序繼續(xù)執(zhí)行。62一般來說,在異常向量處將包含一條跳轉(zhuǎn)指令,跳轉(zhuǎn)到異常處理程序異常發(fā)生后,除了復(fù)位異常立即中止當(dāng)前指令之外,其余異常都是在處理器完成當(dāng)前指令后再執(zhí)行異常處理程序。ARM處理器對(duì)異常中斷的響應(yīng)過程如下所述:1)保存處理器當(dāng)前狀態(tài)、中斷屏蔽位以及條件標(biāo)志位。這是通過將當(dāng)前程序狀態(tài)寄存器CPSR的內(nèi)容保存到將要執(zhí)行的異常中斷對(duì)應(yīng)的SPSR寄存器中實(shí)現(xiàn)的;2)設(shè)置當(dāng)前程序狀態(tài)寄存器CPSR中相應(yīng)的位。包括:設(shè)置CPSR中的位,使處理器進(jìn)入相應(yīng)的模式;設(shè)置CPSR中的位,禁止IRQ中斷,當(dāng)進(jìn)入FIQ模式時(shí),禁止FIQ中斷;3)將寄存器LR_mode設(shè)置成返回地址;4.異常響應(yīng)和返回過程63異常發(fā)生后,除了復(fù)位異常立即中止當(dāng)前指令之外,其余異常都是在4)將程序計(jì)數(shù)器值(PC)設(shè)置成該異常中斷的異常向量地址,從而跳轉(zhuǎn)到相應(yīng)的異常中斷處理程序處執(zhí)行。異常處理完成后必須返回到原來程序處繼續(xù)執(zhí)行,為達(dá)到這一目的,需要執(zhí)行四個(gè)基本操作:恢復(fù)原來被保護(hù)的用戶寄存器;恢復(fù)被中斷的程序的處理器狀態(tài),即將SPSR_mode寄存器內(nèi)容復(fù)制到CPSR中;返回到發(fā)生異常中斷的指令的下一條指令處執(zhí)行,即將LR_mode寄存器的內(nèi)容復(fù)制到程序計(jì)數(shù)器PC中;清除CPSR中的中斷禁止標(biāo)志I和F,開放外部中斷和快速中斷。644)將程序計(jì)數(shù)器值(PC)設(shè)置成該異常中斷的異常向量地址,(1)最大中斷延遲當(dāng)FIQ使能時(shí),最壞情況下FIQ的延遲時(shí)間包含:1)Tsynemax(請(qǐng)求通過同步器的最長(zhǎng)時(shí)間)。Tsynemax為4個(gè)處理器周期(由內(nèi)核決定);2)Tldm(最長(zhǎng)指令的完成時(shí)間)。最長(zhǎng)的指令是加載包括PC在內(nèi)所有寄存器的LDM指令。Tldm在零等待狀態(tài)系統(tǒng)中的執(zhí)行時(shí)間為20個(gè)處理器周期;3)Texc(數(shù)據(jù)中止異常進(jìn)入時(shí)間)。Texc為3個(gè)處理器周期;4)Tfiq(FIQ進(jìn)入時(shí)間)。Tfiq為2個(gè)處理器周期(由內(nèi)核決定)。5.中斷延遲65(1)最大中斷延遲當(dāng)FIQ使能時(shí),最壞情況下FIQ的延遲總的延遲時(shí)間是29個(gè)處理器周期,在系統(tǒng)使用40MHz處理器時(shí)鐘時(shí),略微超過0.7ms。當(dāng)在時(shí)間結(jié)束后,處理器執(zhí)行在0x1C處的指令。(2)最小中斷延遲

FIQ或IRQ的最小中斷延遲是請(qǐng)求通過同步器的時(shí)間加上Tfiq(共6個(gè)處理器周期)。66總的延遲時(shí)間是29個(gè)處理器周期,在系統(tǒng)使用40MHz處理器時(shí)當(dāng)nRESET信號(hào)被拉低時(shí)(一般外部復(fù)位引腳電平的變化和芯片的其它復(fù)位源會(huì)改變這個(gè)內(nèi)核信號(hào)),內(nèi)核中止正在執(zhí)行的指令,并且地址總線繼續(xù)增加。當(dāng)nRESET信號(hào)再次變?yōu)楦唠娖綍r(shí),ARM處理器執(zhí)行下列操作:1)強(qiáng)制M[4:0]變?yōu)閎10011(管理模式);2)置位CPSR中的I和F位;3)清零CPSR中的T位;4)強(qiáng)制PC從地址0x00開始對(duì)下一條指令進(jìn)行取指;5)返回到ARM狀態(tài)并恢復(fù)執(zhí)行。在復(fù)位后,除PC和CPSR之外的所有寄存器的值都不確定。6.復(fù)位67當(dāng)nRESET信號(hào)被拉低時(shí)(一般外部復(fù)位引腳電平的變化和芯片ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指令集和相關(guān)譯碼機(jī)制較為簡(jiǎn)單。ARM體系結(jié)構(gòu)具有32位ARM指令集和16位Thumb指令集,ARM指令集效率高,但是代碼密度低;而Thumb指令集具有較高的代碼密度,卻仍然保持ARM的大多數(shù)性能上的優(yōu)勢(shì),它是ARM指令集的子集。所有的ARM指令都是可以有條件執(zhí)行的,而Thumb指令僅有一條指令具備條件執(zhí)行功能。ARM程序和Thumb程序可相互調(diào)用,相互之間狀態(tài)切換開銷幾乎為零。12.3ARM編程指令68ARM處理器是基于精簡(jiǎn)指令集計(jì)算機(jī)(RISC)原理設(shè)計(jì)的,指尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋找真實(shí)操作地址的方式。ARM處理器有8種基本尋址方式。1)寄存器尋址;2)立即尋址;3)寄存器移位尋址;4)寄存器間接尋址;5)基址尋址;6)多寄存器直接尋址;7)堆棧尋址;8)相對(duì)尋址。12.3.1ARM處理器尋址方式69尋址方式是根據(jù)指令中給出的地址碼字段來實(shí)現(xiàn)尋1.32位ARM指令集(1)分支指令;(2)數(shù)據(jù)處理指令;(3)加載和存儲(chǔ)指令;(4)協(xié)處理指令;(5)雜項(xiàng)指令12.3.2指令集ARM指令集提供了兩條產(chǎn)生異常的指令,通過這兩條指令可以用軟件的方法實(shí)現(xiàn)異常。軟件中斷指令(SWI);斷點(diǎn)中斷指令(BKPT)。2.16位Thumb指令集7012.3.2指令集ARM指令集提供了兩條產(chǎn)生異常的指令,通(1)分支指令分支指令又稱轉(zhuǎn)移指令,用于實(shí)現(xiàn)程序流程的轉(zhuǎn)移,這類指令可用來改變程序的執(zhí)行流程或調(diào)用子程序。在ARM程序中可使用專門的分支指令,也可以通過直接向程序計(jì)數(shù)器(PC)寫入轉(zhuǎn)移地址值的方法實(shí)現(xiàn)程序流程的轉(zhuǎn)移。通過向程序計(jì)數(shù)器(PC)寫入轉(zhuǎn)移地址值,便可以在4GB的地址空間中任意轉(zhuǎn)移;若在轉(zhuǎn)移之前結(jié)合使用ARM的MOVLR,PC等指令,則可保存將來的返回地址值,從而實(shí)現(xiàn)在4GB地址空間中的子程序調(diào)用。71(1)分支指令分支指令又稱轉(zhuǎn)移指令,用于實(shí)現(xiàn)程序流程的轉(zhuǎn)移,分支指令除了允許數(shù)據(jù)處理或加載指令通過PC來改變控制流以外,還提供了一個(gè)24位的符號(hào)偏移,可實(shí)現(xiàn)最大32MB向前或向生的地址空間轉(zhuǎn)移。轉(zhuǎn)移和鏈接(BL)選項(xiàng)在跳轉(zhuǎn)后將指令地址保存在R14(LR)當(dāng)中。這樣通過將LR復(fù)制得到PC可實(shí)現(xiàn)子程序的返回。另外,有的分支指令可在指令集之間進(jìn)行切換。此時(shí),分支指令執(zhí)行完成后,處理器繼續(xù)執(zhí)行Thumb指令集的指令。這樣就允許ARM代碼調(diào)用Thumb子程序,而ARM子程序也可返回到Thumb調(diào)用程序。Thumb指令集中相似的指令可實(shí)現(xiàn)對(duì)應(yīng)的ThumbARM的切換。72分支指令除了允許數(shù)據(jù)處理或加載指令通過PC來改變控制流以外,(2)數(shù)據(jù)處理指令數(shù)據(jù)處理指令分為數(shù)據(jù)傳送指令、算術(shù)/邏輯運(yùn)算指令、比較指令、乘法指令等幾種類型。數(shù)據(jù)傳送指令用于寄存器之間進(jìn)行數(shù)據(jù)的傳輸。算術(shù)運(yùn)算指令完成基本的加、減運(yùn)算。邏輯運(yùn)算指令完成常用的邏輯運(yùn)算,算術(shù)/邏輯運(yùn)算指令要將運(yùn)算結(jié)果保存在目的寄存器中,并且需要更新CPSR中的標(biāo)志位。比較指令不保存運(yùn)算結(jié)果,只更新CPSR中的標(biāo)志。數(shù)據(jù)傳送指令

算術(shù)/邏輯運(yùn)算指令比較指令

乘法指令73(2)數(shù)據(jù)處理指令數(shù)據(jù)處理指令分為數(shù)據(jù)傳送指令、算術(shù)/邏輯運(yùn)數(shù)據(jù)傳送指令主要用于將一個(gè)寄存器中的數(shù)據(jù)傳送到另一個(gè)寄存器中,或者將一個(gè)立即數(shù)傳送到寄存器中,這類指令通常用來對(duì)寄存器初始化。數(shù)據(jù)傳送指令包括數(shù)據(jù)直接傳送指令和數(shù)據(jù)取反傳送指令。74數(shù)據(jù)傳送指令主要用于將一個(gè)寄存器中的數(shù)據(jù)傳送到另一個(gè)寄存器中算術(shù)/邏輯運(yùn)算指令算術(shù)/邏輯運(yùn)算指令一共有12條,它們使用相同的指令格式。它們最多使用兩個(gè)源操作數(shù)來執(zhí)行算術(shù)或邏輯操作,并將結(jié)果寫入目標(biāo)寄存器。也選擇根據(jù)結(jié)果更新條件代碼標(biāo)志。兩個(gè)源操作數(shù)中,其中一個(gè)一定是寄存器,另一個(gè)有兩種基本形式:立即數(shù)或是寄存器,可選擇移位。如果操作數(shù)是一個(gè)移位寄存器,移位計(jì)數(shù)可以是一個(gè)立即數(shù)或另一個(gè)寄存器的值。可以指定4種移位的類型。每一條算術(shù)/邏輯運(yùn)算指令都可以執(zhí)行算術(shù)/邏輯和移位操作。這樣就可輕松實(shí)現(xiàn)各種不同的分支指令。75算術(shù)/邏輯運(yùn)算指令算術(shù)/邏輯運(yùn)算指令一共有12條,它們使用相比較指令比較指令通常用于將一個(gè)寄存器與一個(gè)32位的值進(jìn)行減法運(yùn)算,根據(jù)結(jié)果更新CPSR中的標(biāo)志位。對(duì)于比較指令,不需要使用S后綴即可改變標(biāo)志位的值。需要注意的是,其運(yùn)算結(jié)果不保存,因而不影響其他寄存器的內(nèi)容。比較指令更新標(biāo)志位后,其他指令可能通過條件發(fā)送來改變程序的執(zhí)行順序。比較指令源操作數(shù)的格式與算術(shù)/邏輯指令相同,包括移位操作的功能。76比較指令比較指令通常用于將一個(gè)寄存器與一個(gè)32位的值進(jìn)行減法乘法指令乘法指令是將一對(duì)寄存器的內(nèi)容相乘,然后根據(jù)指令類型把結(jié)果累加到其他的寄存器。ARM處理器支持的乘法指令與乘加指令共有6條。根據(jù)運(yùn)算結(jié)果可分為32位運(yùn)算和64位運(yùn)算兩類。64位乘法又稱為長(zhǎng)整型乘法指令,由于結(jié)果太長(zhǎng),不能放在一個(gè)32位的寄存器中,所以把結(jié)果存放在兩個(gè)32位的寄存器Rdlo和Rdhi中。Rdlo存放低32位,Rdhi存放高32位。與前述的數(shù)據(jù)處理指令不同,指令中的所有源操作數(shù)和目的寄存器都必須為通用寄存器,不能為立即數(shù)或被移位了的寄存器。同時(shí),目的寄存器Rd和操作數(shù)Rm必須是不同的寄存器。77乘法指令乘法指令是將一對(duì)寄存器的內(nèi)容相乘,然后根據(jù)指令類型把(3)加載和存儲(chǔ)指令A(yù)RM指令系統(tǒng)中的加載和存儲(chǔ)指令,用于在ARM寄存器和存儲(chǔ)器之間傳送數(shù)據(jù)。加載指令用于將存儲(chǔ)器中的數(shù)據(jù)傳送到寄存器,存儲(chǔ)指令則將寄存器中的數(shù)據(jù)傳送到存儲(chǔ)器中。處理器對(duì)存儲(chǔ)器的訪問只能通過加載和存儲(chǔ)指令實(shí)現(xiàn)。ARM指令系統(tǒng)中有3種加載和存儲(chǔ)指令:加載和存儲(chǔ)寄存器指令、加載和存儲(chǔ)多個(gè)寄存器指令和交換寄存器和存儲(chǔ)器指令。加載和存儲(chǔ)寄存器指令在ARM寄存器和存儲(chǔ)器之間提供靈活的單數(shù)據(jù)項(xiàng)傳送方式。支持的數(shù)據(jù)項(xiàng)類型為字節(jié)(8位)、半字(16位)和字(32位)。78(3)加載和存儲(chǔ)指令A(yù)RM指令系統(tǒng)中的加載和存儲(chǔ)指令,用于在加載和存儲(chǔ)寄存器指令加載寄存器指令可將一個(gè)32位字、一個(gè)16位半字或一個(gè)8位字節(jié)從存儲(chǔ)器裝入寄存器。字節(jié)和半字在加載時(shí)自動(dòng)實(shí)現(xiàn)零擴(kuò)展和符號(hào)擴(kuò)展。存儲(chǔ)寄存器指令可以將一個(gè)32位字、一個(gè)16位半字或一個(gè)8位字節(jié)從寄存器保存到存儲(chǔ)器。加載和存儲(chǔ)寄存器指令有3種主要的尋址模式,這3種模式都使用指令指定的基址寄存器和偏移量:79加載和存儲(chǔ)寄存器指令加載寄存器指令可將一個(gè)32位字、一個(gè)16在偏移尋址模式中,將基址寄存器值加上或減去一個(gè)偏移量得到存儲(chǔ)器地址;在前變址尋址模式中,存儲(chǔ)器地址的構(gòu)成方式與偏移尋址模式相同,但存儲(chǔ)器地址會(huì)回寫到基址寄存器;在后變址尋址模式中,存儲(chǔ)器地址為基址寄存器的值?;芳拇嫫鞯闹导由匣驕p去偏移量的結(jié)果寫入基址寄存器。在每種情況下,偏移量都可以是一個(gè)立即數(shù)或是一個(gè)變址寄存器的值。基于寄存器的偏移量也可使用移位操作來調(diào)整。80在偏移尋址模式中,將基址寄存器值加上或減去一個(gè)偏移量得到存儲(chǔ)加載和存儲(chǔ)多個(gè)寄存器指令加載多個(gè)寄存器(LDM)和存儲(chǔ)多個(gè)寄存器(STM)指令可以對(duì)任意數(shù)目的通用寄存器執(zhí)行塊轉(zhuǎn)移。支持下列4種尋址模式:前遞增、后遞增、前遞減、后遞減?;刂酚梢粋€(gè)寄存器值指定,它在轉(zhuǎn)移后可選擇更新。由于子程序返回地址和PC值位于通用寄存器當(dāng)中,使用LDM和STM可構(gòu)成非常高效的子程序入口和出口:子程序入口處的單個(gè)STM指令可將寄存器內(nèi)容和返回地址壓入堆棧,在處理中更新堆棧指針;子程序出口處的單個(gè)LDM指令可將寄存器內(nèi)容從堆棧恢復(fù),將返回地址裝入PC并更新堆棧指針;81加載和存儲(chǔ)多個(gè)寄存器指令加載多個(gè)寄存器(LDM)和存儲(chǔ)多個(gè)寄交換寄存器和存儲(chǔ)器指令交換指令(SWP)執(zhí)行下列操作:從寄存器指定的存儲(chǔ)器位置裝入一個(gè)值;將寄存器內(nèi)容保存到同一個(gè)存儲(chǔ)器位置;將步驟1裝入的值寫入一個(gè)寄存器。如果步驟1和3指定同一個(gè)寄存器,那么存儲(chǔ)器和寄存器的內(nèi)容就實(shí)現(xiàn)了互換。交換指令執(zhí)行一個(gè)特殊的、不可分割的總線操作。該操作允許信號(hào)量的原子更新,并支持32位字和8位字節(jié)信號(hào)量。82交換寄存器和存儲(chǔ)器指令交換指令(SWP)執(zhí)行下列操作:82(4)協(xié)處理器指令數(shù)據(jù)處理指令。啟動(dòng)一個(gè)協(xié)處理器專用的內(nèi)部操作;數(shù)據(jù)傳送指令。將數(shù)據(jù)在協(xié)處理器和存儲(chǔ)器之間進(jìn)行傳送。傳送的地址由ARM處理器計(jì)算;寄存器傳送指令。允許協(xié)處理器傳送到ARM寄存器,或?qū)RM寄存器值傳送到協(xié)處理器。83(4)協(xié)處理器指令83(5)雜項(xiàng)指令包括狀態(tài)寄存器分支指令和異常產(chǎn)生指令。狀態(tài)寄存器分支指令將CPSR或SPSR的內(nèi)容轉(zhuǎn)移到一個(gè)通用寄存器,或者反過來將通用寄存器的內(nèi)容寫入CPSR或SPSR寄存器。寫CPSR會(huì):設(shè)定條件代碼標(biāo)志的值;設(shè)定中斷使能位的值;設(shè)定處理器模式84(5)雜項(xiàng)指令包括狀態(tài)寄存器分支指令和異常產(chǎn)生指令。84產(chǎn)生異常的指令軟件中斷指令(SWI)。SWI指令導(dǎo)致產(chǎn)生軟件中斷異常,它通常用于向操作系統(tǒng)請(qǐng)求調(diào)用OS定義的服務(wù)。SWI指令導(dǎo)致處理器進(jìn)入管理模式(特權(quán)模式)。這樣一個(gè)非特權(quán)任務(wù)就能對(duì)特權(quán)的功能進(jìn)行訪問,但是只能以O(shè)S所允許的方式訪問。斷點(diǎn)中斷指令(BKPT)。BKPT指令產(chǎn)生軟件斷點(diǎn)中斷,用于調(diào)試程序。85產(chǎn)生異常的指令軟件中斷指令(SWI)。SWI指令導(dǎo)致產(chǎn)生軟件2.16位Thumb指令集分支指令數(shù)據(jù)處理指令加載和存儲(chǔ)指令異常產(chǎn)生指令Thumb在32位結(jié)構(gòu)上實(shí)現(xiàn)了16位的指令集,這樣可提供比16位結(jié)構(gòu)更高的性能和比32位結(jié)構(gòu)更高的代碼密度。Thumb指令集不是一個(gè)完整的指令集,它僅僅是最通用的ARM指令的子集,不能期望處理器只執(zhí)行Thumb指令而不支持ARM指令。Thumb指令長(zhǎng)度為16位,每條指令都對(duì)應(yīng)一條32位ARM指令。862.16位Thumb指令集分支指令Thumb在32位結(jié)構(gòu)分支指令與ARM分支指令不同,Thumb分支指令B、BX和BL中的偏移域沒有固定的位數(shù);不過讀者不必關(guān)心它,匯編程序會(huì)自動(dòng)處理。其中指令B是Thumb指令中惟一條件執(zhí)行的指令。轉(zhuǎn)移和連接(BL)選項(xiàng)在跳轉(zhuǎn)后將指令地址保存在R14(LR)當(dāng)中。這樣通過將LR復(fù)制到PC可實(shí)現(xiàn)子程序的返回。另外有的分支指令可在指令集之間進(jìn)行切換。這樣就允許Thumb子程序和ARM子程序可以相互調(diào)用。87分支指令87數(shù)據(jù)處理指令數(shù)據(jù)處理指令都能夠映射到相應(yīng)的ARM數(shù)據(jù)處理指令(包括乘法指令);盡管ARM指令支持在單條指令中完成一個(gè)操作數(shù)的移位和ALU操作,但Thumb指令集將移位操作和ALU操作分離為不同的指令。Thumb指令對(duì)8個(gè)寄存器操作的數(shù)據(jù)處理指令都更新條件碼標(biāo)志(同功能的ARM指令僅在帶S后綴時(shí)更新條件碼標(biāo)志位)。除CMP指令外,對(duì)高8個(gè)寄存器操作的指令不改變條件碼標(biāo)志(CMP指令的用途就是改變條件碼標(biāo)志)。88數(shù)據(jù)處理指令數(shù)據(jù)處理指令都能夠映射到相應(yīng)的ARM數(shù)據(jù)處理指加載和存儲(chǔ)指令包括加載和存儲(chǔ)單寄存器指令以及加載和存儲(chǔ)多個(gè)寄存器指令兩類;加載和存儲(chǔ)單寄存器指令是從ARM的加載和存儲(chǔ)單寄存器指令集中精選出來的子集,并且與等價(jià)

ARM指令有嚴(yán)格相同的語義和完全相同的匯編格式。Thumb只有6條加載和存儲(chǔ)多個(gè)寄存器的指令,分別為PUSH{reglist}、POP{reglist}、PUSH{reglist,LR}、POP{reglist,PC}、LDMIARn,{reglist}和STMIARn,{reglist}。這些指令具體使用時(shí)有很多限制。89加載和存儲(chǔ)指令包括加載和存儲(chǔ)單寄存器指令以及加載和存儲(chǔ)多個(gè)異常產(chǎn)生指令有兩種類型的指令用于產(chǎn)生特定的異常,軟件中斷指令(SWI)和斷點(diǎn)中斷指令(BKPT)。軟件中斷指令(SWI)。SWI指令導(dǎo)致產(chǎn)生軟件中斷異常,它通常用于向操作系統(tǒng)請(qǐng)求調(diào)用OS定義的服務(wù)。SWI指令導(dǎo)致處理器進(jìn)入管理模式(特權(quán)模式)。這樣一個(gè)非特權(quán)任務(wù)就能對(duì)特權(quán)的功能進(jìn)行訪問,但是只能以O(shè)S所允許的方式訪問;斷點(diǎn)中斷指令(BKPT)。BKPT指令產(chǎn)生軟件斷點(diǎn)中斷,用于調(diào)試程序。90異常產(chǎn)生指令有兩種類型的指令用于產(chǎn)生特定的異常,軟件中斷

ARM匯編程序由機(jī)器指令、偽指令和宏指令組成。偽指令不像機(jī)器指令那樣在處理器運(yùn)行期間由機(jī)器執(zhí)行,而是在匯編程序?qū)υ闯绦騾R編期間由匯編程序處理。將偽指令與指令集一起介紹是因?yàn)樗鼈冊(cè)趨R編時(shí)會(huì)被合適的機(jī)器指令代替,實(shí)現(xiàn)真正機(jī)器指令操作。宏是一段獨(dú)立的程序代碼,它是通過偽指令定義的。在程序中使用宏指令即可調(diào)用宏。當(dāng)程序被匯編時(shí),匯編程序?qū)?duì)每個(gè)調(diào)用進(jìn)行展開,用宏定義體取代源程序中的宏指令。12.3.3偽指令91ARM匯編程序由機(jī)器指令、偽指令和宏指令組成1.符號(hào)定義偽指令;(GBLA、GBLL、GBLS),(LCLA、LCLL、LCLS),(SETA、SETL、SETS),RLIST,CN,CP,DN、SN,F(xiàn)N。2.數(shù)據(jù)定義偽指令;LTORG,MAP,F(xiàn)IELD,SPACE,DCB,DCD、DCDU,DCDO,DCFD、DCFDU,DCFS、DCFSU,DCI,DCQ、DCQU,DCW、DCWU。3.報(bào)告?zhèn)沃噶?;ASSERT,INFO,OPT,TTL、SUBT,

偽指令類型921.符號(hào)定義偽指令;(GBLA、GBLL、GBLS),(L4.匯編控制偽指令;IF、ELSE和ENDIF,MACRO和MEND,WHILE和WEND5.雜項(xiàng)偽指令;ALIGN,AREA,CODE16和CODE32,END,ENTRY,EQU,EXPORT和GLOBAL,IMPORT和EXTERN,GET和INCLUDE,INCBIN,KEEP,NOFP,REQUIRE,PEQUIRE8和PRESERVE8,RN,ROUT6.ARM偽指令;ADR、ADRL、LDR、NOP、LDFD和LDFS7.Thumb偽指令;ADR、LDR和NOP934.匯編控制偽指令;IF、ELSE和ENDIF,MACRO和

ARM匯編語言語句格式如下所示:{symbol}{instruction|directive|pseudo-instruction}{;comment}其中,instruction為指令。在ARM匯編語言中,指令不能從一行的行頭開始。在一行語句中,指令的前面必須有空格或者符號(hào);directive為偽操作;pseudo-instruction為偽指令;symbol為符號(hào)。在ARM匯編語言中,符號(hào)必須從一行的行頭開始,并且符號(hào)中不能包含空格。在指令和偽指令中符號(hào)用作地址標(biāo)號(hào)(label);在有些偽操作中,符號(hào)用作變量或者常量;comment為語句的注釋。在ARM匯編語言中注釋以分號(hào)“;”開頭。注釋的結(jié)尾即為一行的結(jié)尾。注釋也可以單獨(dú)占用一行。12.4ARM編程程序設(shè)計(jì)

12.4.1ARM匯編語句格式94ARM匯編語言語句格式如下所示:12.4ARM編程程序在ARM匯編語言中,符號(hào)可以代表地址、變量和數(shù)字常量。當(dāng)符號(hào)代表地址時(shí)又稱為標(biāo)號(hào)(label)。當(dāng)標(biāo)號(hào)以數(shù)字開頭時(shí),其作用范圍為當(dāng)前段(當(dāng)沒有使用ROUT偽操作時(shí)),這種標(biāo)號(hào)又稱為局部標(biāo)號(hào)。符號(hào)包括變量、數(shù)字常量、標(biāo)號(hào)和局部標(biāo)號(hào)。符號(hào)的命名規(guī)則如下:

符號(hào)由大小寫字母、數(shù)字以及下劃線組成符號(hào)區(qū)分大小寫;

局部標(biāo)號(hào)以數(shù)字開頭其他的符號(hào)都不能以數(shù)字開頭;

符號(hào)中的所有字符都是有意義的;

符號(hào)在其作用范圍內(nèi)必須惟一其作用范圍內(nèi)不可有同名的符號(hào);

程序中的符號(hào)不能與系統(tǒng)內(nèi)部變量或者系統(tǒng)預(yù)定義的符號(hào)同名;

程序中的符號(hào)通常不能與指令助記符或者偽操作同名。12.4.2ARM匯編語句符號(hào)95在ARM匯編語言中,符號(hào)可以代表地址、變量和數(shù)字

表達(dá)式是由符號(hào)、數(shù)值、單目或多目操作符以及括號(hào)組成的。字符串表達(dá)式字符串表達(dá)式由字符串、字符串變量、操作符以及括號(hào)組成;數(shù)字表達(dá)式數(shù)字表達(dá)式由數(shù)字常量、數(shù)字變量、操作符和括號(hào)組成;基于寄存器和基于PC的表達(dá)式基于寄存器的表達(dá)式表示了某個(gè)寄存器的值加上(或減去)一個(gè)數(shù)字靜態(tài)式,基于PC的表達(dá)式表示了PC寄存器的值加上(或減去)一個(gè)數(shù)字表達(dá)式;邏輯表達(dá)式邏輯表達(dá)式由邏輯量、邏輯操作符、關(guān)系操作符以及括號(hào)組成;其他的一些操作符。12.4.3ARM匯編語言表達(dá)式96表達(dá)式是由符號(hào)、數(shù)值、單目或多目操作符以及括號(hào)組成的。1

ARM匯編程序除了使用ARM匯編指令外,還大量使用各種偽指令。ARM匯編程序采用分段式設(shè)計(jì),以程序段為單位組織代碼。段是相對(duì)獨(dú)立、不可分割的指令或數(shù)據(jù)序列,具有特定的名稱。段分為代碼段和數(shù)據(jù)段,代碼段的內(nèi)容為可執(zhí)行代碼,數(shù)據(jù)段存放代碼運(yùn)行時(shí)所而用到的數(shù)據(jù)。一個(gè)匯編程序至少應(yīng)該有一個(gè)代碼段。當(dāng)程序比較長(zhǎng)時(shí),可以分割成多個(gè)代碼段和數(shù)據(jù)段,多個(gè)段在程序編譯連接時(shí)最終形成一個(gè)可執(zhí)行的映像文件。可執(zhí)行的映像文件通常由以下幾部分構(gòu)成:

一個(gè)或多個(gè)代碼段代碼段的屬性為只讀;

零個(gè)或多個(gè)包含初始化數(shù)據(jù)的數(shù)據(jù)段數(shù)據(jù)段的屬性為可讀寫;

零個(gè)或多個(gè)不包含初始化數(shù)據(jù)的數(shù)據(jù)段數(shù)據(jù)段的屬性為可讀寫。12.4.4ARM匯編程序結(jié)構(gòu)97ARM匯編程序除了使用ARM匯編指令外,還大

ARM匯編語言可實(shí)現(xiàn)順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)等3大程序控制結(jié)構(gòu)及子程序調(diào)用與返回。1.順序結(jié)構(gòu)順序結(jié)構(gòu)是程序設(shè)計(jì)中最簡(jiǎn)單也是最基本的一種控制結(jié)構(gòu),按照解決問題的順序?qū)懗鱿鄳?yīng)的語句,它的執(zhí)行是自上而下,依次執(zhí)行。ARM是32位處理器,一次只能完成兩個(gè)32位數(shù)據(jù)之間的運(yùn)算。若要實(shí)現(xiàn)兩個(gè)64位數(shù)相加,關(guān)鍵在于首先完成兩個(gè)數(shù)的低32位相加并保存進(jìn)位,再完成兩個(gè)數(shù)的高32位及低32位加法進(jìn)位之間的加法,即得到最終的64位加法運(yùn)算結(jié)果。12.4.5ARM匯編程序結(jié)構(gòu)設(shè)計(jì)98ARM匯編語言可實(shí)現(xiàn)順序結(jié)構(gòu)、分支結(jié)構(gòu)、循環(huán)結(jié)構(gòu)例12-1實(shí)現(xiàn)兩個(gè)64位數(shù)相加的匯編程序。12.4.5ARM匯編程序結(jié)構(gòu)設(shè)計(jì)99例12-1實(shí)現(xiàn)兩個(gè)64位數(shù)相加的匯編程序。12.4.5A

12.4.5ARM匯編程序結(jié)構(gòu)設(shè)計(jì)AREAadd64,CODE,READONLYENTRYstartLDRR0,=data1;R0中保存data1的首地址LDRR1,[R0];用寄存器間接尋址方式讀數(shù)據(jù)1到高32位到R1LDRR2,[R0,#4];用寄存器間接尋址方式讀數(shù)據(jù)1的低32位到R2LDRR0,=data2;R0中保存data2的首地址LDRR3,[R0];用寄存器間接尋址方式讀數(shù)據(jù)2到高32位到R3LDRADDSADCR4,[R0,#4]R6,R2,R4R5,R1,R3;用寄存器間接尋址方式讀數(shù)據(jù)2的低32位到R4;低32位相加,并影響標(biāo)志位,保存進(jìn)位;高32位相加,并使用標(biāo)示位CSTRSTRdata1data2resultR0,[R0]R6,[R0,#R]DCD0x11223344,0XffddccbbDCD0x11223344,0XffddccbbDCD0,0END10012.4.5ARM匯編程序結(jié)構(gòu)設(shè)計(jì)ARE2.分支結(jié)構(gòu)順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問題,但不能先判斷再選擇。對(duì)于要先判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法的關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合帶有邏輯或關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要繪制其算法流程圖,然后根據(jù)程序流程寫出源程序,這樣就能把程序設(shè)計(jì)分析與語言分開,使得問題簡(jiǎn)單化,易于理解。1012.分支結(jié)構(gòu)101例12-2實(shí)現(xiàn)兩個(gè)數(shù)的比較,并保存較大數(shù)

。AREAadd64,CODE,READONLYENTRYstartLDRR0,data1;R0中保存data1save

溫馨提示

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