我从C调用,所以:
calculate(&data[index + v], &data[i + v], &data[j + v], norm_1, norm_2, ps, remaining);
一个在Assembly中实现的函数,这就是Assembly函数:
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。
我相信发生这种情况是因为您假设参数是通过堆栈传递的,但这并不总是正确的。不同平台上的不同编译器使用多种调用约定。比如说,System V约定(在Linux上使用)通过寄存器传递一些参数。
很难说在您的情况下应该使用什么,因为它取决于操作系统、编译器和编译标志。如果您使用GCC,您可以通过将-S
标志传递给编译器来查看C程序生成的汇编代码,并了解参数是如何传递的。