




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