ARM體系結構研討課件_第1頁
ARM體系結構研討課件_第2頁
ARM體系結構研討課件_第3頁
ARM體系結構研討課件_第4頁
ARM體系結構研討課件_第5頁
已閱讀5頁,還剩309頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

本資料來源本資料來源1第二講體系結構第二講體系結構2從體系結構而言51單片機屬于哈弗結構,采用cisc復雜指令集系統Arm一般為哈弗結構(ARM7采用馮?諾依曼結構),采用risc精簡指令集系統體系結構:從用戶角度看到的計算機屬性,計算機的指令集、可見寄存器、存儲器管理單元和異常處理模式都是體系結構的一部分。從體系結構而言體系結構:3ARM體系結構ARM處理器工作狀態

ARM處理器工作模式

ARM寄存器組成

ARM的異常中斷

ARM體系結構ARM處理器工作狀態4ARM7處理器工作狀態自從ARM7TDMI核以后,體系結構中具有T變種的ARM處理器核可以工作在以下兩種狀態:ARM狀態

32位,ARM狀態下執行字對準的32位ARM指令;Thumb狀態

16位,Thumb狀態下執行半字對準的16位Thumb指令。在Thumb狀態下,程序計數器PC使用位1選擇另一個半字。

ARM7處理器工作狀態自從ARM7TDMI核以后,體系結構中5Thumb產生的原因ARM為32位機,適于處理高速大數據量因此高端消費類產品需要較大成本矛盾32位指令需要更大的存儲空間,對應更高的成本為了解決代碼長度的問題,ARM體系結構又增加了T變種,開發了一種新的指令體系,這就是Thumb指令集。Thumb產生的原因ARM為32位機,適于處理高速大數據量6Thumb指令集Thumb是ARM體系結構的擴展。它有從標準32位ARM指令集抽出來的36條指令格式,可以重新編成16位的操作碼這能帶來很高的代碼密度,因為Thumb指令的寬度只有ARM指令寬度的一半在運行時,這些16位的Thumb指令又由處理器解壓成32位的ARM指令。Thumb指令集Thumb是ARM體系結構的擴展。它有從標準7Thumb指令集Thumb指令集是通常使用的32位ARM指令集的子集。每條Thumb指令是16位長,有相應的對于處理器模型有相同效果的32位ARM指令。Thumb指令在標準的ARM寄存器配置下進行操作,在ARM和Thumb狀態之間具有出色的互操作性。執行時,16位Thumb指令透明地實時解壓縮成32位ARM指令,且沒有性能損失。Thumb具有32位核的所有優點:32位尋址空間;32位寄存器;32位移位器和算術邏輯單元ALU(ArithmeticLogicUnit);32位存儲器傳送。Thumb指令集Thumb指令集是通常使用的32位ARM指令8Thumb的技術實現ARM7TDMI考慮流水線各級間的平衡,利用譯碼階段的一個未用的時鐘相位,將Thumb指令解壓還原為32位相應的ARM指令來完成對Thumb指令的解壓縮。這些16位的Thumb指令可以由處理器在譯碼級解壓成32位的ARM指令,在ARM核里運行。這樣,不需要再附加時間費用和單獨的解碼周期,就可以維持指令的執行。Thumb的技術實現ARM7TDMI考慮流水線各級間的平衡,9Thumb的技術實現ARM7TDMI中ARM7和ARM7T取指令、解壓縮與執行的過程。Thumb的技術實現ARM7TDMI中ARM7和ARM7T取10Thumb的技術實現Thumb指令的解壓縮和解碼過程:從流水的取指令階段得到的ARM指令,經過ARM譯碼,并且激活主副操作碼控制信號。其中,主操作碼描述了要執行指令的類型,副操作碼說明了指令的細節,諸如存儲器、操作數等。在Thumb狀態,多路復用器指導指令經過Thumb解壓縮邏輯,轉換為相應的ARM指令,然后執行。Thumb的技術實現Thumb指令的解壓縮和解碼過程:11ARM體系結構研討課件12ARM體系結構研討課件13Thumb技術的特點獨立的兩套指令集也使得解碼邏輯極其的簡單,從而維持了較小的硅片面積,保證了領先的“低功耗、高性能、小體積”的技術要求,滿足了對嵌入式系統的設計需求。

Thumb技術的特點獨立的兩套指令集也使得解碼邏輯極其的簡單14ARM與THUMBTHUMB指令是ARM指令的子集可以相互調用,只要遵循一定的調用規則Thumb指令與ARM指令的時間效率和空間效率關系為:存儲空間約為ARM代碼的60%~70%指令數比ARM代碼多約30%~40%存儲器為32位時ARM代碼比Thumb代碼快約40%存儲器為16位時Thumb比ARM代碼快約40~50%使用Thumb代碼,存儲器的功耗會降低約30%ARM與THUMBTHUMB指令是ARM指令的子集可以相互調15ARM7處理器工作狀態進入Thumb狀態:當操作數寄存器Rm的狀態位bit[0]為1時,執行BXRm指令進入Thumb狀態所有的異常都是再ARM狀態下進行,如果處理器在Thumb狀態進入異常,則當異常處理(IRQ,FIQ,Undef,Abort和SWI)返回時,自動切換到Thumb狀態。

