我有一个使用C类型struct作为参数的ARM Neon函数。
我在该结构中有一个固定大小的float*
和float[]
数组。我可以在汇编函数中访问float*
个元素。但是当我尝试访问数组元素时,我的程序崩溃了。
这是我的C面应用程序:
typedef struct{
float* f1;
float* f2;
float f3[4];
}P_STRUCT;
main.c文件:
extern void myNeonFunc(P_STRUCT* p, float* res);
P_STRUCT p;
// memory allocation for f1,f2 and fill array f3 here.
// memory allocation for res
myNeonFunc(&p, res);
这是我的.S文件:
.text
.set P_STRUCT_F1, 0 @ float* f1
.set P_STRUCT_F2, 4 @ float* f2
.set P_STRUCT_F3, 8 @ float f3[4]
.globl myNeonFunc
@ void myNeonFunc (P_STRUCT* p ----> r0, r1 )
.balign 64 @ align the function to 64
myNeonFunc:
@save callee-save registers here
ldr r8, [r0,P_STRUCT_F1] @ r8 <- f1
add r8, r8, #8 @ r8 points to the f1[2] (2*4 = 8 )
ldr r9, [r0,P_STRUCT_F2] @ r9 <- f2
add r9, r9, #4 @ r9 points to the f2[1] (1*4 = 8)
ldr r10, [r0,P_STRUCT_F3] @ r10 <- f3
add r10, r10, #4 @ r10 points to the f3[1] (1*4 = 8)
vld1.f32 {d4}, [r8]! @ d4 now contains the corresponding r8 value
vld1.f32 {d6}, [r9]! @ d6 now contains the corresponding r9 value
vst1.32 {d4}, [r1]! @ store f1[2] value in result register
vst1.32 {d6}, [r1]! @ store f1[1] value in result register
// every thing is ok up to here
// this line probably causes seg fault !!!
vld1.f32 {d8}, [r10]! @ d8 now contains the corresponding r10 value
//
vst1.32 {d8}, [r1]! @ store f3[1] value in result register
// epilog part here ...
此问题可能是因为r10
未指向f3
数组的地址。(可能)
现在我的问题是为什么访问固定大小的数组会导致访问指针元素时出现问题。那是什么解决方案。
答案 0 :(得分:1)
指针与数组不同。 f1
和f2
是结构中的4个字节指针。 f3
是结构中的16字节数组。整个结构长度为24个字节。
您加载到r10
的内容是f3
的第一个元素。如果您想将r10
设置为&f3[0]
,请将r10
设置为r0
+ P_STRUCT_F3
。