C ARM汇编:如何在ARM汇编函数中传递和使用指针数组

C ARM汇编:如何在ARM汇编函数中传递和使用指针数组,c,arrays,pointers,assembly,arm,C,Arrays,Pointers,Assembly,Arm,我有一个C函数,其中有4个指针,每个指针指向一个大的二维浮点数组的不同位置 由于ARM汇编函数只能通过4个参数r0-r3传递,因此我无法理解如何将指针传递到返回值,返回值将成为汇编函数的第5个参数 所以,为了克服这个问题,我想把所有的4个指针放到一个指针数组中,这样我就有3个空闲点,我也可以用它来传递一个指向返回值的指针 但是,我不知道如何从汇编函数中的指针数组中提取四个单独的指针。我的尝试失败了 这是我尝试做的一个例子 程序 第五个参数和其他参数假定int大小的参数在堆栈上传递。即,第五个参数

我有一个C函数,其中有4个指针,每个指针指向一个大的二维浮点数组的不同位置

由于ARM汇编函数只能通过4个参数r0-r3传递,因此我无法理解如何将指针传递到返回值,返回值将成为汇编函数的第5个参数

所以,为了克服这个问题,我想把所有的4个指针放到一个指针数组中,这样我就有3个空闲点,我也可以用它来传递一个指向返回值的指针

但是,我不知道如何从汇编函数中的指针数组中提取四个单独的指针。我的尝试失败了

这是我尝试做的一个例子

程序
第五个参数和其他参数假定int大小的参数在堆栈上传递。即,第五个参数可作为[SP]访问,第六个参数可作为[SP,4]访问,依此类推。有关详细说明,请阅读。
这就是说,您不必使用汇编来使用霓虹灯。检查哪些允许您使用普通C代码执行所有操作。

通常,如果向函数传递的参数超过4个,则多余的参数将在堆栈上传递

ARM EABI指定编译器应如何将参数传递给函数,它还指定调用方在函数调用中可以预期保持不变的寄存器。您的组装例程可以使用相同的技术,并且可能应该使用相同的技术,除非您有充分的理由不这样做。如果没有别的,那就意味着你的汇编函数可以很容易地从C中调用

第5章ARM体系结构过程调用标准的基本过程调用标准应该有确切的细节。从表面上看,它相当复杂,因为在对齐、参数大小等方面有很多细节,但我认为出于您的目的,它归结为函数get的第五个参数被推到了堆栈上

当然,正如您在问题中所建议的,您可以通过将4个指针打包到一个结构中并传递一个指向该结构的指针来避免所有这些-在您的汇编例程中,您只需将该结构指针加载到寄存器中,然后使用它来加载真正需要的指针

我认为臂组件可能看起来像:

                 // r0 has the 1st parameter
ldr r4, [r0]     // get array_pointers[0] into r4
// ...

ldr r5, [r0, #4] // get array_pointers[1] into r5
// ...

ldr r6, [r0, #8] // get array_pointers[2] into r6

您还可以使用“加载多个”指令一次获取所有4个指针,但是我不确定您注册的使用要求/限制可能是什么。

您应该展示您在汇编方面的尝试。当面临这种问题时,最好的方法是用C编写存根函数,然后用gcc-S将其编译到汇编程序源代码中,然后您可以使用生成的汇编程序源代码作为您的应用程序的模板Michael,是的,我按照你的建议做了,我将所有指针打包成一个结构,并将其传递给汇编函数,我可以使用ldr访问它们。
                 // r0 has the 1st parameter
ldr r4, [r0]     // get array_pointers[0] into r4
// ...

ldr r5, [r0, #4] // get array_pointers[1] into r5
// ...

ldr r6, [r0, #8] // get array_pointers[2] into r6