【问题标题】:Go restrictions on ARM registers R10 and R11Go 对 ARM 寄存器 R10 和 R11 的限制
【发布时间】:2021-04-13 12:28:11
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: go assembly arm


    【解决方案1】:

    您不应触摸R10,以防万一。您的代码被抢占或发生恐慌。我相信指南对此很清楚。

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

    【讨论】:

    • 忽略恐慌情况,如果我尝试使用 go:nosplit 防止抢占行为怎么办?
    • @LiamKelly 您无法阻止抢占。 go:nosplit 不会对汇编函数做任何事情(尽管在 TEXT 指令中放置 NOSPLIT 会),但无论如何都是红鲱鱼。
    猜你喜欢
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多