ARM基礎學習-寄存器

大學的時候學習過一段時間彙編,現在出來工作發現還需要撿起這些東西重新去學習,接下這一段時間先集中整理ARM的基礎知識,然後擴展到ARMv8學習64位框架,然後學習MMU,學習它的中斷處理方式;這篇文章以基礎爲主學習ARM寄存器;

寄存器分類

ARM也可以理解成一個芯片,它也有自己的寄存器,實現與memory之間的數據傳遞; ARM處理器共有37個寄存器,其中包括:

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

下面位arm 的6中模式所對應的寄存器:
這裏寫圖片描述

ARM處理器有7種不同的處理器模式,在每一種處理器模式中有一組相應的寄存器組。在所有的寄存器中,有些是各模式共用的同一個物理寄存器,有些是各模式自己擁有的獨立的物理寄存器。

簡單介紹下ARM處理器模式:
用戶模式(User): ARM處理器正常的程序執行狀態;
快速中斷模式(FIQ): 用於高速數據傳輸或通道處理;
外部中斷模式(IRQ): 用於通用的中斷處理;
管理模式(Supervisor): 操作系統使用的保護模式;
數據訪問終止模式(Abort): 當數據或指令預取終止時進入該模式,可用於虛擬存儲及存儲保護;
系統模式(System): 運行具有特權的操作系統任務;
未定義指令中止模式(Undifined):當未定義的指令執行時進入該模式,可用於支持硬件協處理器的軟件仿真;

通用寄存器可以分爲3類:未備份寄存器(R0~R7)、備份寄存器(R8~R14)和程序計數器PC(R15)。對於每一個未備份寄存器來說,在所有的處理器模式下指的都是同一個物理寄存器。應備份寄存器R8~R12來說,每個寄存器對應兩個不同的物理寄存器(中斷模式和非中斷模式);

特殊寄存器

下面依次介紹幾個特殊寄存器:

  1. PC(程序計數器) R15 = windows 中 EIP

處理器要執行的程序(指令序列)都是以二進制代碼序列方式預存儲在計算機的存儲器中,處理器將這些代碼逐條地取到處理器中再譯碼、執行,以完成整個程序的執行。爲了保證程序能夠連續地執行下去,CPU必須具有某些手段來確定下一條取指指令的地址.程序計數器(PC)正是起到這種作用,所以通常又稱之爲‘指令計數器’;

因爲ARM採用流水線機制,當正確讀取PC值得時候,該值爲當前指令地址加八個字節,也就是指向當前指令下兩個條指令的地址;PC的第0位和第1爲始終爲0;

backtrace:
    #00 pc 00000988  /system/vendor/lib/libcancer.so (_ZN7android6Cancer15destroyInstanceEv+39)
    //#00 pc表示異常發生時的PC值在庫函數裏的偏移;
    #01 pc 0001db9d  /system/vendor/lib/libcam.client.so (_ZN7android15NSDisplayClient13DisplayClient4initEv+60)
    //#01 pc表示在DisplayClient4initEv函數調用下一個函數接口在庫函數裏裏的偏移;
    #02 pc 0000d145  /system/vendor/lib/libcam.device1.so (_ZN7android14Cam1DeviceBase17initDisplayClientEP18preview_stream_ops+684)

2.棧指針寄存器 SP (寄存器 R13)

ARM處理器中通常將寄存器R13作爲棧指針(SP)。ARM處理器針對不同的模式,共有 6 個棧指針(SP),其中用戶模式和系統模式共用一個SP,每種異常模式都有各自專用的R13寄存器(SP)。它們通常指向各模式所對應的專用棧,也就是ARM處理器允許用戶程序有六個不同的棧空間,ARM處理器中的R13被用作SP。當不使用堆棧時,R13 也可以用做通用數據寄存器.

這裏寫圖片描述

3.R14稱爲子程序鏈接寄存器LR(Link Register)

當執行子程序調用指令(BL)時,R14可得到R15(程序計數器PC)的備份.在每一種運行模式下,都可用R14保存子程序的返回地址,當用BL或BLX指令調用子程序時,將PC的當前值複製給R14,執行完子程序後,又將R14的值複製回PC,即可完成子程序的調用返回。以上的描述可用指令完成。

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

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

00000764 <func1>:
     764:   b082        sub sp, #8
     766:   2002        movs    r0, #2
     768:   9001        str r0, [sp, #4]
     76a:   b002        add sp, #8
     76c:   4770        bx  lr //返回地址

4.PSR 寄存器(狀態寄存器)

CPSR(當前程序狀態寄存器)它包含了條件標誌位,中斷禁止位,當前處理器模式標誌以及一些控制和狀態位,SPSR 備份程序狀態寄存器,當特定的異常中斷模式發生時。這個寄存器存放當前程序狀態寄存器的內容,異常中斷程序退出時候,可以用SPSR來恢復CPSR,由於用戶模式和系統模式不是異常中斷模式,所以沒有SPSR;

這裏寫圖片描述

高4位(28-31):條件標誌位(Condition code flags): N,Z,C,V. 這些位可以通過邏輯或者算術操作, 或者 MSR 和 LDM 指令來操作. 處理器會測試這些標誌位,以確定是否操作一些指令.

-   N: 負數 ? 1 : 0
-   Z: 運算結果爲0 ? 1 : 0
-   C: 進位標誌.(4中情況)
    1. 加法指令(包括CMN): 當結果產生了進位,則爲1,表示無符號數運算髮生溢出;
    2. 減法指令(包括CMP): 當運算中發生了錯位,爲1, 表示運算髮生下溢出;
    3. 對已在操作數中包含移位操作的運算指令,C被置爲被移位寄存器最後移出去的位;
    4. 對於其他非加/減的運算指令,c一般不收影響;
-   V: 溢出標誌位: 對於加減法,當操作數和運算結果都是以二進制的補碼錶示的帶符號的數,切運算結果超出了有符號運算的範圍溢出,V=1.

低8位(0-7):當發生異常時, 這些爲的值將發生相應的變化.在特權模式下,也可以通過軟件來修改這些位.用的比較多.

 1.  *中斷禁止位* (I=1, IRQ禁止;       F=1, FIQ禁止).
 2.  *狀態控制位* (T=0, 處於ARM狀態,即可執行32的ARM指令, 否則處於Thumb狀態).
 3.  *模式控制位* ( M[4:0],這5位組合控制處理器處於什麼工作模式)

這裏寫圖片描述

參考書籍

ARM體系結構編程 - 杜春雷

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章