新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ARM寄存器小結

        ARM寄存器小結

        作者: 時間:2016-11-09 來源:網絡 收藏
        ARM微處理器支持7種運行模式,分別為:

        1. 用戶模式(usr):ARM處理器正常的程序執行狀態;
        2. 快速中斷模式(fiq):用于高速數據傳輸或通道管理;
        3. 外部中斷模式(irq):用于通用的中斷處理;
        4. 管理模式(svc):操作系統使用的保護模式;
        5. 數據訪問終止模式(abt):當數據或指令預取終止時進入該模式,用于虛擬存儲及存儲保護;
        6. 系統模式(sys):運行具有特權的操作系統任務;
        7. 未定義指令中止模式(und):當未定義指令執行時進入該模式,可用于支持硬件協處理器的軟件仿真

        本文引用地址:http://www.104case.com/article/201611/317586.htm

        ARM體系結構的存儲器格式有如下兩種:
        大端格式:字數據的高字節存儲在低地址中,字數據的低字節存放在高地址中;
        小端格式:與大端存儲格式相反,高地址存放數據的高字節,低地址存放數據的低字節

        器總結:
        ARM有16個32位的寄存器(r0到r15)。
        r15充當程序寄存器PC,r14(link register)存儲子程序的返回地址,r13存儲的是堆棧地址。
        ARM有一個當前程序狀態寄存器:CPSR。
        一些寄存器(r13,r14)在異常發生時會產生新的instances,比如IRQ處理器模式,這時處理器使用r13_irq和r14_irq
        ARM的子程序調用是很快的,因為子程序的返回地址不需要存放在堆棧中。


        1、ARM處理器共有37個寄存器,其中包括:

        i. 31個通用寄存器,包括程序計數器(PC)在內。都是32位寄存器

        ii. 6個狀態寄存器,都是32位寄存器,但目前只使用了其中12位

        2、ARM處理器有7種不同的處理器模式,在每一種處理器模式中有一組相應的寄存器組。任意時刻(也就是任意的處理器模式下),可見的寄存器包括15個通用寄存器(R0~R14)、一個或兩個狀態寄存器及程序計數器(PC)。在所有的寄存器中,有些是各模式共用的同一個物理寄存器,有些是各模式自己擁有的獨立的物理寄存器。

        3、 通用寄存器可以分為3類:未備份寄存器(R0~R7)、備份寄存器(R8~R14)和程序計數器PC(R15)。對于每一個未備份寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。對應備份寄存器R8~R12來說,每個寄存器對應兩個不同的物理寄存器,這使得中斷處理非常簡單。例如,僅僅使用R8~R14寄存器時,FIQ處理程序可以不必執行保存和恢復中斷現場的指令,從而使中斷處理過程非常迅速。對于備份寄存器R13和R14來說,每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式和系統模式共用的,另外的5個對應于其他5種處理器模式。

        4、每一種異常模式擁有自己的物理的R13。應用程序初始化該R13,使其指向該異常模式專用的棧地址。當進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運行現場。

        5、寄存器R14又被稱為連接寄存器(Link Register,LR),在ARM體系中具有下面兩種特殊的作用:

        i. 每一種處理器模式自己的物理R14中存放當前子程序的返回地址。當通過BL或BLX指令調用子程序時,R14被設置成該子程序的返回地址。在子程序中,當把R14的值復制到程序計數器PC中時,子程序即返回。

        ii.當異常中斷發生時,該異常模式特定的物理R14被設置成該異常模式將要返回的地址,對于有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與子程序返回方式基本相同。

        6、由于ARM采用了流水線機制,當正確讀取了PC的值時,該值為當前指令地址值加8個字節。也就是說,對于ARM指令集來說,PC指向當前指令的下兩條指令的地址,由于ARM指令是字節對齊的,PC值得第0位和第1位總為0。

        7、 對于ARM版本3以及更低的版本,寫入R15的地址值的bits[1:0]被忽略,對于ARM版本4以及更高的版本,程序必須保證寫入R15寄存器的地址值的bits[1:0]為0b00;否則會產生不可預知的結果。對于Thumb指令集來說,指令是半字對齊的。處理器將忽略bit[0]。

        還有一些指令對于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來確定是ARM指令,還是Thumb指令。

        8、指令mov pc, pc將程序跳轉到當前指令下面第2條指令處執行。類似的指令還有add pc, pc, #0

        9、 每一種處理器模式下都有一個專用的物理狀態寄存器,稱為SPSR(備份程序狀態寄存器)。當特定的異常中斷發生時,這個寄存器用于存放當前程序狀態寄存器的內容。在異常中斷程序退出時,可以用SPSR中保存的值來恢復CPSR。

        10、 由于用戶模式和系統模式不是異常中斷模式,所以它們沒有SPSR。當在用戶模式或系統模式中 訪問SPSR,將會產生不可預知的結果。

        -----------------------------------------------------------------------------------------------------

        ARM處理器共有37個寄存器。其中包括:31個通用寄存器,包括程序計數器(PC)在內。這些寄存器都是32位寄存器。以及6個32位狀態寄存器。但目前只使用了其中12位。ARM處理器共有7種不同的處理器模式,在每一種處理器模式中有一組相應的寄存器組。任意時刻(也就是任意的處理器模式下),可見的寄存器包括15個通用寄存器(R0~R14)、一個或兩個狀態寄存器及程序計數器(PC)。

        表1各種處理器模式下的寄存器
        用戶模式系統模式特權模式中止模式未定義指令模式外部中斷模式快速中斷模式
        R0R0R0R0R0R0R0
        R1R1R1R1R1R1R1
        R2R2R2R2R2R2R2
        R3R3R3R3R3R3R3
        R4R4R4R4R4R4R4
        R5R5R5R5R5R5R5
        R6R6R6R6R6R6R6
        R8R8R8R8R8R8R8_fiq
        R9R9R9R9R9R9R9_fiq
        R10R10R10R10R10R10R10_fiq
        R11R11R11R11R11R11R11_fiq
        R12R12R12R12R12R12R12_fiq
        R13R13R13_svcR13_abtR13_undR13_inqR13_fiq
        R14R14R14_svcR14_abtR14_undR14_inqR14_fiq
        PCPCPCPCPCPCPC
        CPSRCPSR
        CPSR
        SPSR_svc
        CPSR
        SPSR_abt
        CPSR
        SPSR_und
        CPSR
        SPSR_inq
        CPSR
        SPSR_fiq

        未備份寄存器包括R0~R7。對于每一個未備份寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。未備份寄存器沒有被系統用于特別的用途,任何可采用通用寄存器的應用場合都可以使用未備份寄存器。

        對于備份寄存器R8~R12來說,每個寄存器對應兩個不同的物理寄存器。系統沒有將這幾個寄存器用于任何的特殊用途,但是當中斷處理非常簡單,僅僅使用R8~R14寄存器時,FIQ處理程序可以不必執行保存和恢復中斷現場的指令,從而可以使中斷處理過程非常迅速。對于備份寄存器R13和R14,每個寄存器對應6個不同的物理寄存器,其中的一個是用戶模式和系統模式共用的;另外的5個對應于其他5種處理器模式。采用記號R13_來區分各個物理寄存器:其中,可以是下面幾種模式之一:usr、svc、abt、und、irq及fiq。
        寄存器R13在ARM中常用作棧指針。在ARM指令集中,這只是一種習慣的用法,并沒有任何指令強制性的使用R13作為棧指針,用戶也可以使用其他的寄存器作為棧指針;而在Thumb指令集中,有一些指令強制性地使用R13作為棧指針。每一種異常模式擁有自己的物理的R13。應用程序初始化該R13,使其指向該異常模式專用的棧地址。當進入異常模式時,可以將需要使用的寄存器保存在R13所指的棧中;當退出異常處理程序時,將保存在R13所指的棧中的寄存器值彈出。這樣就使異常處理程序不會破壞被其中斷程序的運行現場。
        寄存器R14又被稱為連接寄存器(Link Register,LR),在ARM體系中具有下面兩種特殊的作用:1、每一種處理器模式自己的物理R14中存放在當前子程序的返回地址。當通過BL或BLX指令調用子程序時,R14被設置成該子程序的返回地址。在子程序中,當把R14的值復制到程序計數器PC中時,子程序即返回。2、當異常中斷發生時,該異常模式特定的物理R14被設置成該異常模式將要返回的地址,對于有些異常模式,R14的值可能與將返回的地址有一個常數的偏移量。具體的返回方式與上面的子程序返回方式基本相同。R14寄存器也可以作為通用寄存器使用。

        由于ARM采用了流水線機制,當正確讀取了PC的值時,該值為當前指令地址值加8個字節。也就是說,對于ARM指令集來說,PC指向當前指令的下兩條指令的地址。
        由于ARM指令是字對齊的,PC值的第0位和第1位總為0。需要注意的是,當使用指令STR/STM保存R15時,保存的可能是當前指令地址值加8字節,也可能保存的是當前指令地址加12字節。到底是哪種方式,取決于芯片具體設計方式。無論如何,在同一芯片中,要么采用當前指令地址加8,要么采用當前指令地址加12,不能有些指令采用當前指令地址加8,另一些指令采用當前指令地址加12。因此對于用戶來說,盡量避免使用STR/STM指令來保存R15的值。當不可避免這種使用方式時,可以先通過一些代碼來確定所用的芯片使用的是哪種實現方式。
        對于ARM版本4以及更高的版本,程序必須保證寫入R15寄存器的地址值的bits[1:0]為0b00;否則將會產生不可預知的結果。對于Thumb指令集來說,指令是半字對齊的,處理器將忽略bit[0]。即寫入R15的地址值首先與0XFFFFFFFC做與操作,再寫入R15中。
        還有—些指令對于R15的用法有一些特殊的要求。比如,指令BX利用bit[0]來確定是ARM指令,還是Thumb指令。這種讀取PC值和寫入PC值的不對稱的操作需要特別注意。
        需要注意的是,當使用str/stm保存R15時,保存的可能是當前指令地址值加8個字節,也可能保存的是當前指令地址值加12個字節。到底哪種方式取決于芯片的具體設計。對于用戶來說,盡量避免使用STR/STM指令來保存R15的值。
        當成功的向R15寫入一個數值時,程序將跳轉到該地址執行。由于ARM指令是字對齊的,寫入R15的值應滿足bits[1:0]為0b00,具體要求arm各版本有所不同:
        **對于arm3以及更低的版本,寫入R15的地址值bits[1:0]被忽略,即寫入r15的地址值將與0xFFFF FFFC做與操作。
        **對于ARM4以及更高的版本,程序必須保證寫入R15的地址值bits[1:0]為0b00,否則將產生不可預知的后果。
        對于Thumb指令集來說,指令是半字對齊的,處理器將忽略bit[0]。

        CPSR(當前程序狀態寄存器)可以在任何處理器模式下被訪問。它包含了條件標志位、中斷禁止位、當前處理器模式標志以及其他的一些控制和狀態位。

        每一種處理器模式下都有一個專用的物理狀態寄存器,稱為SPSR(備份程序狀態寄存器)。當特定的異常中斷發生時,這個寄存器用于存放當前程序狀態寄存器的內容。在異常中斷程序退出時,可以用SPSR中保存的值來恢復CPSR。由于用戶模式和系統模式不是異常中斷模式,所以它們沒有SPSR。當在用戶模式或系統模式中訪問SPSR,將會產生不可預知的結果。
        CPSR的格式如下所示。SPSR格式與CPSR格式相同。
        31302928272676543210
        NZCVQDNM(RAZ)IFTM4M3M2M1
        M0

        ARM體系使用單—的平板地址空間。該地址空間的大小為232個8位字節。這些字節單元的地址是一個無符號的32位數值,其取值范圍為0到232—1。ARM的地址空間也可以看作是230個32位的字單元。這些字單元的地址可以被4整除,也就是說該地址的低兩位為0b00。地址為A的字數據包括地址為A、A+I、A+2、A+3,4個字節單元的內容。
        在ARM版本4及以上的版本中,ARM的地址空間也可以看作是231個16位的半字單元。這些半字單元的地址可以被2整除,也就是說該地址的最低位為0b0。地址為A的半字數據包括地址為A、A+1兩個字節單元的內容。
        各存儲單元的地址作為32位的無符號數,可以進行常規的整數運算。這些運算的結果進行232取模。也就是說,運算結果發生上溢出和下溢出時,地址將會發生卷繞。

        在ARM體系中,每個字單元中包含4個字節單元或者兩個半字單元:1個半字單元中包含兩個字節單元。但是在字單元中,4個字節哪一個是高位字節,哪一個是低位字節則有兩種不同的格式:big-endian格式和little-endian格式。
        在big-endian格式中,對于地址為A的字單元包括字節單元A、A+1、A+2及A+3,其中字節單元由高位到低位字節順序為A、A+1、A+2、A+3;地址為A的字單元包括半字單元A、A+2,其中半字單元由高位到低位字節順序為A、A+2:地址為A的半字單元包括字節單元A、A+1,其中字節單元由高位到低位字節順序為A、A+1。
        在little-endian格式中,地址為A的字單元包括字節單元A、A+1、A+2及A+3,其中字節單元由高位到低位字節順序為A+3、A+2、A+1、A;地址為A的字單元包括半字節單元A、A+2,其中半字單元由高位到低位字節順序為A+2、A;地址為A的半字單元包括字節單元A、A+1,其中字節單元由高位到低位字節順序為A+1、A



        關鍵詞: ARM寄存

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西青区| 门源| 临澧县| 浦县| 青田县| 高邮市| 涪陵区| 廊坊市| 莱西市| 博客| 嘉义市| 金华市| 德州市| 礼泉县| 古蔺县| 辰溪县| 奉新县| 海林市| 扬州市| 唐海县| 金塔县| 绥宁县| 岱山县| 通道| 绵竹市| 怀仁县| 西贡区| 平度市| 渭源县| 芜湖县| 错那县| 三门县| 牟定县| 亳州市| 镇远县| 达日县| 额尔古纳市| 饶河县| 衡东县| 项城市| 大英县|