Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ARM寄存器R10和R11上的Go限制_Go_Assembly_Arm - Fatal编程技术网

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

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值,然后在最后加载它

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

  • 寄存器R10和R11由编译器和链接器保留
  • R10指向g(goroutine)结构。在汇编程序源代码中,这个指针必须称为g;无法识别名称R10
  • 手写程序集可以使用R11,但这样做需要确保链接器没有使用它来实现函数中的任何其他指令
我正在寻找的ASM端口使用
R10
R11
,因此我的问题如下:

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

您不应触摸
R10
,以防您的代码被抢占或出现恐慌。我相信导游对这一点很清楚


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

忽略恐慌案例,如果我尝试使用
go:nosplit
阻止抢占行为,会怎么样?@LiamKelly您无法阻止抢占
go:nosplit
对汇编函数没有任何作用(尽管在
TEXT
指令中放置
nosplit
会起作用),但无论如何,这是一种危险的做法。