【问题标题】:pass parameters from C++ to Assembly in android将参数从 C++ 传递到 android 中的程序集
【发布时间】: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


【解决方案1】:

我的 asm 代码从 C 到 asm 的 JNI 调用中读取第 5 个参数没有问题。这是我的 asm 函数的前 2 行:

  stmfd    sp!,{r4-r12,lr}
  ldr      r12,[sp,#40]   @ first stack variable

如果您不需要保留任何寄存器,则第 5 个参数位于堆栈顶部:

  ldr r12,[sp]

【讨论】:

  • 我更喜欢先从堆栈中移动堆栈变量其余的寄存器....
  • 我复制的代码确实需要保存寄存器,我只推送/弹出必要的最小值。
【解决方案2】:

您的代码的问题是修改 r4 而不恢复它。参数在栈顶。

【讨论】:

  • 为什么修改 r4 是个问题?该寄存器中有什么重要的东西会破坏堆栈或程序计数器 PC 吗?
  • R0-R3 和 R12 可以丢弃,R4-R11,R13 必须保留
猜你喜欢
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2016-04-12
  • 2017-08-28
  • 1970-01-01
相关资源
最近更新 更多