Assembly ARM64/Android:编译器使用SP而不是X29作为基本帧指针

Assembly ARM64/Android:编译器使用SP而不是X29作为基本帧指针,assembly,android-ndk,inline-assembly,arm64,Assembly,Android Ndk,Inline Assembly,Arm64,我必须在堆栈上推送参数以将参数传递给函数。然而,Android NDK编译器的clang(64位)始终使用sp寄存器作为基址来访问变量,而它应该使用x29(基址帧指针) 我有ldrw11[sp,#0x30],我想要ldrw11[x29,#0x30] 这让我很烦恼,因为如果我将asm注入我的c代码子sp,sp,x9以推送参数,我会干扰所有使用旧的sp的引用 您知道它为什么不使用x29,以及我是否可以强制它这样做吗 到目前为止,我的想法是在sp指针下写入参数,而不移动指针,完成后,在调用函数之前移动

我必须在堆栈上推送参数以将参数传递给函数。然而,Android NDK编译器的clang(64位)始终使用
sp
寄存器作为基址来访问变量,而它应该使用
x29
(基址帧指针)

我有
ldrw11[sp,#0x30]
,我想要
ldrw11[x29,#0x30]

这让我很烦恼,因为如果我将asm注入我的c代码
子sp,sp,x9
以推送参数,我会干扰所有使用旧的
sp
的引用

您知道它为什么不使用
x29
,以及我是否可以强制它这样做吗

到目前为止,我的想法是在
sp
指针下写入参数,而不移动指针,完成后,在调用函数之前移动
sp
。在将sp恢复到其旧值之后

我不太确定在
sp
下面写数据是个好主意,你觉得怎么样

其他信息:有一个值得注意的复杂问题:无法安全访问架构sp下的内存(但位于堆栈区域)。值得注意的是,该区域由异步执行(如中断)的信号处理程序使用。如果我们只是将sp复制到其他寄存器,并开始将其用作(递减)堆栈指针,那么我们的特殊堆栈区域最终将被破坏


在优化代码中,通常不使用帧指针。有时可以使用
-fno省略帧指针将其关闭,但这不能保证工作正常。这听起来像是个XY问题。若你们只是把东西注入到编译器生成的代码中,那个么你们使用汇编是错误的。谢谢,我想你们是对的。我更喜欢直接在汇编中开发,而不是将其注入c。问题是AndroidStudio不提供汇编调试器,这就是为什么我决定用c编写所有代码,并仅在必要时注入汇编。我已经实现了上面提到的我的想法,它现在似乎可行,但我不是很有信心。假设您使用了“扩展”内联asm,您是否在clobber列表中指定了
sp