全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

Arm64程序调用通用寄存器的使用方法

时间:2023-07-28 11:28

人气:

作者:admin

标签: 程序 

导读:下面是Arm64程序调用标准规定的通用寄存器的使用方法。 参数寄存器(X0-X7) 函数参数数量小于等于8个时,使用X0-X7传递,大于8个时,多余的使用栈传递,函数返回时返回值保存在X0中...

下面是Arm64程序调用标准规定的通用寄存器的使用方法。

参数寄存器(X0-X7) 函数参数数量小于等于8个时,使用X0-X7传递,大于8个时,多余的使用栈传递,函数返回时返回值保存在X0中。

调用者保存的临时寄存器(X9-X15)调用者若使用到了X9-X15寄存器,在调用子函数之前,需要将X9-X15寄存器保存到自己的栈中,子函数使用这些寄存器的时候不需要保存和恢复。

被调用者保存的寄存器(X19-X29) 被调用者若使用到这些寄存器,需要将其保存到自己的栈中,返回时从栈中恢复。

特殊用途的寄存器

X8是间接结果寄存器。用于传递间接结果的地址位置,例如,函数返回一个大结构。

X16-X17过程内调用暂存寄存器。。

X18平台寄存器。

X29是栈帧(FP)寄存器。保存了调用函数的栈帧地址。

X30保存了返回地址(LR)。函数返回后跳转到该地址处运行。

图片

实例下图是内核Oops时打印出的信息。第一张图片是寄存器信息,pc寄存器和sp寄存器对栈回溯有重要作用。第二张图是内核线程irq/231-dwc3栈数据的二进制转储,栈回溯就是在这些二进制数据中找到栈帧,从而找到调用的函数地址。

图片图片

下图是内核栈回溯的结果,发生异常函数的地址保存在异常栈中,不在内核线程irq/231-dwc3栈中。

图片

发生异常的函数可以根据pc寄存器得到,该函数是栈回溯的第一个函数。sp寄存器指向了第一个栈帧中的FP1寄存器,即0xffffffc0ee823b80地址,FP1向高地址偏移8字节得到LR1寄存器,即0xffffff80087369e4地址,该地址位于dwc3_ep0_stall_and_restart函数内,该函数是栈回溯的第二个函数。FP1指向了第二个栈帧的FP2,根据栈帧找到LR2,依次类推。所有的栈帧最终如下图所示,总共找到7个栈帧,因此irq/231-dwc3内核线程发生异常时总共有8个函数调用,和内核输出的函数调用关系一致。需要注意的是,代码里调用了该函数,但在栈回溯中没有找到符号,肯定是编译器优化,将该函数内联了,是否内联可以通过反汇编确认。

图片

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信