2016-05-14 106 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的程序生成的彙編代碼,並查看自己如何傳遞參數。