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和adradrp地址读取指令,它将基于PC的相对偏移的地址读到目标寄存器中
ADR指令使用格式:adr register exper
编译时,首先会计算出当前PC到exper的偏移量#offsettoexper 然后会用ADD或SUB指令,来替换这条指令;例如等效于:ADD register,PC,#offsettoexper register就是exper的地址;
ADRP指令使用格式:adrp register exper
编译时,首先会计算出当前PC到exper的偏移量#offsettoexper pc的低12位清零,然后加上偏移量,给register 得到的地址,是含有label的4KB对齐内存区域的base地址;
3、使用示例
(1)、以下演示读取PC指针示例,使用adr、adrp指令,就可以等效于armv7及其之前的 mov x0 pc或 mov x0 r15指令
(2)、而对于修改PC的值(或者说跳转),在armv8 aarch64已经没有 mov pc x0这样的之类。如果想跳转,可以通过b bl br blr eret这样的之类进行。
原作者:代码改变世界ctw