[architecture]-ARMV8的The current Program Counter (PC)介绍

快速链接:
.
👉👉👉 个人博客笔记导读目录(全部) 👈👈👈

在这里插入图片描述

术语:PC-relative address – pc相对地址

1、The current Program Counter (PC)介绍

The current Program Counter (PC)不能当作通用寄存器,因此也不能用作算术指令的源或目标,或用作加载/存储指令的基址、索引或传输寄存器。

  • 读取 PC 的方法是:PC 相对地址的指令(ADR, ADRP, literal load, and direct branches),以及branch-and-link指令(BL 和 BLR)
  • 修改程PC的方法是使用显式控制流指令:条件分支、无条件分支、异常生成和异常返回指令

在 PC 被指令读取以计算 PC 相对地址的情况下,它的值是指令的地址,即与 A32 和 T32 不同,没有 4 或 8 字节的隐含偏移量。

原文:
在这里插入图片描述

2、adrp和adr

adrp地址读取指令,它将基于PC的相对偏移的地址读到目标寄存器中
ADR指令
使用格式:adr register exper

编译时,首先会计算出当前PC到exper的偏移量#offset_to_exper
然后会用ADD或SUB指令,来替换这条指令;例如等效于:ADD register,PC,#offset_to_exper
register就是exper的地址;

ADRP指令
使用格式:adrp register exper

编译时,首先会计算出当前PC到exper的偏移量#offset_to_exper
pc的低12位清零,然后加上偏移量,给register
得到的地址,是含有label的4KB对齐内存区域的base地址;

3、使用示例

(1)、以下演示读取PC指针示例,使用adr、adrp指令,就可以等效于armv7及其之前的mov x0 pcmov x0 r15指令
在这里插入图片描述
(2)、而对于修改PC的值(或者说跳转),在armv8 aarch64已经没有mov pc x0这样的之类。如果想跳转,可以通过b bl br blr eret这样的之类进行.
这里我们也举一个实例,在MTK平台LK跳转Kernel的过程,就是使用了产生异常和异常返回的方法(smc和eret): LK调用smc跳转到ATF,ATF调用eret返回到Kernel

  • LK跳转ATF的实现如下:
    在这里插入图片描述

  • ATF返回的Kernel的实现如下:
    在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arm精选

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值