【发布时间】:2012-05-19 04:38:57
【问题描述】:
我正在尝试将四个以上的参数从我的 C++ 代码传递给 Assembly。
C++ 函数如下所示:
static float armFunction(float, float, float, float, float);
我可以毫无问题地从寄存器 r0-r3 中检索前四个参数。
我希望我的第五个浮点参数在堆栈上,我应该能够使用堆栈指针 sp 访问它,例如我尝试在 r4 中加载我的第五个参数:
ldr r4, [sp]
甚至:
ldr r4, [sp, #-0x4]
但这不起作用,汇编代码会立即退出,并输出一些堆栈损坏输出。
我的完整汇编代码如下所示:http://pastie.org/3933875
【问题讨论】:
-
通常最简单的正确方法是编写一个简单的 C 函数,然后对其进行编译和反汇编。 Presto - 即时示例代码。
-
我会简单地使用带有参数名称的inline assembler。
-
您好,卡尔,感谢您的想法。我用五个参数反汇编了我的简单 C 函数,看起来带有 NDK 的 gcc 编译器没有将第 5 个参数添加到堆栈中。它只加载前四个参数,而对于 assmlby 函数,第五个参数完全被忽略。这不是很令人惊讶吗?在这里查看反汇编代码pastie.org/3934223
-
仔细看。您的第 5 个参数在 ip 中设置(第 15 和 22 行),然后存储在第 27 行的堆栈中。
-
另外,ldr r4, [sp, #-0x4] 将永远无法工作。你的堆栈从上到下增长,所以你的值要么在堆栈指针上,要么在它之上。
标签: android gcc assembly java-native-interface arm