2016-05-14 107 views
0

访问数组元素时予选自C调用这样:分段故障在大会

calculate(&data[index + v], &data[i + v], &data[j + v], norm_1, norm_2, ps, remaining); 

在装配实现的功能,这是组件功能:

global calculate 

current_point_a  equ  8 
i_point_a   equ  12 
j_point_a   equ  16 
norm_1_a   equ  20 
norm_2_a   equ  24 
ps_a    equ  28 
counter    equ  32 

calculate: 


     push  ebp    
     mov   ebp, esp  
     push  ebx    
     push  esi 
     push  edi 
;------------------------------------------------------------ 

     mov   eax, [ebp+current_point_a]   
     movaps  xmm0, [eax]   ; HERE SEGMENTATION FAULT    
     movaps  xmm1, xmm0 

当我尝试访问一个数组元素通过它的地址传递给C函数,我有一个分段错误。

什么问题? 我需要从内存中取4个连续的数组元素。 我该如何解决它?

我在32位体系结构的Linux上使用GCC。

+0

不足以去一个。你是在编译x86(32位)还是x86-64(64位)。您在哪些操作系统上运行代码(Windows/Linux/OSX/etc)?如果你给出了一个[最小完整可验证示例](http://stackoverflow.com/help/mcve) –

+0

@lurker:第一个arg具有最低地址(返回地址之上的最小距离),所以'[ebp +8]'是32位调用约定中的第一个参数,它传递堆栈中的所有参数。 (@ Guiseppe:这是不能保证的,请参阅[x86 tag wiki](http://stackoverflow.com/tags/x86/info)中的ABI /调用约定信息。感谢您准确显示哪些指令错误,这对于asm调试,但是你没有说你正在使用哪个平台,所以我们不知道C编译器是如何通过参数的。 –

+0

@PeterCordes啊好的,谢谢你指出。 – lurker

回答

0

我相信这是因为你认为参数是通过堆栈传递的,这并不总是正确的。不同编译器在不同平台上使用多个calling conventions。说,System V convention(在Linux上使用)通过寄存器传递一些参数。

很难说在你的情况下应该使用什么,因为它取决于操作系统,编译器和编译标志。如果您使用GCC,您可以通过将-S标志传递给编译器来查看C的程序生成的汇编代码,并查看自己如何传递参数。