ARM7處理器工作狀態進入Thumb狀態:16ARM7處理器工作狀態進入ARM狀態:當操作數寄存器Rm的狀態位bit[0]為0時,執行BXRm指令進入ARM狀態。如果處理器進行異常處理(IRQ,FIQ,Undef,Abort和SWI),在此情況下,把PC放入異常模式鏈接寄存器LR中,從異常向量地址開始執行也可以進入ARM狀態。ARM7處理器工作狀態進入ARM狀態:17處理器狀態使用BX指令將ARM7TDMI內核的操作狀態在ARM狀態和Thumb狀態之間進行切換(程序如下所示。;從Arm狀態切換到Thumb狀態

LDRR0,=Lable+1BXR0;從Thumb狀態切換到ARM狀態

LDRR0,=LableBXR0地址最低位為1,表示切換到Thumb狀態地址最低位為0,表示切換到ARM狀態跳轉地址標號ARM7處理器工作狀態處理器狀態使用BX指令將ARM7TDMI內核18ARM7處理器工作狀態在程序執行的過程中,處理器可以在兩種狀態下切換。需要強調的是:ARM和Thumb之間狀態的切換不影響處理器的模式或寄存器的內容。ARM指令集和Thumb指令集都有相應的狀態切換命令。ARM處理器在開始執行代碼時,只能處于ARM狀態。ARM7處理器工作狀態在程序執行的過程中,處理器可以在兩種狀19兩種工作狀態存在的問題ARM狀態,指令均是32位的,性能高。Thumb狀態下,指令均是16位的,代碼密度提高了一倍。Thumb狀態下的指令功能只是ARM下的一個子集,結果可能需要更多條的指令去完成相同的工作,導致處理性能下降。兩種工作狀態存在的問題ARM狀態,指令均是32位的,性能20一般的解決方法混合編程:arm與thumb結合。不足:兩個方面1:時間額外開銷2,ARM代碼和Thumb代碼需要以不同的方式編譯,這也增加了軟件開發管理的復雜度。一般的解決方法混合編程:arm與thumb結合。21Cortexm3的解決方法采用thumb-2指令集,混合32/16位指令,不支持arm狀態,只支持thumb狀態減小了狀態切換的額外開銷,節省了

執行時間和指令空間。不再需要把源代碼文件分成按ARM編譯的和按Thumb編譯的,軟件開發的管理大大減負。無需再反復地求證和測試:究竟該在何時何地切換到何種狀態下,我的程序才最有效率。開發軟件容易多了Cortexm3的解決方法采用thumb-2指令集,混合322ARM技術基礎ARM處理器工作狀態

ARM處理器工作模式

ARM寄存器組成ARM的異常中斷

ARM技術基礎ARM處理器工作狀態23ARM處理器工作模式ARM7處理器共支持所列的7種處理器模式見下表表中給出了CPSR[4:0]與七種工作模式的關系以及各種模式的解釋。ARM處理器工作模式ARM7處理器共支持所列的7種處理器模24CPSR[4:0]模式用途可訪問的寄存器10000用戶正常用戶模式,程序正常執行模式PC,R14~R0,CPSR10001FIQ處理快速中斷,支持高速數據傳送或通道處理PC,R14_fiq~R8_fiq,R7~R0,CPSR,SPSR_fiq10010IRQ處理普通中斷PC,R14_irq~R13_fiq,R12~R0,CPSR,SPSR_irq10011SVC操作系統保護模式處理軟件中斷(SWI)PC,R14_svc~R13_svc,R12~R0,CPSR,SPSR_svc10111中止處理存儲器故障、實現虛擬存儲器和存儲器保護PC,R14_abt~R13_abt,R12~R0,CPSR,SPSR_abt11011未定義處理未定義的指令陷阱,支持硬件協處理器的軟件仿真PC,R14_und~R13_und,R12~R0,CPSR,SPSR_und11111系統運行特權操作系統任務PC,R14~R0,CPSRCPSR[4:0]模式用途可訪問的寄存器10000用戶正常用25處理器模式說明備注用戶(usr)正常程序工作模式不能直接切換到其它模式系統(sys)用于支持操作系統的特權任務等與用戶模式類似,但具有可以直接切換到其它模式等特權快中斷(fiq)支持高速數據傳輸及通道處理FIQ異常響應時進入此模式中斷(irq)用于通用中斷處理IRQ異常響應時進入此模式管理(svc)操作系統保護代碼系統復位和軟件中斷響應時進入此模式中止(abt)用于支持虛擬內存和/或存儲器保護在ARM7TDMI沒有大用處未定義(und)支持硬件協處理器的軟件仿真未定義指令異常響應時進入此模式處理器模式處理器模式說明備注用戶(usr)正常程序工26特權模式處理器模式說明備注用戶(usr)正常程序工作模式不能直接切換到其它模式系統(sys)用于支持操作系統的特權任務等與用戶模式類似,但具有可以直接切換到其它模式等特權快中斷(fiq)支持高速數據傳輸及通道處理FIQ異常響應時進入此模式中斷(irq)用于通用中斷處理IRQ異常響應時進入此模式管理(svc)操作系統保護代碼系統復位和軟件中斷響應時進入此模式中止(abt)用于支持虛擬內存和/或存儲器保護在ARM7TDMI沒有大用處未定義(und)支持硬件協處理器的軟件仿真未定義指令異常響應時進入此模式除用戶模式外,其它模式均為特權模式。ARM內部寄存器和一些片內外設在硬件設計上只允許(或者可選為只允許)特權模式下訪問。此外,特權模式可以自由的切換處理器模式,而用戶模式不能直接切換到別的模式。未定義(und)中止(abt)管理(svc)中斷(irq)快中斷(fiq)系統(sys)特權模式處理器模式說明備注用戶(usr)正27異常模式處理器模式說明備注用戶(usr)正常程序工作模式不能直接切換到其它模式系統(sys)用于支持操作系統的特權任務等與用戶模式類似,但具有可以直接切換到其它模式等特權快中斷(fiq)支持高速數據傳輸及通道處理FIQ異常響應時進入此模式中斷(irq)用于通用中斷處理IRQ異常響應時進入此模式管理(svc)操作系統保護代碼系統復位和軟件中斷響應時進入此模式中止(abt)用于支持虛擬內存和/或存儲器保護在ARM7TDMI沒有大用處未定義(und)支持硬件協處理器的軟件仿真未定義指令異常響應時進入此模式未定義(und)中止(abt)管理(svc)中斷(irq)快中斷(fiq)

這五種模式稱為異常模式。它們除了可以通過程序切換進入外,也可以由特定的異常進入。當特定的異常出現時,處理器進入相應的模式。每種異常模式都有一些獨立的寄存器,以避免異常退出時用戶模式的狀態不可靠。異常模式處理器模式說明備注用戶(usr)正28用戶和系統模式處理器模式說明備注用戶(usr)正常程序工作模式不能直接切換到其它模式系統(sys)用于支持操作系統的特權任務等與用戶模式類似,但具有可以直接切換到其它模式等特權快中斷(fiq)支持高速數據傳輸及通道處理FIQ異常響應時進入此模式中斷(irq)用于通用中斷處理IRQ異常響應時進入此模式管理(svc)操作系統保護代碼系統復位和軟件中斷響應時進入此模式中止(abt)用于支持虛擬內存和/或存儲器保護在ARM7TDMI沒有大用處未定義(und)支持硬件協處理器的軟件仿真未定義指令異常響應時進入此模式這兩種模式都不能由異常進入,而且它們使用完全相同的寄存器組。系統模式是特權模式,不受用戶模式的限制。操作系統在該模式下訪問用戶模式的寄存器就比較方便,而且操作系統的一些特權任務可以使用這個模式訪問一些受控的資源。系統(sys)用戶(usr)用戶和系統模式處理器模式說明備注用戶(us29Cortex-M3的工作模式Cortex‐M3支持2個模式和兩個特權等級。兩種操作模式分別為:處理模式(handlermode)和線程模式(threadmode)。引入兩個模式的目的,是用于區別普通應用程序的代碼和異常服務例程的代碼——包括中斷服務例程的代碼。Cortex‐M3的特權分級——特權級和用戶級。這可以提供一種存儲器訪問的保護機制,使得普通的用戶程序代碼不能意外地,甚至是惡意地執行涉及到要害的操作。處理器支持兩種特權級,這也是一個基本的安全模型。Cortex-M3的工作模式Cortex‐M3支持2個模30特權訪問和用戶訪問處理模式線程模式可以特權訪問也可以用戶訪問始終特權訪問Cortex-M3的工作模式用戶程序中斷(異常)程序特權訪問和用戶訪問處理模式線程模式可以特權訪問也可以用戶訪問31特權執行可以訪問所有資源。非特權執行時對有些資源的訪問受到限制或不允許訪問。如部分指令的使用(設置FAULTMASK和PRIMASK的CPS指令)

對系統控制空間(SCS)的大部分寄存器的訪問。特權訪問和用戶訪問(非特權訪問)的區別FAULTMASKPRIMASKSCS……用戶訪問特權訪問特權執行可以訪問所有資源。特權訪問和用戶訪問(非特權訪問)32Cortex-M3的工作模式1.線程模式線程模式和處理模式2.處理模式在復位時處理器進入線程模式異常返回時處理器進入線程模式特權和用戶(非特權)代碼能夠在線程模式下運行出現異常時處理器進入處理模式在處理模式中,所有代碼都是特權訪問的Cortex-M3的工作模式1.線程模式線程模式和處理模式33Cortex-M3的編程模式線程模式特權訪問復位處理模式特權訪問異常線程模式用戶訪問異常異常退出CONTROL[0]=1CONTROL[0]=0MSR指令置位CONTROL[0]Cortex-M3的編程模式線程模式復位處理模式異常線程模式34Cortex-M3的編程模式Cortex-M3的編程模式35CONTROL[0]特權訪問用戶訪問10特權訪問和用戶訪問的切換控制寄存器的第0位在處理模式下,通過MSR指令清零CONTROL[0],

退出處理模式進入線程模式時切換到特權訪問。MOVR0#0X00MSRCONTROLR0在處理模式下,通過MSR指令置位CONTROL[0],

退出處理模式進入線程模式時切換到用戶訪問。在線程模式特權訪問下,通過MSR指令置位CONTROL[0],即可由特權訪問進入用戶訪問。

MRSR0CONTROLORRR0,R0,#0x01MSRCONTROLR0CONTROL[0]特權訪問用戶訪問10特權訪問和用戶訪問的36控制寄存器控制寄存器(CONTROL)控制寄存器用于定義特權級別,還用于選擇當前使用哪個堆棧指針。CONTROL[0]僅當在特權級下操作時才允許寫該位。一旦進入了用戶級,唯一返回特權級的途徑,就是觸發一個(軟)中斷,再由服務例程改寫該位。控制寄存器控制寄存器(CONTROL)CONTROL[0]37堆棧指針這兩個堆棧指針分別是:主堆棧指針(MSP),或寫作SP_main。這是缺省的堆棧指針,它由OS內核、異常服務例程以及所有需要特權訪問的應用程序代碼來使用。進程堆棧指針(PSP),或寫作SP_process。用于常規的應用程序代碼(不處于異常服用例程中時)。堆棧指針這兩個堆棧指針分別是:38堆棧指針堆棧指針39在Cortex‐M3中,有專門的指令負責堆棧操作——PUSH和POP。它倆的匯編語言語法如下例所演示:PUSH{R0};POP{R0}堆棧指針PUSH和POP能一次操作多個寄存器,如下所示:subroutine_1PUSH{R0-R7,R12,R14};保存寄存器列表…;執行處理POP{R0-R7,R12,R14};恢復寄存器列表BXR14;返回到主調函數在Cortex‐M3中,有專門的指令負責堆棧操作——PUS40Cortex-M3的編程模式主堆棧和進程堆棧處理模式線程模式可用MSP始終使用MSP也可用PSPCortex-M3的編程模式主堆棧和進程堆棧處理模式線程模式41Cortex-M3的編程模式主堆棧和進程堆棧結束復位后,所有代碼都使用主堆棧所有異常都使用主堆棧在線程模式中,使用MSR指令對CONTROL[1]執行寫操作也可以從主堆棧切換到進程堆棧。在任何時候,進程堆棧和主堆棧中只有一個是可見的,由r13指示。Cortex-M3的編程模式主堆棧和進程堆棧結束復位后,所有42Cortex-M3的編程模式通過異常進行堆棧切換線程模式主堆棧復位處理模式主堆棧產生異常線程模式線程堆棧產生異常異常退出EXC_RETURN[3:0]=0b1101EXC_RETURN[3:0]=0b1001Cortex-M3的編程模式通過異常進行堆棧切換線程模式復位43Cortex-M3的編程模式通過MSR指令修改CONTROL[1]進行堆棧切換線程模式主堆棧線程模式進程堆棧CONTROL[1]主堆棧進程堆棧10控制寄存器的第1位CONTROL[1]在Cortex‐M3的handler模式中,CONTROL[1]總是0。在線程模式中則可以為0或1。僅當處于特權級的線程模式下,此位才可寫,其它場合下禁止寫此位。Cortex-M3的編程模式通過MSR指令修改CONTROL44Cortex-M3的編程模式特權等級和堆棧指針的選擇均由CONTROL負責。當CONTROL[0]=0時,在異常處理的始末,只發生了處理器模式的轉換,如下圖所示。Cortex-M3的編程模式特權等級和堆棧指針的選擇均由CO45Cortex-M3的編程模式若CONTROL[0]=1(線程模式+用戶級),則在中斷響應的始末,處理器模式和特權等極都要發生變化,如下圖所示。Cortex-M3的編程模式若CONTROL[0]=1(線程46三種執行模式的比較執行模式進入方式堆棧SP用途特權線程模式1.復位2.在特權處理模式下使用MSR指令清零CONTROL[0]使用SP_main:1.復位后默認2.在退出特權處理模式前,修改返回值EXC_RETURN[3:0]為0b10013.清零CONTROL[1]使用SP_process:1.在退出特權處理模式前,修改返回值EXC_RETURN[3:0]為0b11012.置位CONTROL[1]線程模式(特權或非特權)+SP_process多用于操作系統的任務狀態。非特權線程模式在特權線程模式或特權處理模式下使用MSR指令置位CONTROL[0]特權處理模式出現異常只能使用SP_main特權處理模式+SP_main在前后臺和操作系統中用于中斷狀態。三種執行模式的比較執行模式進入方式堆棧SP用途特權線程1.復47前后臺系統主堆棧壓棧過程數據…數據棧頂棧底0x200004000x200003FC0x200003F8數據地址數據增長方向堆棧增長為滿遞減SP主堆棧前后臺系統主堆棧壓棧過程數據…數據棧頂棧底0x200004048前后臺系統主堆棧壓棧過程數據…數據棧底數據地址數據增長方向堆棧增長為滿遞減產生中斷主堆棧SPXPSRPCLRR12R3…R00x200004000x200003FC0x200003F8硬件自動壓棧前后臺系統主堆棧壓棧過程數據…數據棧底數據地址數據增長方向堆49前后臺系統主堆棧出棧過程數據…數據棧底數據地址退出中斷主堆棧XPSRPCLRR12R3R2R1R0通用寄存器0x200004000x200003FC0x200003F8SPSPSPSPSPSPSPXPSRPCLRR12R3R2R1R0R1R0SPSPR2XPSRPCLRR12R3退出異常,寄存器恢復為進入前的值。前后臺系統主堆棧出棧過程數據…數據棧底數據地址退出中斷主堆棧50操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2復位SP初始化…數據SP…數據…數據棧底棧底棧底棧頂棧頂棧頂棧頂棧頂棧頂SP=MSP操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2復位SP初51操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2進入異常…數據SP…數據…數據棧底棧底棧底…R0SPSP=MSP操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2進入異常…52操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2退出異常時切換到任務1…數據…數據…數據棧底棧底棧底…R0SPSP=PSP操作系統主堆棧和進程堆棧切換過程主堆棧任務1任務2退出異常時53ARM技術基礎ARM處理器工作狀態

ARM處理器工作模式

ARM寄存器組成ARM的異常中斷

ARM技術基礎ARM處理器工作狀態54ARM寄存器組成概述

簡介在ARM7TDMI處理器內部有37個用戶可見的寄存器。在不同的工作模式和處理器狀態下,程序員可以訪問的寄存器也不盡相同。ARM寄存器組成概述

簡介在ARM7TDM55寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態各模式下的寄存器寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系56寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiqARM狀態各模式下的寄存器SPSR_fiqSPSR_irqSPSR_undSPSR_abtSPSR_abtCPSRR15R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0所有的37個寄存器,分成兩大類:31個通用32位寄存器;6個狀態寄存器。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系57寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq無CPSRR15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0用戶無CPSRR15R14R13R12R11R10R9R8R7R6R5R4R3R2R1R0系統SPSR_abtCPSRR15R14_svcR13_svcR12R11R10R9R8R7R6R5R4R3R2R1R0管理SPSR_abtCPSRR15R14_abtR13_abtR12R11R10R9R8R7R6R5R4R3R2R1R0中止SPSR_undCPSRR15R14_undR13_undR12R11R10R9R8R7R6R5R4R3R2R1R0未定義SPSR_irqCPSRR15R14_irqR13_irqR12R11R10R9R8R7R6R5R4R3R2R1R0中斷SPSR_fiqCPSRR15R14_fiqR13_fiqR12_fiqR11_fiqR10_fiqR9_fiqR8_fiqR7R6R5R4R3R2R1R0快中斷ARM狀態各模式下可以訪問的寄存器寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系58寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0在匯編語言中寄存器R0~R13為保存數據或地址值的通用寄存器。它們是完全通用的寄存器,不會被體系結構作為特殊用途,并且可用于任何使用通用寄存器的指令。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系59寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8R7R6R5R4R3R2R1R0R7R6R5R4R3R2R1R0其中R0~R7為未分組的寄存器,也就是說對于任何處理器模式,這些寄存器都對應于相同的32位物理寄存器。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系60寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8寄存器R8~R14為分組寄存器。它們所對應的物理寄存器取決于當前的處理器模式,幾乎所有允許使用通用寄存器的指令都允許使用分組寄存器寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系61寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器R12_fiqR12R11_fiqR11R10_fiqR10R9_fiqR9R8_fiqR8寄存器R8~R12有兩個分組的物理寄存器。一個用于除FIQ模式之外的所有寄存器模式,另一個用于FIQ模式。這樣在發生FIQ中斷后,可以加速FIQ的處理速度。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系62寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq一般的通用寄存器寄存器R13、R14分別有6個分組的物理寄存器。一個用于用戶和系統模式,其余5個分別用于5種異常模式。R14_fiqR14_irqR14_undR14_abtR14_svcR14R13_fiqR13_irqR13_undR13_abtR13_svcR13寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系63寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq堆棧指針寄存器R13(SP)寄存器R13常作為堆棧指針(SP)。在ARM指令集當中,沒有以特殊方式使用R13的指令或其它功能,只是習慣上都這樣使用。但是在Thumb指令集中,只能使用R13作為堆棧指針。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系64寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq鏈接寄存器R14(LR)

R14為鏈接寄存器(LR),在結構上有兩個特殊功能:在每種模式下,模式自身的R14版本用于保存子程序返回地址;當發生異常時,將R14對應的異常模式版本設置為異常返回地址(有些異常有一個小的固定偏移量)。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系65Lable程序A程序BR14R14寄存器與子程序調用BLLable地址A???MOVPC,LRR14(地址A)Lable???1.程序A執行過程中調用程序B;操作流程2.程序跳轉至標號Lable,執行程序B。同時硬件將“BLLable”指令的下一條指令所在地址存入R14;3.程序B執行最后,將R14寄存器的內容放入PC,返回程序A;Lable程序A程序BR14R14寄存器與子程序調用BL66R14寄存器與異常發生異常發生時,程序要跳轉至異常服務程序,對返回地址的處理與子程序調用類似,都是由硬件完成的。R14寄存器與異常發生異常發生時,程序要跳轉67R14寄存器當發生異常嵌套時,這些異常之間可能會發生沖突。例如:如果用戶在用戶模式下執行程序時發生了IRQ中斷,用戶模式寄存器不會被破壞。但是如果允許在IRQ模式下的中斷處理程序重新使能IRQ中斷,并且發生了嵌套的IRQ中斷時,外部中斷處理程序保存在R14_irq中的任何值都將被嵌套中斷的返回地址所覆蓋。R14寄存器當發生異常嵌套時,這些異常之間可68R14寄存器注意R14R14_irq用戶模式下的程序IRQ模式下的程序AareturnB...XA地址A地址A1.執行用戶模式下的程序;2.發生IRQ中斷,硬件將某個地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務程序A執行完畢,將R14_irq寄存器的內容減去某個常量后存入PC,返回之前被中斷的程序;未被破壞R14寄存器注意R14R14_irq用戶模式下的程序IRQ模69R14寄存器注意要點R14R14_irq用戶模式下的程序IRQ模式下的程序AaB...XA地址A地址A1.執行用戶模式下的程序;2.發生IRQ中斷,硬件將某個地址存入IRQ模式下的R14_irq寄存器,用戶模式下的R14沒有被破壞;3.IRQ服務程序A執行完畢,將R14_irq寄存器的內容減去某個常量后存入PC,返回之前被中斷的程序;未被破壞IRQ模式下的程序BareturnB...XA地址B地址B4.如果在IRQ處理程序中打開IRQ中斷,并且再次發生IRQ中斷,或者調用子程序;5.硬件將返回地址保存在R14_irq寄存器中,原來保存的返回地址將被覆蓋,造成錯誤;被破壞6.在程序B返回到程序A,然后在返回到用戶模式下被中斷的程序時,發生錯誤,將不能正確返回;returnreturn解決辦法是確保R14的對應版本在發生中斷嵌套時不再保存任何有意義的值(將R14入棧),或者切換到其它處理器模式下。R14寄存器注意要點R14R14_irq用戶模式下的程序IR70寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq程序計數器R15(PC)寄存器R15為程序計數器(PC),它指向正在取指的地址。可以認為它是一個通用寄存器,但是對于它的使用有許多與指令相關的限制或特殊情況。如果R15使用的方式超出了這些限制,那么結果將是不可預測的。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系71讀R15正常操作時,從R15讀取的值是處理器正在取指的地址,即當前正在執行指令的地址加上8個字節(兩條ARM指令的長度)。由于ARM指令總是以字為單位,所以R15寄存器的最低兩位總是為0。LDRR0,PC??????PCPC-4PC-8正在執行正在譯碼正在取指流水線狀態地址程序代碼讀R15正常操作時,從R15讀取的值是處理器72讀R15當使用STR或STM指令保存R15時,可能將當前執行指令地址加8字節或加12字節保存(將來可能還有其它數字)。偏移量是8還是12取決于具體的ARM芯片,但是對于一個確定的芯片,這個值是一個常量。所以最好避免使用STR和STM指令來保存R15,讀R15當使用STR或STM指令保存R15時73寫R15正常操作時,寫入R15的值被當作一個指令地址,程序從這個地址處繼續執行(相當于執行一次無條件跳轉)。寫R15正常操作時,寫入R15的值被當作一74寫R15由于ARM指令以字節為邊界,因此寫入R15的值最低兩位通常為0b00。具體的規則取決于內核結構的版本:在ARM結構V3版及以下版本中,寫入R15的值的最低兩位被忽略,因此跳轉地址由指令的實際目標地址(寫入R15的值)和0xFFFFFFFC相與得到;在ARM結構V4版及以上版本中,寫入R15的值的最低兩位為0,如果不是,結果將不可預測。寫R15由于ARM指令以字節為邊界,因此寫入75寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系統管理中止未定義中斷快中斷通用寄存器和程序計數器R0(a1)R0R1(a2)R1R2(a3)R2R3(a4)R3R4(v1)R4R5(v2)R5R6(v3)R6R7(v4)R7R8(v5)R8R8_fiqR9(SB,v6)R9R9_fiqR10(SL,v7)R10R10_fiqR11(FP,v8)R11R11_fiqR12(IP)R12R12_fiqR13(SP)R13R13_svcR13_abtR13_undR13_irqR13_fiqR14(LR)R14R14_svcR14_abtR14_undR14_irqR14_fiqR15(PC)R15狀態寄存器CPSRCPSRSPSR無SPSR_abtSPSR_abtSPSR_undSPSR_irqSPSR_fiq程序狀態寄存器CPSR寄存器CPSR為程序狀態寄存器,在異常模式中,另外一個寄存器“程序狀態保存寄存器(SPSR)”可以被訪問。每種異常都有自己的SPSR,在因為異常事件而進入異常時它保存CPSR的當前值,異常退出時可通過它恢復CPSR。寄存器類別寄存器在匯編中的名稱各模式下實際訪問的寄存器用戶系76程序狀態寄存器

ARM內核包含1個CPSR和5個供異常處理程序使用的SPSR。CPSR反映了當前處理器的狀態,其包含:4個條件代碼標志(負(N)、零(Z)、進位(C)和溢出(V));2個中斷禁止位,分別控制一種類型的中斷;

5個對當前處理器模式進行編碼的位;1個用于指示當前執行指令(ARM還是Thumb)的位。程序狀態寄存器ARM內核包含1個CPSR和77NZCV——IM0M1M2M3M4TF—...313029282726876543210程序狀態寄存器條件代碼標志保留控制位溢出標志進位或借位擴展零負或小于IRQ禁止FIQ禁止狀態位模式位NZCVIM0M1M2M3M4TFCPSR寄存器的格式NZCV——IM0M1M2M3M4TF—...3178程序狀態寄存器條件代碼標志大多數“數值處理指令”可以選擇是否影響條件代碼標志位。通常如果指令帶S后綴,則該指令的執行會影響條件代碼標志;但有一些指令的執行總是會影響條件代碼標志。

N、Z、C和V位都是條件代碼標志。通過算術操作、邏輯操作、MSR或者LDM指令可以對這些位進行設置。所有ARM指令都可按條件來執行,而Thumb指令中只有分支指令可按條件執行。程序狀態寄存器條件代碼標志大多數“數值處理指79程序狀態寄存器條件代碼標志各標志位的含義如下:N運算結果的最高位反映在該標志位。對于有符號二進制補碼,結果為負數時N=1,結果為正數或零時N=0;Z指令結果為0時Z=1(通常表示比較結果“相等”),否則Z=0;程序狀態寄存器條件代碼標志各標志位的含義如下:80程序狀態寄存器條件代碼標志各標志位的含義如下:C當進行加法運算(包括CMN指令),并且最高位產生進位時C=1,否則C=0。當進行減法運算(包括CMP指令),并且最高位產生借位時C=0,否則C=1。對于結合移位操作的非加法/減法指令,C為從最高位最后移出的值其它指令C通常不變;V當進行加法/減法運算,并且發生有符號溢出時V=1,否則V=0,其它指令V通常不變。程序狀態寄存器條件代碼標志各標志位的含義如下:81程序狀態寄存器控制位

CPSR的最低8位為控制位,當發生異常時,這些位被硬件改變。它們分別是:中斷禁止位;T位;模式位。程序狀態寄存器控制位CPSR的最低8位為控82程序狀態寄存器控制位中斷禁止位包括I和F位:當I位置位時,IRQ中斷被禁止;當F位置位時,FIQ中斷被禁止。T位反映了正在操作的狀態:當T位置位時,處理器正在Thumb狀態下運行;當T位清零時,處理器正在ARM狀態下運行。程序狀態寄存器控制位中斷禁止位包括I和F位:83程序狀態寄存器控制位模式位包括M4、M3、M2、M1和M0,這些位決定處理器的操作模式。注意:不是所有模式位的組合都定義了有效的處理器模式,如果使用了錯誤的設置,將引起一個無法恢復的錯誤。程序狀態寄存器控制位模式位包括M4、M3、M2、M1和M0,84M[4:0]模式可見的Thumb狀態寄存器可見的ARM狀態寄存器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_irq,LR_irq,PC,CPSR,SPSR_fiqR0~R12,R13_irq,R14_irq,PC,CPSR,SPSR_irq10011管理R0~R7,SP_svc,LR_svc,PC,CPSR,SPSR_svcR0~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系統R0~R7,SP,LR,PC,CPSRR0~R14,PC,CPSRCPSR模式位設置表M[4:0]模式可見的Thumb狀態寄存器可見的ARM狀態寄85程序狀態寄存器保留位

CPSR中的保留位被保留將來使用。為了提高程序的可移植性,當改變CPSR標志和控制位時,請不要改變這些保留位。另外,請確保程序的運行不受保留位的值影響,因為將來的處理器可能會將這些位設置為1或者0。程序狀態寄存器保留位CPSR中的保留位被保留86Thumb狀態寄存器

Thumb狀態寄存器集是ARM狀態集的子集,程序員可以直接訪問的寄存器為:8個通用寄存器R0~R7;程序計數器(PC);堆棧指針(SP);鏈接寄存器(LR);有條件訪問程序狀態寄存器(CPSR)。Thumb狀態寄存器Thumb狀態寄存器集是87Thumb狀態各模式下的寄存器CPSRCPSR狀態寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7R6R6R5R5R4R4R3R3R2R2R1R1R0R0通用寄存器和程序計數器快中斷中斷未定義中止管理系統用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別Thumb狀態各模式下的寄存器CPSRCPSR狀態寄存器R188Thumb狀態下的通用寄存器CPSRCPSR狀態寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數器快中斷中斷未定義中止管理系統用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別R7R6R5R4R3R2R1R0在匯編語言中寄存器R0~R7為保存數據或地址值的通用寄存器。對于任何處理器模式,它們中的每一個都對應于相同的32為物理寄存器。它們是完全通用的寄存器,不會被體系結構作為特殊的用途,并且可用于任何使用通用寄存器的指令。Thumb狀態下的通用寄存器CPSRCPSR狀態寄存器R1589Thumb狀態下的堆棧指針寄存器(SP)CPSRCPSR狀態寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數器快中斷中斷未定義中止管理系統用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別堆棧指針SP對應ARM狀態的寄存器R13。每個異常模式都有其自身的SP分組版本,SP通常指向各異常模式所專用的堆棧。

注意:在發生異常時,處理器自動進入ARM狀態。R13_fiqR13_irqR13_undR13_abtR13_svcR13Thumb狀態下的堆棧指針寄存器(SP)CPSRCPSR狀態90Thumb狀態下的鏈接寄存器R14(LR)CPSRCPSR狀態寄存器R15PCR14_fiqR14_irqR14_undR14_abtR14_svcR14LRR13_fiqR13_irqR13_undR13_abtR13_svcR13SPR7R7(v4,wr)R6R6(v3)R5R5(v2)R4R4(v1)R3R3(a4)R2R2(a3)R1R1(a2)R0R0(a1)通用寄存器和程序計數器快中斷中斷未定義中止管理系統用戶各模式下實際訪問的寄存器寄存器在匯編中的名稱寄存器類別鏈接寄存器LR對應ARM狀態寄存器R14,在結構上有兩個特殊功能,同“ARM狀態下的鏈接寄存器LR”。注意:在發生異常時,處理器自動進入ARM狀態。R14_fiqR14_irqR14_undR14_abtR14_svcR14Thumb狀態下的鏈接寄存器R14(LR)CPSRCPSR狀91ARM狀態和Thumb狀態之間寄存器的關系

Thumb狀態寄存器與ARM狀態寄存器有如下的關系:Thumb狀態R0~R7與ARM狀態R0~R7相同;Thumb狀態CPSR和SPSR與ARM狀態CPSR和SPSR相同;Thumb狀態SP映射到ARM狀態R13;Thumb狀態LR映射到ARM狀態R14;Thumb狀態PC映射到ARM狀態PC(R15)。ARM狀態和Thumb狀態之間寄存器的關系92Thumb狀態寄存器在Arm狀態寄存器上的映射R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

R11

R12

R0

堆棧指針(R13)

連接寄存器(R14)

程序計數器(R15)

低寄存器高寄存器Thumb狀態寄存器在Arm狀態寄存器上的映射R1R2R93在Thumb狀態中訪問高寄存器在Thumb狀態中,高寄存器(R8~R15)不是標準寄存器集的一部分。匯編語言程序員對它們的訪問受到限制,但可以將它們用于快速暫存。可以使用MOV、CMP和ADD指令對高寄存器操作。在Thumb狀態中訪問高寄存器在Thumb9432位通用寄存器R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRr0~r12,為13個通用寄存器低寄存器

,r0-r7可以被指定通用寄存器的所有指令訪問高寄存器

,r8-r12可以被指定通用寄存器的所有32位指令訪問,不能被16位指令訪問。SP_ProcessSP_MainCORTEXm3寄存器組織32位通用寄存器R0R1R2R3R4R5R6R7R8R9R195分組的堆棧指針(SP)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRSP_MainSP_Process處理模式線程模式可用MSP始終使用MSP也可用PSP復位后默認的堆棧指針,用于操作系統內核以及異常處理例程(包括中斷服務例程)由用戶的應用程序代碼使用分組的堆棧指針(SP)R0R1R2R3R4R5R6R7R8R96堆棧指針(SP)堆棧指針(SP)97分組的堆棧指針(SP)注意:1、不是每個應用都必須用齊兩個堆棧指針,簡單的應用程序只使用MSP就夠了。2、MSP,亦寫作SP_main,這是復位后缺省使用堆棧指針,服務于操作系統內核和異常服務例程;PSP,亦寫作SP_process,典型地用于普通的用戶線程中。3、寄存器的PUSH和POP操作永遠都是4字節對齊的——也就是說他們的地址必須是0x4,0x8,0xc,……。R13的最低兩位被硬線連接到0,并且總是讀出0分組的堆棧指針(SP)注意:98鏈接寄存器(LR)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSR鏈接寄存器(LR)在執行分支(branch)和鏈接(BL)指令或帶有交換的分支和鏈接指令(BLX)時,LR用于保存PC的返回地址。

主要用于保存子程序的返回地址。也用于異常返回。

鏈接寄存器(LR)R0R1R2R3R4R5R6R7R8R9R99鏈接寄存器(LR)R0R1R2R3R4R5R6R7R8R9R10R11R12R13(SP)R14(LR)R15(PC)XPSRintmain(){......delay();SetLED1();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論