ARM aarch64彙編學習筆記(三):寄存器概述

ArmV8 寄存器簡單概念:

ARMv8擁有兩種執行模式:
AArch64執行A64指令,使用64bit的通用寄存器;
AArch32執行A32/T32指令,使用32bit的通用寄存器;

本篇主要描述aarch64執行模式的一些概念

OverView

寄存器類型 位寬 描述
X0-X30 64bit 通用寄存器,也可以用作32bit(w0-w30)
PLR(X30) 64bit produce link register, 連接寄存器,保存跳轉返回信息地址
SP_ELx(x=0,1,2,3) 64bit stack pointer registers,堆棧指針寄存器
ELR_ELx(x=1,2,3) 64bit exception link registers,異常鏈接寄存器,當發生異常時,目標異常級別的異常鏈接寄存器存儲在異常處理完成後跳轉到的返回地址
SPSR_ELx(x=1,2,3) 32bit saved program status registers, 保存進入ELx的PSTATE狀態信息
V0-V31 128bit 浮點寄存器,主要用於向量或標量的SIMD操作, 也可以用作32個64bit D0-D31或32個32bit S0-S31 或32個 16bit H0-h31 或 32個8bit B0-B31
PC 64bit 程序計數器,俗稱PC指針,總是指向即將要執行的下一條指令

PSTATE不是一個寄存器,是保存當前PE狀態的一組寄存器統稱,其中可訪問寄存器有:PSTATE.{NZCV,DAIF,CurrentEL,SPSel},屬於ARMv8新增內容,64bit下代替CPSR

注:
沒有名爲X31或W31的寄存器。 一些指令被編碼了,以使數字31代表零寄存器ZR(WZR / XZR)。 還有一組受限制的指令,其中一個或多個參數被編碼,以使數字31代表堆棧指針(SP).

Exception levels:
ARMv8定義了四種異常類型, EL0-EL3, 級別依次從低到高。
這裏寫圖片描述
EL0爲普通用戶程序
EL1是操作系統內核相關
EL2是Hypervisor, 可以理解爲上面跑多個虛擬OS
EL3是Secure Monitor(ARM Trusted Firmware)

link registers:
鏈接寄存器(LR)在進行子程序調用時存儲返回地址。如果返回地址存儲在堆棧中,它也可以用作通用寄存器, LR會映射到寄存器X30.
有三個異常鏈接寄存器,ELR_EL1,ELR_EL2和ELR_EL3,對應3個異常級別。當發生異常時,目標異常級別的異常鏈接寄存器存儲在異常處理完成後跳轉到的返回地址。如果異常取自AArch32狀態,則ELR中的前32位都設置爲零。異常級別內的子程序調用使用LR存儲子程序的返回地址。
例如,當異常級別從EL0更改爲EL1時,返回地址存儲在ELR_EL1中。
在異常級別中,如果啓用使用相同異常級別的中斷,則必須確保將ELR存儲在堆棧中,因爲在執行中斷時將使用新的返回地址覆蓋它。

stack pointer registers:
堆棧指針(SP)是一個指向堆棧頂部的寄存器。 選擇使用的堆棧指針在某種程度上與“異常”級別是分開的。 默認情況下,發生異常時會爲目標異常級別選擇堆棧指針(SP_ELn)。 例如,發生EL1異常時選擇SP_EL1。 每個異常級別都有自己的堆棧指針。

但是,當在AArch64中,異常級別的不是E0時,處理器可以使用下面中的任何一種:
與該異常級別(SP_ELn)關聯的64位堆棧指針,或者,
與EL0(SP_EL0)關聯的堆棧指針。 EL0只能訪問SP_EL0。
SP不能被大多數指令引用。 但是,一些算術指令,例如ADD指令,可以讀寫當前的堆棧指針來調整函數中的堆棧指針。 例如:

ADD SP, SP, #0x10          // 將SP調整爲當前值之前的0x10字節
ADD SP, SP, #256           // SP = SP + 256

saved program status registers:
當異常發生時,PSTATE在SPSR裏面保存。
這裏寫圖片描述
N:負於或小於
Z:零
C:進位或借位或擴展
V:溢出

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