我必须将参数压入堆栈以将参数传递给函数。但是,Android NDK编译器的clang(64位)始终使用sp
寄存器作为到达变量的基地址,而应使用x29
(基帧指针)。
我有ldr w11, [sp, #0x30]
,我想要ldr w11, [x29, #0x30]
。
这使我感到困扰,因为如果我将asm注入我的c代码sub sp, sp, x9
中以推送参数,则会打扰所有使用旧sp
的引用。
您知道为什么它不使用x29
吗,如果我可以强迫它这样做吗?
直到现在,我的想法是将参数写在sp
指针下而不移动它,完成后,在调用该函数之前将sp
移动。然后,将sp
恢复到原来的值。
我不确定在sp
下方写数据是一个好主意,您对此有何看法?
其他信息:有一个明显的复杂之处:无法安全访问架构sp下方(但在堆栈区域中)的内存。值得注意的是,此区域由异步执行(如中断)的信号处理程序使用。如果我们仅将sp复制到其他寄存器并开始将其用作(递减)堆栈指针,则我们的特殊堆栈区域最终将被破坏。 https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/using-the-stack-in-aarch64-implementing-push-and-pop