ARMv8中的一些重要寄存器

举报
Qmiller 发表于 2022/05/06 11:37:32 2022/05/06
【摘要】 AArch64执行状态提供了31×64位的通用寄存器,可以在任何时候和所有异常级别下访问。每个寄存器的宽度为64位,它们通常被称为寄存器X0-X30。 通用寄存器除了用于标准运算和存储之外,还在函数调用过程中有特殊作用:

AArch64执行状态提供了31×64位的通用寄存器,可以在任何时候和所有异常级别下访问。每个寄存器的宽度为64位,它们通常被称为寄存器X0-X30。

通用寄存器除了用于标准运算和存储之外,还在函数调用过程中有特殊作用:

  • X0~X7

    传递参数和结果

  • X8~X15

    X8:间接结果寄存器

    X9~X15:临时寄存器

  • X16~X18

    ARM平台寄存器

    X16:IP0;

    X17:IP1;

    X18:PR

  • X19~X28

    被调用函数需要保存

  • X29~X30

    X29:FP栈帧寄存器

    X30:链接寄存器

X表示64位通用寄存器,而W表示低32位的数据,例如W0表示X0的低32位。

image-20220504083209610

PSTATE寄存器

AArch64没有直接等同于ARMv7的当前程序状态寄存器(CPSR)。在AArch64中,传统的CPSR的组件是作为字段提供的,可以独立访问。这些被统称为处理器状态(PSTATE)。

AArch64的处理器状态或PSTATE字段有以下定义:

image-20220504083805055 image-20220504083844493

特殊寄存器

除了31个通用寄存器,还提供了多个特殊寄存器。如下图所示,接下来我们会重点介绍其中几个寄存器。

image-20220504084739084

零寄存器

ARMv8有两个0寄存器,分别是WZR和XZR。零寄存器内容为0,可以作为源寄存器,也可以作为目的寄存器。

PC寄存器

PC用来指向当前运行指令的下一条指令的地址。

SP寄存器

每个异常等级都有一个SP寄存器,EL0中的SP可以当做临时寄存器,例如Linux中存放task_struct结构。

CurrentEL寄存器

表示PSTATE中的EL字段,即当前的异常等级。

SPSR寄存器

SPSR保存处理状态寄存器,当发生异常时,处理器状态被存储在相关的保存程序状态寄存器(SPSR)中,其方式类似于ARMv7中的CPSR。SPSR在发生异常之前持有PSTATE的值,在执行异常返回时用于恢复PSTATE的值。SPSR_X表示不同处理器模式下的SPSR寄存器。

![image-20220504091725294](/Users/lzm/Library/Application Support/typora-user-images/image-20220504091725294.png)

ELR寄存器

存放了异常返回地址。

SPSel寄存器

在SP_EL0和SP_ELn中选择SP寄存器。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。