【发布时间】:2021-04-13 12:28:11
【问题描述】:
我希望将高度优化的加密 ASM 实现移植到 Go ASM。关于 Go Arm Assembly 的唯一文档是 Quick Guide,其中提到了以下内容:
- 寄存器 R10 和 R11 由编译器和链接器保留。
- R10 指向 g(goroutine)结构。在汇编源代码中,该指针必须称为 g;无法识别名称 R10。
- 手写程序集可以使用 R11,但这样做需要确保链接器不会同时使用它来实现函数中的任何其他指令。
我要移植的 ASM 使用 R10 和 R11,所以我的问题如下:
- 我可以使用 R10/g 吗?
- 如果我使用R10/g,只要在调用开始时将R10的值存入栈,然后在最后加载,会不会有问题? (假设
go:nosplit用于阻止抢先行为) - 只要我不从 Go ASM 调用任何其他函数,我就不必担心 R11 的链接器限制,对吗?
【问题讨论】: