我打电话给C所以:
calculate(&data[index + v], &data[i + v], &data[j + v], norm_1, norm_2, ps, remaining);
在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。
答案 0 :(得分:0)
我相信这是因为你假设参数是通过堆栈传递的,这并不总是正确的。不同平台上的不同编译器使用了多个calling conventions。比如,System V convention(在Linux上使用)通过寄存器传递一些参数。
很难说你应该在你的案例中使用什么,因为它取决于操作系统,编译器和编译标志。如果您使用GCC,您可以通过将-S
标志传递给编译器来查看C程序生成的汇编代码,并了解自己如何准确传递参数。