




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
嵌入式系統(tǒng)技術(shù)與設(shè)計(jì)第2章ARM體系結(jié)構(gòu)與指令集嵌入式系統(tǒng)技術(shù)與設(shè)計(jì)第2章ARM體系結(jié)構(gòu)與指令集1ARM體系結(jié)構(gòu)的特點(diǎn)2.1ARM處理器工作模式2.2寄存器組織2.3流水線2.4ARM存儲系統(tǒng)2.5異常2.6ARM處理器的尋址方式2.7ARM處理器的指令集2.8ARM體系結(jié)構(gòu)的特點(diǎn)2.1ARM處理器工作模式2.2寄存器組2本章將要介紹ARM體系結(jié)構(gòu)、ARM處理器的工作模式及常用指令集等。通過本章的學(xué)習(xí),希望讀者能夠了解ARM處理器內(nèi)部的主要工作單元、基本工作原理,掌握常用指令集,并為以后的程序設(shè)計(jì)打下基礎(chǔ)。本章將要介紹ARM體系結(jié)構(gòu)、ARM處理器的工作模式及3本章主要內(nèi)容:●ARM體系結(jié)構(gòu)的特點(diǎn)●ARM處理器的工作模式●寄存器組織●流水線●ARM存儲●異常●ARM處理器的尋址方式●ARM處理器的指令集本章主要內(nèi)容:42.1ARM體系結(jié)構(gòu)的特點(diǎn)ARM內(nèi)核采用RISC體系結(jié)構(gòu)。RISC技術(shù)的主要特點(diǎn)參見1.3節(jié)。ARM體系結(jié)構(gòu)的主要特征如下(在本書的后續(xù)章節(jié)中將對這些特征做詳細(xì)講解):(1)大量的寄存器,它們都可以用于多種用途;(2)Load/Store體系結(jié)構(gòu);(3)每條指令都條件執(zhí)行;(4)多寄存器的Load/Store指令;2.1ARM體系結(jié)構(gòu)的特點(diǎn)ARM內(nèi)核采用RISC5(5)能夠在單時(shí)鐘周期執(zhí)行的單條指令內(nèi)完成一項(xiàng)普通的移位操作和一項(xiàng)普通的ALU操作;(6)通過協(xié)處理器指令集來擴(kuò)展ARM指令集,包括在編程模式中增加了新的寄存器和數(shù)據(jù)類型。(7)如果把Thumb指令集也當(dāng)作ARM體系結(jié)構(gòu)的一部分,那么還可以加上:在Thumb體系結(jié)構(gòu)中以高密度16位壓縮形式表示指令集。(5)能夠在單時(shí)鐘周期執(zhí)行的單條指令內(nèi)完成一項(xiàng)普通的62.2ARM處理器工作模式表2-1 ARM處理器的工作模式處理器工作模式簡
寫描
述用戶模式(User)usr正常程序執(zhí)行模式,大部分任務(wù)執(zhí)行在這種模式下快速中斷模式(FIQ)fiq當(dāng)一個(gè)高優(yōu)先級(fast)中斷產(chǎn)生時(shí)將會進(jìn)入這種模式,一般用于高速數(shù)據(jù)傳輸和通道處理外部中斷模式(IRQ)irq當(dāng)一個(gè)低優(yōu)先級(normal)中斷產(chǎn)生時(shí)將會進(jìn)入這種模式,一般用于通常的中斷處理特權(quán)模式(Supervisor)svc當(dāng)復(fù)位或軟中斷指令執(zhí)行時(shí)進(jìn)入這種模式,是一種供操作系統(tǒng)使用的保護(hù)模式數(shù)據(jù)訪問中止模式(Abort)abt當(dāng)存取異常時(shí)將會進(jìn)入這種模式,用于虛擬存儲或存儲保護(hù)未定義指令中止模式(Undef)und當(dāng)執(zhí)行未定義指令時(shí)進(jìn)入這種模式,有時(shí)用于通過軟件仿真協(xié)處理器硬件的工作方式系統(tǒng)模式(System)sys使用和User模式相同寄存器集的模式,用于運(yùn)行特權(quán)級操作系統(tǒng)任務(wù)2.2ARM處理器工作模式表2-1 ARM處理器的工7除用戶模式外的其他6種處理器模式稱為特權(quán)模式(PrivilegedModes)。在特權(quán)模式下,程序可以訪問所有的系統(tǒng)資源,也可以任意地進(jìn)行處理器模式切換。其中以下5種又稱為異常模式:(1)快速中斷模式(FIQ);(2)外部中斷模式(IRQ);(3)特權(quán)模式(Supervior);(4)數(shù)據(jù)訪問中止模式(Abort);(5)未定義指令中止模式(Undef)。除用戶模式外的其他6種處理器模式稱為特權(quán)模式(Pri82.3寄存器組織ARM處理器有如下37個(gè)32位長的寄存器:(1)30個(gè)通用寄存器;(2)6個(gè)狀態(tài)寄存器:1個(gè)CPSR(CurrentProgramStatusRegister,當(dāng)前程序狀態(tài)寄存器),5個(gè)SPSR(SavedProgramStatusRegister,備份程序狀態(tài)寄存器);(3)1個(gè)PC(ProgramCounter,程序計(jì)數(shù)器)。2.3寄存器組織ARM處理器有如下37個(gè)32位長9ARM處理器共有7種不同的處理器模式,在每一種處理器模式中有一組相應(yīng)的寄存器組。表2-2列出了ARM處理器的寄存器組織概要。ARM處理器共有7種不同的處理器模式,在每一種處理器10表2-2 ARM處理器的寄存器組織概要User
FIQIRQ
SVC
Undef
AbortR0UsermodeR0~R7,R15和CPSRUsermodeR0~R12,R15和CPSRUsermodeR0~R12,R15和CPSRUsermodeR0~R12,R15和CPSRUsermodeR0~R12,R15和CPSR
R1R2R3R4R5R6R7R8R8R9R9R10R10R11R11R12R12R13(SP)R13(SP)R13R13R13R13R14(LR)R14(LR)R14R14R14R14R15(PC)
CPSR
SPSRSPSRSPSRSPSRSPSR表2-2 ARM處理器的寄存器組織概要UserFIQI112.3.1通用寄存器通用寄存器根據(jù)其分組與否可分為以下2類。(1)未分組寄存器(theUnbankedRegister),包括R0~R7。(2)分組寄存器(theBankedRegister),包括R8~R14。2.3.1通用寄存器通用寄存器根據(jù)其分組與否可分12未分組寄存器包括R0~R7。未分組寄存器沒有被系統(tǒng)用于特殊的用途,任何可采用通用寄存器的應(yīng)用場合都可以使用未分組寄存器。1.未分組寄存器未分組寄存器包括R0~R7。1.未分組寄存器13對于分組寄存器R13和R14來說,每個(gè)寄存器對應(yīng)6個(gè)不同的物理寄存器。其中的一個(gè)是用戶模式和系統(tǒng)模式公用的,而另外5個(gè)分別用于5種異常模式。訪問時(shí)需要指定它們的模式。名字形式如下:(1)R13_<mode>(2)R14_<mode>其中,<mode>可以是以下幾種模式之一:usr、svc、abt、und、irp及fiq。2.分組寄存器對于分組寄存器R13和R14來說,每個(gè)寄存器對應(yīng)6個(gè)14寄存器R14又被稱為連接寄存器(LinkRegister,LR),在ARM體系結(jié)構(gòu)中具有下面兩種特殊的作用。(1)每一種處理器模式用自己的R14存放當(dāng)前子程序的返回地址。寄存器R14又被稱為連接寄存器(LinkRegis15(2)當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理寄存器R14被設(shè)置成該異常模式的返回地址,對于有些模式R14的值可能與返回地址有一個(gè)常數(shù)的偏移量(如數(shù)據(jù)異常使用SUBPC,LR,#8返回)。R14也可以被用做通用寄存器使用。(2)當(dāng)異常中斷發(fā)生時(shí),該異常模式特定的物理寄存器R162.3.2狀態(tài)寄存器當(dāng)前程序狀態(tài)寄存器(CurrentProgramStatusRegister,CPSR)可以在任何處理器模式下被訪問,它包含下列內(nèi)容:(1)ALU(ArithmeticLogicUnit,算術(shù)邏輯單元)狀態(tài)標(biāo)志的備份;(2)當(dāng)前的處理器模式;(3)中斷使能標(biāo)志;(4)設(shè)置處理器的狀態(tài)(只在4T架構(gòu))。2.3.2狀態(tài)寄存器當(dāng)前程序狀態(tài)寄存器(Curr17圖2-1程序狀態(tài)寄存器格式圖2-1程序狀態(tài)寄存器格式18N(Negative)、Z(Zero)、C(Carry)和V(oVerflow)通稱為條件標(biāo)志位。(1)N(2)Z(3)C(4)V1.標(biāo)志位N(Negative)、Z(Zero)、C(Carr19在帶DSP指令擴(kuò)展的ARMv5及更高版本中,bit[27]被指定用于指示增強(qiáng)的DAP指令是否發(fā)生了溢出,因此也就被稱為Q標(biāo)志位。同樣,在SPSR中bit[27]也被稱為Q標(biāo)志位,用于在異常中斷發(fā)生時(shí)保存和恢復(fù)CPSR中的Q標(biāo)志位。2.Q標(biāo)志位在帶DSP指令擴(kuò)展的ARMv5及更高版本中,bit20CPSR的低8位(I、F、T及M[4∶0])統(tǒng)稱為控制位。當(dāng)異常發(fā)生時(shí),這些位的值將發(fā)生相應(yīng)的變化。另外,如果在特權(quán)模式下,也可以通過軟件編程來修改這些位的值。(1)中斷禁止位(2)狀態(tài)控制位(3)模式控制位3.控制位CPSR的低8位(I、F、T及M[4∶0])統(tǒng)稱為控21表2-3 狀態(tài)控制位M[4∶0]含義M[4∶0]處理器模式可以訪問的寄存器0b10000UserPC,R14~R0,CPSR0b10001FIQPC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq0b10010IRQPC,R14_irq~R13_irq,R12~R0,CPSR,SPSR_irq0b10011SupervisorPC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc0b10111AbortPC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt0b11011UndefinedPC,R14_und~R13_und,R12~R0,CPSR,SPSR_und0b11111SystemPC,R14~R0,CPSR(ARMv4及更高版本)表2-3 狀態(tài)控制位M[4∶0]含義M[4∶0]處理器可222.3.3程序計(jì)數(shù)器程序計(jì)數(shù)器R15又被記為PC。程序計(jì)數(shù)器在下面兩種情況下用于特殊的目的。(1)讀程序計(jì)數(shù)器。(2)寫程序計(jì)數(shù)器。2.3.3程序計(jì)數(shù)器程序計(jì)數(shù)器R15又被記為PC232.4流水線2.4.1流水線的概念與原理處理器按照一系列步驟來執(zhí)行每一條指令,典型的步驟如下:(1)從存儲器讀取指令(fetch);(2)譯碼以鑒別它是屬于哪一條指令(decode);(3)從指令中提取指令的操作數(shù)(這些操作數(shù)往往存在于寄存器中)(reg);2.4流水線2.4.1流水線的概念與原理24(4)將操作數(shù)進(jìn)行組合以得到結(jié)果或存儲器地址(ALU);(5)如果需要,則訪問存儲器以存儲數(shù)據(jù)(mem);(6)將結(jié)果寫回到寄存器堆(res)。(4)將操作數(shù)進(jìn)行組合以得到結(jié)果或存儲器地址(ALU252.4.2流水線的分類到ARM7為止的ARM處理器使用簡單的3級流水線,它包括下列流水線級。(1)取指令(fetch):從寄存器裝載一條指令。(2)譯碼(decode):識別被執(zhí)行的指令,并為下一個(gè)周期準(zhǔn)備數(shù)據(jù)通路的控制信號。在這一級,指令占有譯碼邏輯,不占用數(shù)據(jù)通路。(3)執(zhí)行(excute):處理指令并將結(jié)果寫回寄存器。1.3級流水線ARM組織2.4.2流水線的分類到ARM7為止的ARM處26在ARM9TDMI中使用了典型的5級流水線,5級流水線包括下面的流水線級。(1)取指令(fetch):從存儲器中取出指令,并將其放入指令流水線。(2)譯碼(decode):指令被譯碼,從寄存器堆中讀取寄存器操作數(shù)。在寄存器堆中有3個(gè)操作數(shù)讀端口,因此,大多數(shù)ARM指令能在1個(gè)周期內(nèi)讀取其操作數(shù)。2.5級流水線ARM組織在ARM9TDMI中使用了典型的5級流水線,5級流水27(3)執(zhí)行(execute):將其中1個(gè)操作數(shù)移位,并在ALU中產(chǎn)生結(jié)果。如果指令是Load或Store指令,則在ALU中計(jì)算存儲器的地址。(4)緩沖/數(shù)據(jù)(buffer/data):如果需要則訪問數(shù)據(jù)存儲器,否則ALU只是簡單地緩沖1個(gè)時(shí)鐘周期。(5)回寫(write-back):將指令的結(jié)果回寫到寄存器堆,包括任何從寄存器讀出的數(shù)據(jù)。(3)執(zhí)行(execute):將其中1個(gè)操作數(shù)移位,28在ARM10中,將流水線的級數(shù)增加到6級,使系統(tǒng)的平均處理能力達(dá)到了1.3DMIPS/MHz。3.6級流水線ARM組織在ARM10中,將流水線的級數(shù)增加到6級,使系統(tǒng)的平29圖2-46級流水線指令的執(zhí)行過程圖2-46級流水線指令的執(zhí)行過程302.4.3影響流水線性能的因素1.互鎖2.跳轉(zhuǎn)指令2.4.3影響流水線性能的因素1.互鎖312.5ARM存儲系統(tǒng)將某個(gè)分區(qū)或是設(shè)備掛載了以后才能使用,但是當(dāng)計(jì)算機(jī)重新啟動以后,又需要重新掛載,這個(gè)時(shí)候可以通過修改/etc/fstab文件實(shí)現(xiàn)開機(jī)自動掛載文件系統(tǒng)。2.5ARM存儲系統(tǒng)將某個(gè)分區(qū)或是設(shè)備掛載了以后32ARM存儲系統(tǒng)有非常靈活的體系結(jié)構(gòu),可以適應(yīng)不同的嵌入式應(yīng)用系統(tǒng)的需要。ARM存儲器系統(tǒng)可以使用簡單的平板式地址映射機(jī)制(就像一些簡單的單片機(jī)一樣,地址空間的分配方式是固定的,系統(tǒng)中各部分都使用物理地址),也可以使用其他技術(shù)提供功能更為強(qiáng)大的存儲系統(tǒng)。ARM存儲系統(tǒng)有非常靈活的體系結(jié)構(gòu),可以適應(yīng)不同的嵌33例如:(1)系統(tǒng)可能提供多種類型的存儲器件,如Flash、ROM、SRAM等;(2)Cache技術(shù);(3)寫緩存技術(shù)(writebuffers);(4)虛擬內(nèi)存和I/O地址映射技術(shù)。例如:34大多數(shù)的系統(tǒng)通過下面的方法之一可實(shí)現(xiàn)對復(fù)雜存儲系統(tǒng)的管理。(1)使用Cache,縮小處理器和存儲系統(tǒng)速度差別,從而提高系統(tǒng)的整體性能。(2)使用內(nèi)存映射技術(shù)實(shí)現(xiàn)虛擬空間到物理空間的映射。(3)引入存儲保護(hù)機(jī)制,增強(qiáng)系統(tǒng)的安全性。(4)引入一些機(jī)制保證將I/O操作映射成內(nèi)存操作后,各種I/O操作能夠得到正確的結(jié)果。大多數(shù)的系統(tǒng)通過下面的方法之一可實(shí)現(xiàn)對復(fù)雜存儲系統(tǒng)35(1)內(nèi)核級的寄存器。(2)芯片級的緊耦合存儲器TCM。(3)芯片級的片上Cache存儲器的容量在8~32KB之間,訪問時(shí)間大約為10ns。(4)板卡級的DRAM。(5)外設(shè)級的后援存儲器,通常是硬盤,可能從幾百M(fèi)B到幾個(gè)GB,訪問時(shí)間為幾十ms。(1)內(nèi)核級的寄存器。362.5.1協(xié)處理器(CP15)ARM處理器支持16個(gè)協(xié)處理器。CP15,即通常所說的系統(tǒng)控制協(xié)處理器(SystemControlCoprocesssor),它負(fù)責(zé)完成大部分的存儲系統(tǒng)管理。CP15包含16個(gè)32位寄存器,其編號為0~15。CP15中的寄存器可能是只讀的,也可能是只寫的,還有一些是可讀可寫的。2.5.1協(xié)處理器(CP15)ARM處理器支持372.5.2存儲管理單元(MMU)在創(chuàng)建多任務(wù)嵌入式系統(tǒng)時(shí),最好有一個(gè)簡單的方式來編寫、裝載及運(yùn)行各自獨(dú)立的任務(wù)。目前大多數(shù)的嵌入式系統(tǒng)不再使用自己定制的控制系統(tǒng),而使用操作系統(tǒng)來簡化這個(gè)過程。較高級的操作系統(tǒng)采用基于硬件的存儲管理單元(MMU)來實(shí)現(xiàn)上述操作。2.5.2存儲管理單元(MMU)在創(chuàng)建多任務(wù)嵌入38MMU提供的一個(gè)關(guān)鍵服務(wù)是使各個(gè)任務(wù)作為各自獨(dú)立的程序在其自己的私有存儲空間中運(yùn)行。在帶MMU的操作系統(tǒng)控制下,運(yùn)行的任務(wù)無須知道其他與之無關(guān)的任務(wù)的存儲需求情況,這就簡化了各個(gè)任務(wù)的設(shè)計(jì)。MMU提供的一個(gè)關(guān)鍵服務(wù)是使各個(gè)任務(wù)作為各自獨(dú)立的程39MMU提供了一些資源以允許使用虛擬存儲器(將系統(tǒng)物理存儲器重新編址,可將其看成一個(gè)獨(dú)立于系統(tǒng)物理存儲器的存儲空間)。MMU作為轉(zhuǎn)換器,將程序和數(shù)據(jù)的虛擬地址(編譯時(shí)的連接地址)轉(zhuǎn)換成實(shí)際的物理地址,即在物理主存中的地址。這個(gè)轉(zhuǎn)換過程允許運(yùn)行的多個(gè)程序使用相同的虛擬地址,而各自存儲在物理存儲器的不同位置。這樣存儲器就有兩種類型的地址:虛擬地址和物理地址。MMU提供了一些資源以允許使用虛擬存儲器(將系統(tǒng)物402.5.3高速緩沖存儲器(Cache)Cache是一個(gè)容量小但存取速度非??斓拇鎯ζ?,它保存最近用到的存儲器數(shù)據(jù)副本。Cache經(jīng)常與寫緩存器(writebuffer)一起使用。通過引入Cache和寫緩存區(qū),存儲系統(tǒng)的性能得到了很大的提高,但同時(shí)也帶來了一些問題。2.5.3高速緩沖存儲器(Cache)Cach412.6異常ARM體系結(jié)構(gòu)中,存在7種異常處理。當(dāng)異常發(fā)生時(shí),處理器會把PC設(shè)置為一個(gè)特定的存儲器地址。這一地址放在被稱為向量表(vectortable)的特定地址范圍內(nèi)。向量表的入口是一些跳轉(zhuǎn)指令,跳轉(zhuǎn)到專門處理某個(gè)異?;蛑袛嗟淖映绦?。2.6.1異常的種類2.6異常ARM體系結(jié)構(gòu)中,存在7種異常42表2-4 ARM的7種異常異常類型處理器模式執(zhí)行低地址執(zhí)行高地址復(fù)位異常(Reset)特權(quán)模式0x000000000xFFFF0000未定義指令異常(Undefinedinterrupt)未定義指令中止模式0x000000040xFFFF0004軟中斷異常(SoftwareAbort)特權(quán)模式0x000000080xFFFF0008預(yù)取異常(PrefetchAbort)數(shù)據(jù)訪問中止模式0x0000000C0xFFFF000C數(shù)據(jù)異常(DataAbort)數(shù)據(jù)訪問中止模式0x000000100xFFFF0010外部中斷請求(IRQ)外部中斷請求模式0x000000180xFFFF0018快速中斷請求(FIQ)快速中斷請求模式0x0000001C0xFFFF001C表2-4 ARM的7種異常異常類型處理器模式執(zhí)行低432.6.2異常的優(yōu)先級表2-5 異常優(yōu)先級優(yōu)先級異常最高1復(fù)位異常2數(shù)據(jù)中止3快速中斷請求4外部中斷請求5預(yù)取指令異常6軟中斷最低7未定義指令2.6.2異常的優(yōu)先級表2-5 異常優(yōu)先級優(yōu)先442.6.3構(gòu)建異常向量表當(dāng)處理器的復(fù)位引腳有效時(shí),系統(tǒng)產(chǎn)生復(fù)位異常中斷,程序跳轉(zhuǎn)到復(fù)位異常中斷處理程序處執(zhí)行。復(fù)位異常中斷通常用在下面兩種情況下:(1)系統(tǒng)上電;(2)系統(tǒng)復(fù)位。1.復(fù)位異常2.6.3構(gòu)建異常向量表當(dāng)處理器的復(fù)位引腳有效時(shí)45圖2-6異常處理向量表圖2-6異常處理向量表46當(dāng)ARM處理器執(zhí)行協(xié)處理器指令時(shí),它必須等待一個(gè)外部協(xié)處理器應(yīng)答后,才能真正執(zhí)行這條指令。若協(xié)處理器沒有響應(yīng),則發(fā)生未定義指令異常。2.未定義指令異常當(dāng)ARM處理器執(zhí)行協(xié)處理器指令時(shí),它必須等待一個(gè)外47軟中斷(SWI)異常發(fā)生時(shí),處理器進(jìn)入特權(quán)模式,執(zhí)行一些特權(quán)模式下的操作系統(tǒng)功能。3.軟中斷軟中斷(SWI)異常發(fā)生時(shí),處理器進(jìn)入特權(quán)模式,執(zhí)行48預(yù)取指令異常是由系統(tǒng)存儲器報(bào)告的。當(dāng)處理器試圖去取一條被標(biāo)記為預(yù)取無效的指令時(shí),發(fā)生預(yù)取指令異常。如果系統(tǒng)中不包含MMU時(shí),指令預(yù)取異常中斷處理程序只是簡單地報(bào)告錯(cuò)誤并退出。若包含MMU,引起異常的指令的物理地址被存儲到內(nèi)存中。4.預(yù)取指令異常預(yù)取指令異常是由系統(tǒng)存儲器報(bào)告的。當(dāng)處理器試圖去取49數(shù)據(jù)訪問中止異常是由存儲器發(fā)出數(shù)據(jù)中止信號,它由存儲器訪問指令Load/Store產(chǎn)生。當(dāng)數(shù)據(jù)訪問指令的目標(biāo)地址不存在或者該地址不允許當(dāng)前指令訪問時(shí),處理器產(chǎn)生數(shù)據(jù)訪問中止異常。5.?dāng)?shù)據(jù)訪問中止異常數(shù)據(jù)訪問中止異常是由存儲器發(fā)出數(shù)據(jù)中止信號,它由存儲50當(dāng)處理器的外部中斷請求(IRQ)引腳有效,而且CPSR寄存器的I控制位被清除時(shí),處理器產(chǎn)生外部中斷IRQ異常。系統(tǒng)中各外部設(shè)備通常通過該異常中斷請求處理器服務(wù)。6.外部中斷請求當(dāng)處理器的外部中斷請求(IRQ)引腳有效,而且CPS51當(dāng)處理器的快速中斷請求(FIQ)引腳有效且CPSR寄存器的F控制位被清除時(shí),處理器產(chǎn)生快速中斷請求FIQ異常。7.快速中斷請求當(dāng)處理器的快速中斷請求(FIQ)引腳有效且CPSR寄522.6.4異常響應(yīng)流程當(dāng)異常發(fā)生時(shí),處理器自動切換到ARM狀態(tài),所以在異常處理函數(shù)中要判斷在異常發(fā)生前處理器是ARM狀態(tài)還是Thumb狀態(tài)。這可以通過檢測SPSR的T位來判斷。1.判斷處理器狀態(tài)2.6.4異常響應(yīng)流程當(dāng)異常發(fā)生時(shí),處理器自動切53通常情況下,只有在SWI處理函數(shù)中才需要知道異常發(fā)生前處理器的狀態(tài)。所以在Thumb狀態(tài)下,調(diào)用SWI軟中斷異常必須注意以下兩點(diǎn)。(1)發(fā)生異常的指令地址為(lr?2),而不是(lr?4)。(2)Thumb狀態(tài)下的指令是16位的,在判斷中斷向量信號時(shí)使用半字加載指令LDRH。通常情況下,只有在SWI處理函數(shù)中才需要知道異常發(fā)生54前面介紹向量表時(shí)提到,每一個(gè)異常發(fā)生時(shí)總是從異常向量表開始跳轉(zhuǎn)。最簡單的一種情況是向量表里面的每一條指令直接跳向?qū)?yīng)的異常處理函數(shù)。其中快速中斷處理函數(shù)FIQ_handler()可以直接從地址0x1C處開始,省下一條跳轉(zhuǎn)指令,如圖2-7所示。(1)MOVPC,#imme_value(2)LDRPC,[PC+offset]2.向量表前面介紹向量表時(shí)提到,每一個(gè)異常發(fā)生時(shí)總是從異常向量55圖2-7異常處理向量表圖2-7異常處理向量表562.6.5從異常處理程序中返回當(dāng)一個(gè)異常處理返回時(shí),一共有3件事情需要處理:通用寄存器的恢復(fù)、狀態(tài)寄存器的恢復(fù)及PC指針的恢復(fù)。通用寄存器的恢復(fù)采用一般的堆棧操作指令即可,下面重點(diǎn)介紹狀態(tài)寄存器的恢復(fù)及PC指針的恢復(fù)。2.6.5從異常處理程序中返回當(dāng)一個(gè)異常處理返回57PC和CPSR的恢復(fù)可以通過一條指令來實(shí)現(xiàn),下面是3個(gè)例子。(1)MOVSPC,LR(2)SUBSPC,LR,#4(3)LDMFDSP!,{PC}^1.恢復(fù)被中斷程序的處理器狀態(tài)PC和CPSR的恢復(fù)可以通過一條指令來實(shí)現(xiàn),下面是358異常返回時(shí),另一個(gè)非常重要的問題就是返回地址的確定。2.異常的返回地址異常返回時(shí),另一個(gè)非常重要的問題就是返回地址的確定。59圖2-83級流水線示例圖2-83級流水線示例60(1)軟中斷異常(2)IRQ或FIQ異常(3)DataAbort數(shù)據(jù)中止異常(1)軟中斷異常61表2-6 異常和返回地址異常地址用途復(fù)位-復(fù)位沒有定義LR數(shù)據(jù)中止LR-8指向?qū)е聰?shù)據(jù)中止異常的指令FIQLR-4指向發(fā)生異常時(shí)正在執(zhí)行的指令I(lǐng)RQLR-4指向發(fā)生異常時(shí)正在執(zhí)行的指令預(yù)取指令中止LR-4指向?qū)е骂A(yù)取指令異常的那條指令SWILR執(zhí)行SWI指令的下一條指令未定義指令LR指向未定義指令的下一條指令表2-6 異常和返回地址異常地址用622.7ARM處理器的尋址方式ARM指令集可以分為跳轉(zhuǎn)指令、數(shù)據(jù)處理指令、程序狀態(tài)寄存器傳輸指令、Load/Store指令、協(xié)處理器指令和異常中斷產(chǎn)生指令。根據(jù)使用的指令類型不同,指令的尋址方式分為數(shù)據(jù)處理指令尋址方式和內(nèi)存訪問指令尋址方式。2.7ARM處理器的尋址方式ARM指令集可以分為632.7.1數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令的基本語法格式如下:<opcode>{<cond>}{S}<Rd>,<Rn>,<shifter_operand>其中,<shifter_operand>有11種形式,如表2-7所示。2.7.1數(shù)據(jù)處理指令尋址方式數(shù)據(jù)處理指令的基本64表2-7 <shifter_operand>的尋址方式語法尋址方式1#<immediate>立即數(shù)尋址2<Rm>寄存器尋址3<Rm>,LSL#<shift_imm>立即數(shù)邏輯左移4<Rm>,LSL<Rs>寄存器邏輯左移5<Rm>,LSR#<shift_imm>立即數(shù)邏輯右移6<Rm>,LSR<Rs>寄存器邏輯右移7<Rm>,ASR#<shift_imm>立即數(shù)算術(shù)右移8<Rm>,ASR<Rs>寄存器算術(shù)右移9<Rm>,ROR#<shift_imm>立即數(shù)循環(huán)右移10<Rm>,ROR<Rs>寄存器循環(huán)右移11<Rm>,RRX寄存器擴(kuò)展循環(huán)右移表2-7 <shifter_operand>的尋址方式語65數(shù)據(jù)處理指令尋址方式可以分為以下幾種。(1)立即數(shù)尋址方式;(2)寄存器尋址方式;(3)寄存器移位尋址方式。數(shù)據(jù)處理指令尋址方式可以分為以下幾種。66指令中的立即數(shù)是由一個(gè)8bit的常數(shù)移動4bit偶數(shù)位(0,2,4,…,26,28,30)得到的。所以,每一條指令都包含一個(gè)8bit的常數(shù)X和移位值Y,得到的立即數(shù)
=
X循環(huán)右移(2×Y)。1.立即數(shù)尋址方式指令中的立即數(shù)是由一個(gè)8bit的常數(shù)移動4bit偶數(shù)67寄存器的值可以被直接用于數(shù)據(jù)操作指令,這種尋址方式是各類處理器經(jīng)常采用的一種方式,也是一種執(zhí)行效率較高的尋址方式,2.寄存器尋址方式寄存器的值可以被直接用于數(shù)據(jù)操作指令,這種尋址方式是68寄存器的值在被送到ALU之前,可以事先經(jīng)過桶形移位寄存器的處理。預(yù)處理和移位發(fā)生在同一周期內(nèi),所以有效地使用移位寄存器,可以增加代碼的執(zhí)行效率。3.寄存器移位尋址方式寄存器的值在被送到ALU之前,可以事先經(jīng)過桶形移位寄692.7.2內(nèi)存訪問指令尋址方式內(nèi)存訪問指令的尋址方式可以分為以下幾種。(1)字及無符號字節(jié)的Load/Store指令的尋址方式;(2)雜類Load/Store指令的尋址方式;(3)批量Load/Store指令的尋址方式;(4)協(xié)處理器Load/Store指令的尋址方式。2.7.2內(nèi)存訪問指令尋址方式內(nèi)存訪問指令的尋址70字及無符號字節(jié)的Load/Store指令語法格式如下:LDR|STR{<cond>}{B}{T}<Rd>,<addressing_mode>1.字及無符號字節(jié)的Load/Store指令的尋址方式字及無符號字節(jié)的Load/Store指令語法格式如下71表2-8 字及無符合字節(jié)的Load/Store指令的尋址方式格式模式1[Rn,#±<offset_12>]立即數(shù)偏移尋址(Immediateoffset)2[Rn,±Rm]寄存器偏移尋址(Registeroffset)3[Rn,Rm,<shift>#<offset_12>]帶移位的寄存器偏移尋址(Scaledregisteroffset)4[Rn,#±<offset_12>]!立即數(shù)前索引尋址(Immediatepre-indexed)5[Rn,±Rm]!寄存器前索引尋址(Registerpost-indexed)6[Rn,Rm,<shift>#<offset_12>]!帶移位的寄存器前索引尋址(Scaledregisterpre-indexed)表2-8 字及無符合字節(jié)的Load/Store指令的尋址72格式模式7[Rn],#±<offset_12>立即數(shù)后索引尋址(Immediatepost-indeded)8[Rn],±<Rm>寄存器后索引尋址(Registerpost-indexed)9[Rn],±<Rm>,<shift>#<offset_12>帶移位的寄存器后索引尋址(Scaledregisterpost-indexed)格式模式7[Rn],#±<offset_173使用該類尋址方式的指令的語法格式如下:LDR|STR{<cond>}H|SH|SB|D<Rd>,<addressing_mode>2.雜類Load/Store指令的尋址方式使用該類尋址方式的指令的語法格式如下:2.雜類Loa74表2-9 雜類Load/Store指令的尋址方式格式模式1[Rn,#±<offset_8>]立即數(shù)偏移尋址(Immediateoffset)2[Rn,±Rm]寄存器偏移尋址(Registeroffset)3[Rn,#±<offset_8>]!立即數(shù)前索引尋址(Immediatepre-indexed)4[Rn,±Rm]!寄存器前索引尋址(Registerpost-indexed)5[Rn],#±<offset_8>立即數(shù)后索引尋址(Immediatepost-indeded)6[Rn],±<Rm>寄存器后索引尋址(Registerpost-indexed)表2-9 雜類Load/Store指令的尋址方式格75批量Load/Store指令將一片連續(xù)內(nèi)存單元的數(shù)據(jù)加載到通用寄存器組中或?qū)⒁唤M通用寄存器的數(shù)據(jù)存儲到內(nèi)存單元中。該類指令的語法格式如下:LDM|STM{<cond>}<addressing_mode><Rn>{!},<registers><^>3.批量Load/Store指令尋址方式批量Load/Store指令將一片連續(xù)內(nèi)存單元的數(shù)據(jù)76表2-10 批量Load/Store指令的尋址方式格式模式1IA(IncrementAfter)后遞增方式2IB(IncrementBefore)先遞增方式3DA(DecrementAfter)后遞減方式4DB(DecrementBefore)先遞減方式表2-10 批量Load/Store指令的尋址方式格77堆棧操作尋址方式和批量Load/Store指令尋址方式十分類似。但對于堆棧的操作,數(shù)據(jù)寫入內(nèi)存和從內(nèi)存中讀出要使用不同的尋址模式,因?yàn)檫M(jìn)棧操作(pop)和出棧操作(push)要在不同的方向上調(diào)整堆棧。4.堆棧操作尋址方式堆棧操作尋址方式和批量Load/Store指令尋址方78根據(jù)不同的尋址方式,將堆棧分為以下4種。(1)Full棧:堆棧指針指向棧頂元素(lastusedlocation)。(2)Empty棧:堆棧指針指向第一個(gè)可用元素(thefirstunusedlocation)。(3)遞減棧:堆棧向內(nèi)存地址減小的方向生長。(4)遞增棧:堆棧向內(nèi)存地址增加的方向生長。根據(jù)不同的尋址方式,將堆棧分為以下4種。79根據(jù)堆棧的不同種類,將其尋址方式分為以下4種。(1)滿遞減FD(FullDescending)。(2)空遞減ED(EmptyDescending)。(3)滿遞增FA(FullAscending)。(4)空遞增EA(EmptyAscending)。根據(jù)堆棧的不同種類,將其尋址方式分為以下4種。80表2-11 堆棧尋址方式和批量Load/Store指令尋址方式對應(yīng)關(guān)系批量數(shù)據(jù)尋址方式堆棧尋址方式L位P位U位LDMDALDMFA100LDMIALDMFD101LDMDBLDMEA110LDMIBLDMED111STMDASTMED000STMIASTMEA001STMDBSTMFD010STMIBSTMFA011表2-11 堆棧尋址方式和批量Load/Store指令尋址81協(xié)處理器Load/Store指令的語法格式如下:<opcode>{<cond>}{L}<coproc>,<CRd>,<addressing_mode>5.協(xié)處理器Load/Store尋址方式協(xié)處理器Load/Store指令的語法格式如下:5822.8ARM處理器的指令集數(shù)據(jù)操作指令是指對存放在寄存器中的數(shù)據(jù)進(jìn)行操作的指令。主要包括數(shù)據(jù)傳送指令、算術(shù)指令、邏輯指令、比較與測試指令及乘法指令。2.8.1數(shù)據(jù)操作指令2.8ARM處理器的指令集數(shù)據(jù)操作指令是指對存放83表2-12 數(shù)據(jù)處理指令列表助記符操作行為MOV數(shù)據(jù)傳送MVN數(shù)據(jù)取反傳送AND邏輯與Rd:=RnANDop2EOR邏輯異或Rd:=RnEORop2SUB減Rd:=Rn?op2RSB翻轉(zhuǎn)減Rd:=op2?RnADD加Rd:=Rn+op2ADC帶進(jìn)位的加Rd:=Rn+op2+CSBC帶進(jìn)位的減Rd:=Rn?op2+C?1RSC帶進(jìn)位的翻轉(zhuǎn)減Rd:=op2?Rn+C?1TST測試RnANDop2并更新標(biāo)志位TEQ測試相等RnEORop2并更新標(biāo)志位CMP比較Rn?op2并更新標(biāo)志位CMN負(fù)數(shù)比較Rn+op2并更新標(biāo)志位ORR邏輯或Rd:=RnORop2BIC位清0Rd:=RnANDNOT(op2)表2-12 數(shù)據(jù)處理指令列表助記符操作行84MOV指令是最簡單的ARM指令,執(zhí)行的結(jié)果就是把一個(gè)數(shù)N送到目標(biāo)寄存器Rd,其中N可以是寄存器,也可以是立即數(shù)。MOV指令多用于設(shè)置初始值或者在寄存器間傳送數(shù)據(jù)。MOV指令將移位碼(shifter_operand)表示的數(shù)據(jù)傳送到目的寄存器Rd,并根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。1.MOV指令MOV指令是最簡單的ARM指令,執(zhí)行的結(jié)果就是把一85(1)指令的語法格式MOV{<cond>}{S}<Rd>,<shifter_operand>(2)指令舉例(3)指令的使用(1)指令的語法格式86MVN是反相傳送(MoveNegative)指令。它將操作數(shù)的反碼傳送到目的寄存器。MVN指令多用于向寄存器傳送一個(gè)負(fù)數(shù)或生成位掩碼。MVN指令將shifter_operand表示的數(shù)據(jù)的反碼傳送到目的寄存器Rd。并根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。2.MVN指令MVN是反相傳送(MoveNegative)指令。87(1)指令的語法格式MVN{<cond>}{S}<Rd>,<shifter_operand>(2)指令舉例(3)指令的使用(1)指令的語法格式88AND指令將shifter_operand表示的數(shù)值與寄存器Rn的值按位(bitwise)做邏輯與操作,并將結(jié)果保存到目標(biāo)寄存器Rd中,同時(shí)根據(jù)操作的結(jié)果更新CPSR寄存器。(1)指令的語法格式 AND{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)指令舉例3.AND指令A(yù)ND指令將shifter_operand表示的數(shù)值89EOR(ExclusiveOR)指令將寄存器Rn中的值和shifter_operand的值執(zhí)行按位“異或”操作,并將執(zhí)行結(jié)果存儲到目的寄存器Rd中,同時(shí)根據(jù)指令的執(zhí)行結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位。(1)指令的語法格式EOR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)指令舉例4.EOR指令EOR(ExclusiveOR)指令將寄存器Rn90SUB(Subtract)指令從寄存器Rn中減去shifter_operand表示的數(shù)值,并將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。(1)指令的語法格式SUB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)SUB指令舉例5.SUB指令SUB(Subtract)指令從寄存器Rn中減去s91RSB(ReverseSubtract)指令從寄存器shifter_operand中減去Rn表示的數(shù)值,并將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。(1)指令的語法格式RSB{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)RSB指令舉例6.RSB指令RSB(ReverseSubtract)指令從寄存92ADD指令將寄存器shifter_operand的值加上Rn表示的數(shù)值,并將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。(1)指令的語法格式ADD{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ADD指令舉例7.ADD指令A(yù)DD指令將寄存器shifter_operand的值93ADC指令將寄存器shifter_operand的值加上Rn表示的數(shù)值,再加上CPSR中的C條件標(biāo)志位的值,將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。(1)指令的語法格式ADC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ADC指令舉例8.ADC指令A(yù)DC指令將寄存器shifter_operand的值94SBC(SubtractwithCarry)指令用于執(zhí)行操作數(shù)大于32位時(shí)的減法操作。該指令從寄存器Rn中減去shifter_operand表示的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼[NOT(Carryflag)],并將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。9.SBC指令SBC(SubtractwithCarry)指95RSC(ReverseSubtractwithCarry)指令用于從寄存器shifter_operand中減去Rn表示的數(shù)值,再減去寄存器CPSR中C條件標(biāo)志位的反碼[NOT(CarryFlag)],并將結(jié)果保存到目標(biāo)寄存器Rd中,并根據(jù)指令的執(zhí)行結(jié)果設(shè)置CPSR中相應(yīng)的標(biāo)志位。(1)指令的語法格式RSC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)RSC指令舉例10.RSC指令RSC(ReverseSubtractwith96TST(Test)測試指令用于將一個(gè)寄存器的值和一個(gè)算術(shù)值進(jìn)行比較。條件標(biāo)志位根據(jù)兩個(gè)操作數(shù)做“邏輯與”后的結(jié)果設(shè)置。(1)指令的語法格式TST{<cond>}<Rn>,<shifter_operand>(2)TST指令舉例11.TST測試指令TST(Test)測試指令用于將一個(gè)寄存器的值和一97TEQ(TestEquivalence)指令用于將一個(gè)寄存器的值和一個(gè)算術(shù)值做比較。條件標(biāo)志位根據(jù)兩個(gè)操作數(shù)做“邏輯或”后的結(jié)果設(shè)置。以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。(1)指令的語法格式TEQ{<cond>}<Rn>,<shifter_operand>(2)TEQ指令舉例12.TEQ指令TEQ(TestEquivalence)指令用于將98CMP(Compare)指令使用寄存器Rn的值減去operand2的值,根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。(1)指令的語法格式CMP{<cond>}<Rn>,<shifter_operand>(2)CMP指令舉例13.CMP指令CMP(Compare)指令使用寄存器Rn的值減去o99CMN(CompareNegative)指令使用寄存器Rn的值減去operand2的負(fù)數(shù)值(加上operand2),根據(jù)操作的結(jié)果更新CPSR中相應(yīng)的條件標(biāo)志位,以便后面的指令根據(jù)相應(yīng)的條件標(biāo)志來判斷是否執(zhí)行。(1)指令的語法格式CMN{<cond>}<Rn>,<shifter_operand>(2)CMN指令舉例14.CMN指令CMN(CompareNegative)指令使用100ORR(LogicalOR)為邏輯或操作指令,它將第2個(gè)源操作數(shù)shifter_operand的值與寄存器Rn的值按位做“邏輯或”操作,結(jié)果保存到Rd中。(1)指令的語法格式ORR{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)ORR指令舉例15.ORR指令ORR(LogicalOR)為邏輯或操作指令,它將101BIC(BitClear)位清零指令,將寄存器Rn的值與第2個(gè)源操作數(shù)shifter_operand的值的反碼按位做“邏輯與”操作,結(jié)果保存到Rd中。(1)指令的語法格式BIC{<cond>}{S}<Rd>,<Rn>,<shifter_operand>(2)BIC指令舉例16.BIC位清零指令BIC(BitClear)位清零指令,將寄存器Rn102ARM乘法指令完成兩個(gè)數(shù)據(jù)的乘法。兩個(gè)32位二進(jìn)制數(shù)相乘的結(jié)果是64位的積。在有些ARM的處理器版本中,將乘積的結(jié)果保存到兩個(gè)獨(dú)立的寄存器中。另外一些版本只將最低有效32位存放到一個(gè)寄存器中。2.8.2乘法指令A(yù)RM乘法指令完成兩個(gè)數(shù)據(jù)的乘法。兩個(gè)32位二進(jìn)制數(shù)103表2-13 各種形式乘法指令的功能操作碼[23∶21]助記符意義操作000MUL乘(保留32位結(jié)果)Rd:=(Rm×Rs)[31∶0]001MLA乘—累加(32位結(jié)果)Rd:=(Rm×Rs+Rn)[31∶0]100UMULL無符號數(shù)長乘RdHi:RdLo:=Rm×Rs101UMLAL無符號長乘—累加RdHi:RdLo:+=Rm×Rs110SMULL有符號數(shù)長乘RdHi:RdLo:=Rm×Rs111SMLAL有符號數(shù)長乘—累加RdHi:RdLo:+=Rm×Rs表2-13 各種形式乘法指令的功能操作碼[23∶21]助記104MUL(Multiply)32位乘法指令將Rm和Rs中的值相乘,結(jié)果的最低32位保存到Rd中。(1)指令的語法格式MUL{<cond>}{S}<Rd>,<Rm>,<Rs>(2)指令舉例1.MUL指令MUL(Multiply)32位乘法指令將Rm和Rs105MLA(MultiplyAccumulate)32位乘—累加指令將Rm和Rs中的值相乘,再將乘積加上第3個(gè)操作數(shù),結(jié)果的最低32位保存到Rd中。(1)指令的語法格式MLA{<cond>}{S}<Rd>,<Rm>,<Rs>,<Rn>(2)指令舉例2.MLA乘—累加指令MLA(MultiplyAccumulate)32106UMULL(UnsignedMultiplyLong)為64位無符號乘法指令。它將Rm和Rs中的值做無符號數(shù)相乘,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的語法格式UMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令舉例3.UMULL指令UMULL(UnsignedMultiplyLo107UMLAL(UnsignedMultiplyAccumulateLong)為64位無符號長乘—累加指令。指令將Rm和Rs中的值做無符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的語法格式UMALL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令舉例4.UMLAL指令UMLAL(UnsignedMultiplyAc108SMULL(SignedMultiplyLong)為64位有符號長乘法指令。指令將Rm和Rs中的值做有符號數(shù)相乘,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的語法格式SMULL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令舉例5.SMULL指令SMULL(SignedMultiplyLong109SMLAL(SignedMultiplyAccumulateLong)為64位有符號長乘—累加指令。指令將Rm和Rs中的值做有符號數(shù)相乘,64位乘積與RdHi、RdLo相加,結(jié)果的低32位保存到RsLo中,高32位保存到RdHi中。(1)指令的語法格式SMLAL{<cond>}{S}<RdLo>,<RdHi>,<Rm>,<Rs>(2)指令舉例6.SMLAL指令SMLAL(SignedMultiplyAccu110Load/Store內(nèi)存訪問指令在ARM寄存器和存儲器之間傳送數(shù)據(jù)。ARM指令中有3種基本的數(shù)據(jù)傳送指令。2.8.3Load/Store指令Load/Store內(nèi)存訪問指令在ARM寄存器和存儲111這些指令在ARM寄存器和存儲器之間提供更靈活的單數(shù)據(jù)項(xiàng)傳送方式。數(shù)據(jù)項(xiàng)可以是字節(jié)、16位半字或32位字。1.單寄存器Load/Store指令(SingleRegister)這些指令在ARM寄存器和存儲器之間提供更靈活的單數(shù)據(jù)112這些指令的靈活性比單寄存器傳送指令差,但可以使大量的數(shù)據(jù)更有效地傳送。它們用于進(jìn)程的進(jìn)入和退出、保存和恢復(fù)工作寄存器以及復(fù)制存儲器中的一塊數(shù)據(jù)。2.多寄存器Load/Store內(nèi)存訪問指令這些指令的靈活性比單寄存器傳送指令差,但可以使大量的113這些指令允許寄存器和存儲器中的數(shù)值進(jìn)行交換,在一條指令中有效地完成Load/Store操作。它們在用戶級編程中很少用到。它的主要用途是在多處理器系統(tǒng)中實(shí)現(xiàn)信號量(Semaphores)的操作,以保證不會同時(shí)訪問公用的數(shù)據(jù)結(jié)構(gòu)。3.單寄存器交換指令(SingleRegisterSwap)這些指令允許寄存器和存儲器中的數(shù)值進(jìn)行交換,在一條指1142.8.3.1單寄存器的Load/Store指令表2-14 單寄存器Load/Store指令指令作用操作LDR把一個(gè)字裝入一個(gè)寄存器Rd←mem32[address]STR將存儲器中的字保存到寄存器Rd→mem32[address]LDRB把一個(gè)字節(jié)裝入一個(gè)寄存器Rd←mem8[address]STRB將寄存器中的低8位字節(jié)保存到存儲器Rd→mem8[address]LDRH把一個(gè)半字裝入一個(gè)寄存器Rd←mem16[address]STRH將寄存器中的低16位半字保存到存儲器Rd→mem16[address]LDRBT用戶模式下將一個(gè)字節(jié)裝入寄存器Rd←mem8[address]underusermodeSTRBT用戶模式下將寄存器中的低8位字節(jié)保存到存儲器Rd→mem8[address]underusermodeLDRT用戶模式下把一個(gè)字裝入一個(gè)寄存器Rd←mem32[address]underusermodeSTRT用戶模式下將存儲器中的字保存到寄存器Rd→mem32[address]]underusermodeLDRSB把一個(gè)有符號字節(jié)裝入一個(gè)寄存器Rd←sign{mem8[address]}LDRSH把一個(gè)有符號半字裝入一個(gè)寄存器Rd←sign{mem16[address]}2.8.3.1單寄存器的Load/Store指令表2-1115LDR指令用于從內(nèi)存中將一個(gè)32位的字讀取到目標(biāo)寄存器。(1)指令的語法格式LDR{<cond>}<Rd>,<addr_mode>(2)指令舉例1.LDR指令LDR指令用于從內(nèi)存中將一個(gè)32位的字讀取到目標(biāo)寄存116STR指令用于將一個(gè)32位的字?jǐn)?shù)據(jù)寫入到指令中指定的內(nèi)存單元。(1)指令的語法格式STR{<cond>}<Rd>,<addr_mode>(2)指令舉例2.STR指令STR指令用于將一個(gè)32位的字?jǐn)?shù)據(jù)寫入到指令中指定的117LDRB指令根據(jù)addr_mode所確定的地址模式將一個(gè)8位字節(jié)讀取到指令中的目標(biāo)寄存器Rd。指令的語法格式:LDR{<cond>}B<Rd>,<addr_mode>3.LDRB指令LDRB指令根據(jù)addr_mode所確定的地址模式118STRB指令從寄存器中取出指定的8位字節(jié)放入寄存器的低8位,并將寄存器的高位補(bǔ)0。指令的語法格式:STR{<cond>}B<Rd>,<addr_mode>4.STRB指令STRB指令從寄存器中取出指定的8位字節(jié)放入寄存器119LDRH指令用于從內(nèi)存中將一個(gè)16位的半字讀取到目標(biāo)寄存器。如果指令的內(nèi)存地址不是半字節(jié)對齊的,指令的執(zhí)行結(jié)果不可預(yù)知。指令的語法格式:LDR{<cond>}H<Rd>,<addr_mode>5.LDRH指令LDRH指令用于從內(nèi)存中將一個(gè)16位的半字讀取到目120STRH指令從寄存器中取出指定的16位半字放入寄存器的低16位,并將寄存器的高位補(bǔ)0。指令的語法格式:STR{<cond>}H<Rd>,<addr_mode>6.STRH指令STRH指令從寄存器中取出指定的16位半字放入寄存1212.8.3.2多寄存器的Load/Store內(nèi)存訪問指令表2-15 多寄存器的Load/Store內(nèi)存訪問指令指令作用操作LDM裝載多個(gè)寄存器{Rd}*N←mem32[startaddress+4*N]STM保存多個(gè)寄存器{Rd}*N→mem32[startaddress+4*N]2.8.3.2多寄存器的Load/Store內(nèi)存訪問指令122LDM指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的寄存器列表中的各寄存器中。當(dāng)PC包含在LDM指令的寄存器列表中時(shí),指令從內(nèi)存中讀取的字?jǐn)?shù)據(jù)將被作為目標(biāo)地址值,指令執(zhí)行后程序?qū)哪繕?biāo)地址處開始執(zhí)行,從而實(shí)現(xiàn)了指令的跳轉(zhuǎn)。指令的語法格式:LDM{<cond>}<addressing_mode><Rn>{!},<registers>1.LDM指令LDM指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的123LDM指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的寄存器列表中的各寄存器中。指令的語法格式:LDM{<cond>}<addressing_mode><Rn>,<registers_without_pc>??LDM指令將數(shù)據(jù)從連續(xù)的內(nèi)存單元中讀取到指令中指定的124STM指令將指令中寄存器列表中的各寄存器數(shù)值寫入到連續(xù)的內(nèi)存單元中。主要用于塊數(shù)據(jù)的寫入、數(shù)據(jù)棧操作及進(jìn)入子程序時(shí)保存相關(guān)寄存器的操作。指令的語法格式:STM{<cond>}<addressing_mode><Rn>{!},<registers>2.STM指令STM指令將指令中寄存器列表中的各寄存器數(shù)值寫入到連125STM指令將指令中寄存器列表中的各寄存器數(shù)值寫入到連續(xù)的內(nèi)存單元中。主要用于塊數(shù)據(jù)的寫入、數(shù)據(jù)棧操作及進(jìn)入子程序時(shí)保存相關(guān)寄存器等操作。指令的語法格式:STM{<cond>}<addressing_mode><Rn>,<registers>?STM指令將指令中寄存器列表中的各寄存器數(shù)值寫入到126LDM/STM批量加載/存儲指令可以實(shí)現(xiàn)在一組寄存器和一塊連續(xù)的內(nèi)存單元之間傳輸數(shù)據(jù)。LDM為加載多個(gè)寄存器,STM為存儲多個(gè)寄存器。允許一條指令傳送16個(gè)寄存器的任何子集或所有寄存器。指令格式如下:LDM{cond}<模式>Rn{!},regist{?}STM{cond}<模式>Rn{!},regist{?}2.8.3.3數(shù)據(jù)傳送指令應(yīng)用LDM/STM批量加載/存儲指令可以實(shí)現(xiàn)在一組寄存器127表2-16 多寄存器的Load/Store內(nèi)存訪問指令映射向上生長向下生長滿空滿空增加之前STMIBLDMIBSTMFALDMED之后STMIALDMIASTMEALDMFD增加之前LDMDBSTMDBLDMEASTMFD之后LDMDASTMDALDMFASTMED表2-16 多寄存器的Load/Store內(nèi)存訪問指令映128交換指令是Load/Store指令的一種特例,它把一個(gè)寄存器單元的內(nèi)容與寄存器內(nèi)容交換。交換指令是一個(gè)原子操作(AtomicOperation),也就是說,在連續(xù)的總線操作中讀/寫一個(gè)存儲單元,在操作期間阻止其他任何指令對該存儲單元的讀/寫。交換指令如表2-17所示。2.8.4單數(shù)據(jù)交換指令交換指令是Load/Store指令的一種特例,它把一129表2-17 交換指令SWP指令作用操作SWP字交換tmp=men32[Rn]mem32[Rn]=RmRd=tmpSWPB字節(jié)交換tmp=men8[Rn]mem8[Rn]=RmRd=tmp表2-17 交換指令SWP指令作用操130SWP指令用于將內(nèi)存中的一個(gè)字單元和一個(gè)指定寄存器的值相交換。指令的語法格式:SWP{<cond>}<Rd>,<Rm>,[<Rn>]1.SWP字交換指令SWP指令用于將內(nèi)存中的一個(gè)字單元和一個(gè)指定寄存器的131SWPB指令用于將內(nèi)存中的一個(gè)字節(jié)單元和一個(gè)指定寄存器的低8位值相交換,指令的語法格式:SWP{<cond>}B<Rd>,<Rm>,[<Rn>]2.SWPB字節(jié)交換指令SWPB指令用于將內(nèi)存中的一個(gè)字節(jié)單元和一個(gè)指定寄存132SWP指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器Rn中)的內(nèi)容讀取到一個(gè)寄存器Rd中,同時(shí)將另一個(gè)寄存器Rm的內(nèi)容寫到該內(nèi)存單元中,使用SWP可實(shí)現(xiàn)信號量操作。指令的語法格式:SWP{cond}BRd,Rm,[Rn]3.交換指令SWP應(yīng)用SWP指令用于將一個(gè)內(nèi)存單元(該單元地址放在寄存器R133跳轉(zhuǎn)(B)和跳轉(zhuǎn)連接(BL)指令是改變指令執(zhí)行順序的標(biāo)準(zhǔn)方式。2.8.5跳轉(zhuǎn)指令跳轉(zhuǎn)(B)和跳轉(zhuǎn)連接(BL)指令是改變指令執(zhí)行順序的134表2-18 ARMv5架構(gòu)跳轉(zhuǎn)指令助記符說明操作B跳轉(zhuǎn)指令pc←labelBL帶返回的連接跳轉(zhuǎn)pc←label(lr←BL后面的第一條指令)BX跳轉(zhuǎn)并切換狀態(tài)pc←Rm&0xfffffffe,T←Rm&1BLX帶返回的跳轉(zhuǎn)并切換狀態(tài)pc←lable,T←1pc←Rm&0xfffffffe,T←Rm&1lr←BL后面的第一條指令表2-18 ARMv5架構(gòu)跳轉(zhuǎn)指令助記符說明操135(1)指令的語法格式B{L}{<cond>}<target_address>(2)程序舉例1.跳轉(zhuǎn)指令B及帶連接的跳轉(zhuǎn)指令BL(1)指令的語法格式1.跳轉(zhuǎn)指令B及帶連接的跳轉(zhuǎn)指令BL136帶狀態(tài)切換的跳轉(zhuǎn)指令(BX)使程序跳轉(zhuǎn)到指令中指定的參數(shù)Rm指定的地址執(zhí)行程序,Rm的第0位復(fù)制到CPSR中T位,bit[31∶1]移入PC。若Rm的bit[0]為1,則跳轉(zhuǎn)時(shí)自動將CPSR中的標(biāo)志位T置位,即把目標(biāo)地址的代碼解釋為Thumb代碼;若Rm的位bit[0]為0,則跳轉(zhuǎn)時(shí)自動將CPSR中的標(biāo)志位T復(fù)位,即把目標(biāo)地址代碼解釋為ARM代碼。2.BX帶狀態(tài)切換的跳轉(zhuǎn)指令BX帶狀態(tài)切換的跳轉(zhuǎn)指令(BX)使程序跳轉(zhuǎn)到指令中指定的137(1)指令的語法格式BX{<cond>}<Rm>(2)指令舉例(1)指令的語法格式138帶連接和狀態(tài)切換的跳轉(zhuǎn)指令(BranchwithLinkExchange,BLX)使用標(biāo)號,用于使程序跳轉(zhuǎn)到Thumb狀態(tài)或從Thumb狀態(tài)返回。(1)語法格式BLX<target_add>(2)指令的使用3.BLX帶狀態(tài)切換的連接跳轉(zhuǎn)指令BLX帶連接和狀態(tài)切換的跳轉(zhuǎn)指令(Branchwith139ARM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器(ProgramStateRegister,PSR)。2.8.6狀態(tài)操作指令A(yù)RM指令集提供了兩條指令,可直接控制程序狀態(tài)寄存器140表2-19 程序狀態(tài)寄存器指令指令作用操作MRS把程序狀態(tài)寄存器的值送到一個(gè)通用寄存器Rd=SPRMSR把通用寄存器的值送到程序狀態(tài)寄存器或把一個(gè)立即數(shù)送到程序狀態(tài)字PSR[field]=Rm或PSR[field]=immediate表2-19 程序狀態(tài)寄存器指令指令作用操作141MRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器中。在ARM處理器中,只有MRS指令可以將狀態(tài)寄存器CPSR或SPSR讀出到通用寄存器中。(1)指令的語法格式MRS{cond}Rd,PSR(2)指令舉例1.MRSMRS指令用于將程序狀態(tài)寄存器的內(nèi)容傳送到通用寄存器142在ARM處理器中,只有MSR指令可以直接設(shè)置狀態(tài)寄存器CPSR或SPSR。(1)指令的語法格式MSR{cond}PSR_field,#immed_8rMSR{cond}PSR_field,Rm(2)指令舉例2.MSR在ARM處理器中,只有MSR指令可以直接設(shè)置狀態(tài)寄存143【例2-5】使能IRQ中斷?!纠?-6】禁止IRQ中斷?!纠?-7】堆棧指令初始化。3.程序狀態(tài)寄存器指令的應(yīng)用【例2-5】使能IRQ中斷。3.程序狀態(tài)寄存器指令的應(yīng)用144ARM體系結(jié)構(gòu)允許通過增加協(xié)處理器來擴(kuò)展指令集。ARM協(xié)處理器指令可分為以下3類。(1)協(xié)處理器數(shù)據(jù)操作。(2)協(xié)處理器數(shù)據(jù)傳送指令。(3)協(xié)處理器寄存器傳送指令。2.8.7協(xié)處理器指令A(yù)RM體系結(jié)構(gòu)允許通過增加協(xié)處理器來擴(kuò)展指令集。2.145表2-20 協(xié)處理器指令助記符操作CDP協(xié)處理器數(shù)據(jù)操作LDC裝載協(xié)處理器寄存器MCR從ARM寄存器傳數(shù)據(jù)到協(xié)處理器寄存器MRC從協(xié)處理器寄存器傳送數(shù)據(jù)到ARM寄存器STC存儲協(xié)處理器寄存器表2-20 協(xié)處理器指令助記符操作CDP146ARM指令集中提供了兩條產(chǎn)生異常的指令,通過這兩條指令可以用軟件的方法實(shí)現(xiàn)異常。2.8.8異常產(chǎn)生指令A(yù)RM指令集中提供了兩條產(chǎn)生異常的指令,通過這兩條指147表2-21 ARM異常產(chǎn)生指令助記符含義操作SWI軟中斷指令產(chǎn)生軟中斷,處理器進(jìn)入管理模式BKPT斷點(diǎn)中斷指令處理器產(chǎn)生軟件斷點(diǎn)表2-21 ARM異常產(chǎn)生指令助記符含義148軟件中斷指令(SoftwareInterrupt,SWI)用于產(chǎn)生軟中斷,從而實(shí)現(xiàn)從用戶模式變換到管理模式,CPSR保存到管理模式的SPSR中,執(zhí)行轉(zhuǎn)移到SWI向量,在其他模式下也可以使用SWI指令,處理器同樣切換到管理模式。1.軟件中斷指令軟件中斷指令(SoftwareInterrupt,149(1)指令的語法格式SWI{<cond>}<imm
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024湖南懷化市新晃侗族自治縣招聘國有企業(yè)工作人員擬聘用人員筆試參考題庫附帶答案詳解
- 2023-2024學(xué)年人教版高中信息技術(shù)必修一第三章第四節(jié)《數(shù)據(jù)分析報(bào)告與應(yīng)用》教學(xué)設(shè)計(jì)
- 2024年浙江嵊州市水務(wù)投資發(fā)展集團(tuán)有限公司員工招聘25人筆試參考題庫附帶答案詳解
- 2024年度長江產(chǎn)投公司招聘4人筆試參考題庫附帶答案詳解
- 2024年宿州泗縣縣屬國有企業(yè)公開招聘工作人員33人筆試參考題庫附帶答案詳解
- 2025年河南測繪職業(yè)學(xué)院單招職業(yè)技能測試題庫一套
- 2024年中廣核環(huán)保產(chǎn)業(yè)有限公司招聘7人筆試參考題庫附帶答案詳解
- 2024-2025學(xué)年初升高銜接英語句子成分 教學(xué)設(shè)計(jì)
- 2024年中國中醫(yī)藥出版社招聘筆試參考題庫附帶答案詳解
- 《記念劉和珍君》《為了忘卻的記念》聯(lián)讀教學(xué)設(shè)計(jì)
- 兒童福利機(jī)構(gòu)安全管理規(guī)范
- 人工智能技術(shù)應(yīng)用專業(yè)調(diào)研報(bào)告
- 鞋類制造過程的節(jié)能與減排
- 第1課 おじぎ 課件高中日語人教版第一冊-1
- 08SG510-1 輕型屋面平行弦屋架(圓鋼管、方鋼管)
- 事前績效評估具體工作實(shí)施方案
- 六年級下冊語文第一單元測試卷 部編版(含答案)
- 2024年湖南高速鐵路職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫新版
- 《研學(xué)旅行市場營銷》課件-研學(xué)旅行市場營銷之社群營銷
- 醫(yī)美機(jī)構(gòu)客戶滿意度調(diào)查表
- clsim100-32藥敏試驗(yàn)標(biāo)準(zhǔn)2023中文版
評論
0/150
提交評論