介紹
- aarch64是 ARM 架構的 64 位版本,它是 ARMv8 架構的一部分,被設計用來提供更高的性能和更大的地址空間,同時保持與 32 位 ARM 架構的兼容性。
- AArch64 是 ARMv8 的 64 位指令集架構(ISA),它提供了豐富的指令集來支持高性能計算。
- Armv8-A支持三種指令集:A32、T32和A64;在AArch64執行狀態下執行時使用A64指令集。它是一個固定長度的32位指令集,名稱中的64指的是AArch64執行狀態對該指令的使用。它不是指內存中指令的大小。A32和T32指令集也分別被稱為Arm和Thumb。
- 特點:
- 64位寄存器:提供了更多的寄存器,每個寄存器都是 64 位寬。
- 更大的地址空間:支持超過 4GB 的內存地址空間。
- 改進的指令集:包括新的指令和對現有指令的擴展,以提高性能和效率。
- SIMD 擴展:高級 SIMD ( neon) 擴展,提供對單指令多數據(SIMD)操作的支持,增強了圖形和多媒體應用的性能。
- 虛擬化支持:提供了硬件虛擬化功能,使得 AArch64 架構的處理器可以更有效地運行虛擬機。
- 節能特性:包括多種節能技術,如動態調頻和電壓調整(DVFS)。
- 安全性增強:包括安全啟動和加密功能,提高了系統的安全性。
寄存器
- 寄存器:
- 寄存器是中央處理器(CPU)內部的一小部分高速存儲資源,用于快速訪問和處理數據。它們在計算機體系結構中起著至關重要的作用。
- 寄存器(Register)是 CPU 內部的存儲單元。可以用來暫存程序指令,數據和內存地址。因為存在于 CPU 內部,所以它的讀寫速度要比內存快得多。
- 在寄存器和內存之間,還有一層存儲介質叫緩存(Cache)。緩存也在 CPU 內部,訪問速度比寄存器慢,比內存快。對于程序而言緩存是透明的,不可操作。
- 寄存器與內存關系:
- 寄存器和內存是計算機體系結構中的兩種基本存儲資源,它們在程序執行和數據處理中扮演著不同但互補的角色。
- 寄存器是 CPU 內部的一小部分高速存儲資源,其訪問速度遠遠快于主存(RAM)。內存則作為計算機的主要存儲介質,容量較大但訪問速度較慢。
- 寄存器用于暫存指令、數據和地址,供 CPU 快速處理。內存則用于存儲程序的指令代碼、大量數據和中間計算結果。
- 寄存器可以被 CPU 直接訪問,而內存則需要通過地址總線間接訪問。
- 寄存器的數據寬度通常是固定的,如 32 位或 64 位,而內存可以存儲任意大小的數據。
- 寄存器和內存之間的數據交換是通過數據總線進行的。CPU 使用 LOAD 和 STORE 指令將數據從內存加載到寄存器,或從寄存器存儲到內存。
- 寄存器作為 CPU 內部的快速存儲資源,經常用于暫存從內存中讀取的數據或指令,以及待寫入內存的數據;所以寄存器和內存之間的關系就是傳遞這幾種類型的數據,以便于
CPU 進行計算。
- 寄存器與匯編語言:
- 匯編語言是一種用于電子計算機、微處理器、和其他可編程設備低級編程的編程語言。它是機器語言的文本表示形式,幾乎與機器碼一一對應,但提供了一些助記符來增強可讀性。
- 匯編語言提供了直接操作 CPU 寄存器的能力。程序員可以通過匯編指令來控制寄存器中的數據,進行加載、存儲、算術運算、邏輯運算等操作。
- 匯編語言中的每條指令通常都直接映射到 CPU 的指令集架構上。這意味著匯編語言中的指令直接體現了 CPU 能夠對寄存器執行的操作。
- 在匯編層面,函數參數和返回值通常通過寄存器傳遞,以減少內存訪問的開銷。
- 不同的 CPU 架構有不同的寄存器集和專用寄存器,匯編語言允許程序員利用這些特性來編寫高效的代碼。
- 通用寄存器:
- 通用寄存器是一組用于存儲數據和地址的寄存器,它們在處理程序中扮演著核心角色。
- 作用
- 通用寄存器用于存儲臨時數據、計算結果和變量;
- 在函數調用時,前幾個參數通常通過 X0 到 X7 寄存器傳遞。返回值通常存儲在 X0 寄存器中;
- 通用寄存器參與算術(如加、減、乘、除)和邏輯(如 AND、OR、NOT、XOR)運算;
- 寄存器用于提供內存訪問指令中的基地址、偏移量或索引;
- 某些通用寄存器(如 X8 到 X17)可以作為調用者保存的寄存器,在函數調用中保持不變,或用于存儲局部變量;
- 雖然 AArch64 沒有單獨的狀態寄存器,但通用寄存器可以用于存儲和傳遞狀態信息,如條件標志;
- 通用寄存器用于存儲系統調用的編號和參數,以及在異常或中斷處理中保存上下文;
- 大多數A64指令都在寄存器上操作。AArch64架構提供了31個通用寄存器。每個寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。這是查看同一寄存器的兩種不同方式。例如,下邊這個寄存器圖顯示W0是X0的低32位,W1是X1的低32位。
- 每個通用寄存器都是 64 位寬,這意味著它們可以存儲 64 位(8 字節)的整數數據。
- x0 - x30 是31個通用整形寄存器。每個寄存器可以存取一個64位大小的數。 當使用 x0 - x30 訪問時,它就是一個64位的數。當使用 w0 - w30 訪問時,訪問的是這些寄存器的低32位。
- 對于數據處理指令,X或W的選擇決定了操作的size。使用X寄存器將導致64位的計算,使用W寄存器將導致32位的計算。
- 32位整數加法:
ADD W0, W1, W2
- 64位整數加法:
ADD X0, X1, X2
- 其他寄存器:
- 零寄存器:XZR和WZR,總是讀取為0并忽略寫入。XZR是64位的零寄存器,WZR是32位的零寄存器。
- 棧指針(stack pointer,SP)寄存器:棧指針寄存器是實現程序的運行時棧管理的關鍵組件,對于維護程序的執行流程和狀態管理至關重要。
- 鏈接寄存器(Link Register,LR):在計算機體系結構中是一個專用寄存器,主要用于存儲函數調用的返回地址;在 AArch64 架構中,LR 通常被命名為 X30,而在其他架構中,它可能是一個單獨的寄存器。
- 程序計數器(PC):是 cpu 內部一個特殊的寄存器,程序計數器是 CPU 執行指令的基礎,它確保了指令能夠按正確的順序被取出和執行。
- 浮點寄存器:
- AArch64架構引入了SIMD(Single Instruction, Multiple Data)操作,通過矢量寄存器(Vector Registers)來支持高級的浮點運算和數據處理;
- AArch64提供了32個128位寬的浮點寄存器,編號從V0~V31;
- 每個浮點寄存器都是128位寬,足以存儲兩個64位的雙精度浮點數或四個32位的單精度浮點數;
- NEON 寄存器:
- 128 位寬,與浮點寄存器重疊使用,編號從 Q0 ~ Q31;
- AArch64 架構的 SIMD 指令集稱為 NEON。NEON 寄存器(Q0 到 Q31)實際上是浮點寄存器的另一種視圖,用于訪問 SIMD 功能。
- 在 AArch64(ARMv8-A)架構中,浮點寄存器和 NEON 寄存器實際上是同一組寄存器,它們共用相同的物理寄存器集合,但是以不同的方式使用和訪問。
- AArch64 提供了一組共用的 128 位寄存器,用于浮點和 SIMD(單指令多數據)操作。
- NEON 是 ARM 的 SIMD 指令集,用于處理向量運算。NEON 寄存器用于 SIMD 操作,可以對多個數據元素執行并行操作。
- SVE 寄存器:
- 在 AArch64 架構中,Scalable Vector Extension(SVE)引入了新的寄存器類型,這些寄存器與傳統的通用寄存器和浮點寄存器不同。
- SVE引入了可變長度的矢量寄存器,這些寄存器可以從128位擴展到2048位,以適應不同的計算需求;
- SVE寄存器(Z0-Z31)在低位與AArch64的SIMD&FP寄存器(V0-V31)共享硬件資源,但SVE提供了更高級的SIMD功能和更大的數據處理能力;
- 在 ARMv9 架構上發布的 SVE2 是 SVE 指令集的超集和擴展,提供了更多的指令和特性。
- 系統寄存器:
- 控制 CPU 的各種系統級功能和行為;
- 系統寄存器不能直接用于數據處理或load/store指令。相反,需要將系統寄存器的內容讀入通用寄存器X,對其進行操作,然后將其寫回系統寄存器。有兩個專門用來訪問系統寄存器的指令MRS和MSR。
- 主要的系統寄存器:
- 系統控制寄存器:SCTLR_ELx,用于控制系統行為,如緩存、頁表遍歷等;
- 內存管理寄存器:TTBR0_ELx / TTBR1_ELx、TCR_ELx、VTTBR_EL2;
- 異常鏈接寄存器:ELR_ELx;
- 保存處理狀態寄存器:SPSR_ELx;
- 中斷控制寄存器:DAIF、ICC_*;
- 性能計數器寄存器:
- 電源管理控制寄存器:
- 虛擬化控制寄存器:
- 安全控制寄存器:SCR_EL3
- 調試和跟蹤控制寄存器
- 系統寄存器訪問控制
- 浮點控制寄存器:FPCR
- 系統寄存器命名:系統寄存器通常帶有 _ELx 后綴,其中 x 表示異常級別(如 EL1、EL2、EL3)
數據處理指令
- 算術運算指令:
- 加法:ADD、ADDS、ADDG
- 減法:SUB、SUBS、SUBP、SUBG、SUBPS 等
- 乘法:MUL、MADD、MNEG等
- 除法:UDIV、SDIV等
- 邏輯運算指令:
- 邏輯與:AND
- 邏輯或:ORR
- 邏輯異或:EOR
- 位清除:BIC
- 移位運算指令:
- 邏輯左移:LSL
- 邏輯右移:LSR
- 算術右移:ASR
- 循環右移:ROR
- 比較指令:
- 比較:CMP
- 負向比較:CMN
- 浮點操作指令:浮點操作遵循與整數數據處理指令相同的格式,并使用浮點寄存器。與整數數據處理指令一樣,操作的大小決定了所使用的寄存器的大小。浮點指令的operation總是以 F 開頭。
- 浮點加法:FADD
- 浮點減法:FSUB
- 浮點乘法:FMUL
- 浮點除法:FDIV
- 浮點平方根:FSQRT
數據加載與存儲指令
在 AArch64 架構中,數據加載與存儲指令用于在處理器和內存之間移動數據。
- 加載寄存器:
- LDR: 從內存中加載數據到寄存器。它可以用于加載字節、半字、字或雙字數據。
- 存儲寄存器:
- STR: 將數據從寄存器存儲到內存。與 LDR 相對應,它也可以用于存儲不同大小的數據。
c++ 中使用匯編方法
- 內聯匯編
- 外部匯編文件
- 內聯匯編與 c++混用
- 使用宏定義