ARMv8-AArch64寄存器和指令集


(一)簡述

AArch擁有31個通用寄存器,系統運行在64位狀態下的時候名字叫Xn,運行在32位的時候就叫Wn;

這裏寫圖片描述

AArch32與AArch64寄存器對應關係:

這裏寫圖片描述


(二)PSTATE

PSTATE不是一個寄存器,它表示的是保存當前process狀態信息的一組寄存器或者一些標誌位信息的統稱,當異常發生的時候這些信息就會保存到EL所對應的SPSR寄存器當中;

寄存器:

這裏寫圖片描述

標誌位:

type ProcState is (
bits (1) N, // Negative condition flag
bits (1) Z, // Zero condition flag
bits (1) C, // Carry condition flag
bits (1) V, // oVerflow condition flag
bits (1) D, // Debug mask bit [AArch64 only]
bits (1) A, // Asynchronous abort mask bit
bits (1) I, // IRQ mask bit
bits (1) F, // FIQ mask bit
bits (1) SS, // Software step bit
bits (1) IL, // Illegal execution state bit
bits (2) EL, // Exception Level (see above)
bits (1) nRW, // not Register Width: 0=64, 1=32
bits (1) SP, // Stack pointer select: 0=SP0, 1=SPx [AArch64 only]
bits (1) Q, // Cumulative saturation flag [AArch32 only]
bits (4) GE, // Greater than or Equal flags [AArch32 only]
bits (8) IT, // If-then execution state bits [AArch32 only]
bits (1) J, // J execution state bit [AArch32 only, RES0 in ARMv8]
bits (1) T, // T32 execution state bit [AArch32 only]
bits (1) E, // Endian execution state bit [AArch32 only]
bits (5) M // Mode field (see above) [AArch32 only]
)

PSTATE.{N, Z, C, V}: 條件標誌位,這些位的含義跟之前AArch32位一樣,分別表示補碼標誌,運算結果爲0標誌,進位標誌,帶符號位溢出標誌,具體請參考:ARM(V8) Architecture Reference Manual.pdf page B1-62

PSTATE.SS:異常發生的時候,通過設置MDSCR_EL1.SS 爲 1啓動單步調試機制;

PSTATE.IL:異常執行狀態標誌,非法異常產生的時候,會設置這個標誌位,會導致的事件請參考:D1.11.3page D1-1439

PSTATE.{D, A, I, F}:D表示debug異常產生,比如軟件斷點指令/斷點/觀察點/向量捕獲/軟件單步 等;A, I, F表示異步異常標誌,異步異常會有兩種類型:一種是物理中斷產生的,包括SError(系統錯誤類型,包括外部數據終止),IRQ或者FIQ;另一種是虛擬中斷產生的,這種中斷髮生在運行在EL2管理者enable的情況下:vSError,vIRQ,vFIQ;

PSTATE.nRW:表示當前ELx 所運行的狀態,分爲AArch64和AArch32:

  1. SPSR_EL1.M[4] 決定EL0的執行狀態,爲0(64bit ),1(32bit);
  2. HCR_EL2.RW 決定EL1的執行狀態,爲1(64bit ),0(32bit);
  3. SCR_EL3.RW確定EL2 or EL1的執行狀態,爲1(64bit ),0(32bit);

PSTATE.SP: 某個ELx 下的堆棧指針,EL0下就表示sp_el0;


SPSR registers:

SPSR狀態寄存器:之前也有說過當運行在EL0層的時候,所用的是sp_el0,當在更高級ELx運行的時候同時可以使用spsr_el0或者spsr_elx,所以這裏用t,h後綴來區分,SPSR_ELx保存了進入ELx的PSTATE狀態信息:

這裏寫圖片描述

這裏寫圖片描述


(三)A64指令集

(0)A64特點

  1. 移除了批量加載寄存器指令 LDM/STM, PUSH/POP, 使用STP/LDP 一對加載寄存器指令代替;
  2. 沒有提供訪問CPSR的單一寄存器,但是提供訪問PSTATE的狀態域寄存器;
  3. A64沒有協處理器的概念,沒有協處理器指令MCR,MRC;
  4. 相比A32少了很多條件執行指令,只有條件跳轉和少數數據處理這類指令纔有條件執行.附件爲條件指令碼;

指令基本格式:

<Opcode>{<Cond>}<S>  <Rd>, <Rn> {,<Opcode2>}

Opcode:操作碼,也就是助記符,說明指令需要執行的操作類型
Cond:指令執行條件碼,查看附件圖;
S:條件碼設置項,決定本次指令執行是否影響PSTATE寄存器響應狀態位值
Rd/Xt:目標寄存器,A32指令可以選擇R0-R14,T32指令大部分只能選擇RO-R7,A64指令可以選擇X0-X30;
Rn/Xn:第一個操作數的寄存器,和Rd一樣,不同指令有不同要求;
Opcode2:第二個操作數,可以是立即數,寄存器Rm和寄存器移位方式(Rm,#shit);

各種指令詳細說明請查看ARM(V8) Architecture Reference Manual.pdf page C6-387 這裏只是貼出了內存訪問操作的指令;


內存操作指令load/store

所支持的尋址方式:

這裏寫圖片描述

  1. Base register only (no offset) :基址寄存器無偏移;
  2. Base plus offset:基址寄存器加偏移;
  3. Pre-indexed:事先更新尋址,先變化後操作,[base, #imm]!,!表示則當數據傳送完畢之後,將最後的地址寫入基址寄存器,否則基址寄存器的內容不改變;
  4. Post-indexed:事後更新尋址,先操作後變化,[base], #imm;
  5. Literal (PC-relative): PC相對尋址;

load/store指令分類(C3.2-131):批量寄存器、單個寄存器、一對寄存器、非-暫存、非特權、獨佔}以及load-Acquire、store-Release指令;

(1)單個寄存器load/store:

這裏寫圖片描述

以LDR爲例,下面爲三種取址方式:

這裏寫圖片描述

如:LDR X1,[X2]; 取出X2寄存器存儲的地址中的內容複製到X1;

這裏寫圖片描述

如:LDR X1,[X2],#4; 取出X2寄存器存儲的地址中的內容複製到X1,然後X2 = X2 + 4;

這裏寫圖片描述

如:LDR X1,[PC,#4];

(2)unscaled offset load/store:

Scaled 和Unscaled其實就是可以見到理解爲對齊和非對齊,本質就是是否乘以一個常量,因爲scaled的總是可以乘以一個常量來達到對齊,而Unscaled就不需要,是多少就多少,更符合人類自然的理解,尋址方式只支持:基址 + 9bit 的立即數偏移值範圍爲(-256 ~ 255)因爲是帶有符號的;

這裏寫圖片描述

以LDUR爲例:

這裏寫圖片描述

(3)Load/Store Pair:

從Memory地址addr處讀取兩個雙字/字數據到目標寄存器Xt1,Xt2;尋址方式:對齊的,有符號#simm7偏移,支持pre-/post-index 操作;

這裏寫圖片描述

以LDP爲例:

這裏寫圖片描述

(4)Load/Store Non-temporal Pair:

所謂Non-temporal就是就是用於你確定知道該地址只加載一次,不需要觸發緩存,避免數據被刷新,優化性能,其它指令都默認會寫Cache;尋址方式:對齊的,有符號#simm7偏移,不支持pre-/post-index 操作;

這裏寫圖片描述

以LDNP爲例:

這裏寫圖片描述

(4)Load/Store Unprivileged:

所謂Unprivileged就是說EL0/EL1的內存有不同的權限控制,這條指令以EL0的權限存取,用於模擬EL0的行爲,該指令應用於EL1和EL0之間的交互;尋址方式: 非對齊的,有符號#simm9偏移,不支持pre-/post-index 操作;

這裏寫圖片描述

以LDTR爲例:

這裏寫圖片描述

(4)Load-Exclusive/Store-Exclusive:

在多核CPU下,對一個地址的訪問可能引起衝突,這個指令解決了衝突,保證原子性(所謂原子操作簡單理解就是不能被中斷的操作),是解決多個CPU訪問同一內存地址導致衝突的一種機制。通常用於鎖,比如spinlock,可以參考代碼:

arch/arm64/include/asm/spinlock.h

尋址方式:無偏移基址寄存器,不支持pre-/post-index 操作;

這裏寫圖片描述

以LDXR爲例:

這裏寫圖片描述

(4)Load-Acquire/Store-Release:

內存屏障操作,Load-Acquire讀操作,相當於半個DMB指令,只管讀內存操作;Store-Release寫操作,相當於半個DMB指令,只管寫內存操作;本質是爲了解決亂序執行中有依賴關係的指令可以按正確的邏輯執行的一種機制,而DMB,DSB,ISB的強制性(權限)由低到高;尋址方式:無偏移基址寄存器,不支持pre-/post-index 操作;
這裏寫圖片描述

以LDAR爲例:

這裏寫圖片描述


附件

條件指令碼

這裏寫圖片描述

特殊符號定義:

特殊符號  對應僞操作   含義 
=        DCB       分配一片連續的字節存儲單元並用指定的數據初始化
&        DCD       分配一片連續的字存儲單元並用指定的數據初始化
%        SPACE     分配一片連續的存儲單元
^        MAP       定義一個結構化內存表的首地址
#        FILED     定義一個結構化內存表的數據域(經常和MAP一起使用,一個定義起始地址,一個定義長度)
*        EQU       爲程序中的常量、標號等定義一個等效的字符名
!                  地址更新
[                  相當於IF
|                  相當於ELSE
]                  相當於ENDIF
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章