登录
首页 >  Golang >  Go问答

Go 对 ARM 寄存器 R10 和 R11 的限制

来源:stackoverflow

时间:2024-04-06 13:36:33 259浏览 收藏

目前golang学习网上已经有很多关于Golang的文章了,自己在初次阅读这些文章中,也见识到了很多学习思路;那么本文《Go 对 ARM 寄存器 R10 和 R11 的限制》,也希望能帮助到大家,如果阅读完后真的对你学习Golang有帮助,欢迎动动手指,评论留言并分享~

问题内容

我希望将高度优化的加密 ASM 实现移植到 Go ASM。关于 Go Arm Assembly 的唯一文档是快速指南,其中提到了以下内容:

  • 寄存器 R10 和 R11 由编译器和链接器保留。
  • R10 指向 g(goroutine)结构。在汇编源代码中,该指针必须被称为 g;无法识别名称 R10。
  • 手写汇编可以使用 R11,但这样做需要确保链接器不会同时使用它来实现函数中的任何其他指令。

我要移植的 ASM 使用 R10R11 所以我的问题如下:

  • 我可以使用 R10/g 吗?
  • 如果我使用R10/g,只要我在调用开始时将R10值存入堆栈,然后在最后加载它,会不会有问题? (假设go:nosplit用于阻止抢占行为)
  • 只要我不从 Go ASM 调用任何其他函数,那么我就不必担心 R11 上的链接器限制,对吗?

解决方案


您不应触摸 R10,例如您的代码被抢占或发生恐慌。我相信指南对此非常清楚。

R11 被链接器用来合成一些指令,例如对全局变量的引用。最好通过汇编然后反汇编代码来检查是否使用了 R11。在反汇编中,链接器引入的对 R11 的任何引用都应该可见。

以上就是《Go 对 ARM 寄存器 R10 和 R11 的限制》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>