ARM寄存器R10和R11上的Go限制
我希望移植一个高度优化的加密ASM实现到ASM。关于Go-Arm组件的唯一文档是,其中提到了以下内容:ARM寄存器R10和R11上的Go限制,go,assembly,arm,Go,Assembly,Arm,我希望移植一个高度优化的加密ASM实现到ASM。关于Go-Arm组件的唯一文档是,其中提到了以下内容: 寄存器R10和R11由编译器和链接器保留 R10指向g(goroutine)结构。在汇编程序源代码中,这个指针必须称为g;无法识别名称R10 手写程序集可以使用R11,但这样做需要确保链接器没有使用它来实现函数中的任何其他指令 我正在寻找的ASM端口使用R10和R11,因此我的问题如下: 我可以使用R10/g吗 如果我使用R10/g,只要我在堆栈调用的开始处存储R10值,然后在最后加载它
- 寄存器R10和R11由编译器和链接器保留
- R10指向g(goroutine)结构。在汇编程序源代码中,这个指针必须称为g;无法识别名称R10
- 手写程序集可以使用R11,但这样做需要确保链接器没有使用它来实现函数中的任何其他指令
R10
和R11
,因此我的问题如下:
- 我可以使用R10/g吗
- 如果我使用R10/g,只要我在堆栈调用的开始处存储R10值,然后在最后加载它,就会有任何问题吗?(假设
用于停止抢占行为)go:nosplit
- 只要我没有从Go ASM调用任何其他函数,那么我就不必担心R11上的链接器限制,对吗
R10
,以防您的代码被抢占或出现恐慌。我相信导游对这一点很清楚
R11
被链接器用来合成一些指令,例如对全局变量的引用。最好通过组装然后分解代码来检查是否使用了R11
。在反汇编中,链接器引入的对R11
的任何引用都应该是可见的。忽略恐慌案例,如果我尝试使用go:nosplit
阻止抢占行为,会怎么样?@LiamKelly您无法阻止抢占go:nosplit
对汇编函数没有任何作用(尽管在TEXT
指令中放置nosplit
会起作用),但无论如何,这是一种危险的做法。