【发布时间】:2010-09-29 16:13:44
【问题描述】:
我有一个 C 函数,其中有 4 个指针,每个指针指向大型 2D 浮点数组的不同位置。
因为 ARM 汇编函数只能传递 4 个参数 (r0 - r3),我无法理解如何将指针传递给我的返回值,这将成为我的汇编函数的第 5 个参数。
所以,为了克服这个问题,我想将所有 4 个指针放入一个指针数组中,这样我将有 3 个空闲点,使用它们我也可以将指针传递给我的返回值。
但是,我不知道如何从汇编函数内部的指针数组中提取四个单独的指针。我的尝试失败了。
这是我正在尝试做的一个示例。
程序
#include<stdio.h>
void _my_arm_asm(float32_t *);
float32_t data_array[100][100];
void main()
{
float32_t *ptr1, *ptr2, *ptr3, *ptr4;
ptr1 = \\ data_array[value] + (some value);
ptr2 = \\ data_array[value] + (some other value);
ptr3 = \\ data_array[value] + (some other value);
ptr4 = \\ data_array[value] + (some other value);
float32_t *array_pointers[4];
array_pointers[0] = ptr1;
array_pointers[1] = ptr2;
array_pointers[2] = ptr3;
array_pointers[3] = ptr4;
float32x4_t result;
_my_arm_asm(array_pointers, &result);
....
....
....
return 0;
}
.text
.global _my_arm_asm
_my_arm_asm:
#r0: Pointer to my array of pointers
#r1: Pointer to my result
push {r4-r11, lr}
# How to access the array of pointers?
# I previously tried this, is this the right way to do it?
# mov r4, #0
# vld4.32 {d0, d1, d2, d3}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d4, d5, d6, d7}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d8, d9, d10, d11}, [r0, r4]
# add r4, r4, #1
# vld4.32 {d12, d13, d14, d15}, [r0, r4]
....
....
....
pop {r4-r11, pc}
【问题讨论】:
-
你应该展示你在组装方面的尝试。
-
遇到此类问题时,最好的方法是用 C 编写一个存根函数,然后使用
gcc -S将其编译为汇编源代码 - 然后您可以使用生成的汇编源代码作为模板你的功能。
标签: c arrays pointers assembly arm