汇编中 C 的数组
array from C in Assembly
我正在尝试使用 SSE 进行一些添加,并且正在使用此 C 和程序集。为什么这样的东西不起作用?
struct vector {
float x1, x2, x3, x4;
};
struct vector *dodawanie(const struct vector v1[], const struct vector v2[], int size) {
struct vector vec[size];
int i;
for(i = 0; i < size; i++) {
asm(
"MOV %1, %%rax \n"
"MOV %2, %%rdx \n"
"MOVUPS (%%rax), %%xmm0 \n"
"MOVUPS (%%rdx), %%xmm1 \n"
"ADDPS %%xmm0, %%xmm1 \n"
"MOVUPS %%xmm1, %0 \n"
:"=g"(vec[i]) //wyjscie
:"g"(v1[i]), "g"(v2[i]) //wejscie
:"%rax", "%rdx"
);
}
return vec;
}
我收到错误:线程 1:EXC_BAD_ACCESS (CODE = EXC_I386_GPFLT)
但是当我输入 v1、v2 等而不是 v1[i]、v2[i] 时,这个工作正常但是当然只有数组的第一个元素。
我的代码有什么问题?
您正在使用表 (v1[i]
、v2[i]
) 中的值,并将它们视为地址 ("MOVUPS (%%rax), %%xmm0 \n"
)。分别使用&v1[i]
和&v2[i]
。
这也是表单 v1
和 v2
在这种情况下传递地址的原因。
我正在尝试使用 SSE 进行一些添加,并且正在使用此 C 和程序集。为什么这样的东西不起作用?
struct vector {
float x1, x2, x3, x4;
};
struct vector *dodawanie(const struct vector v1[], const struct vector v2[], int size) {
struct vector vec[size];
int i;
for(i = 0; i < size; i++) {
asm(
"MOV %1, %%rax \n"
"MOV %2, %%rdx \n"
"MOVUPS (%%rax), %%xmm0 \n"
"MOVUPS (%%rdx), %%xmm1 \n"
"ADDPS %%xmm0, %%xmm1 \n"
"MOVUPS %%xmm1, %0 \n"
:"=g"(vec[i]) //wyjscie
:"g"(v1[i]), "g"(v2[i]) //wejscie
:"%rax", "%rdx"
);
}
return vec;
}
我收到错误:线程 1:EXC_BAD_ACCESS (CODE = EXC_I386_GPFLT)
但是当我输入 v1、v2 等而不是 v1[i]、v2[i] 时,这个工作正常但是当然只有数组的第一个元素。
我的代码有什么问题?
您正在使用表 (v1[i]
、v2[i]
) 中的值,并将它们视为地址 ("MOVUPS (%%rax), %%xmm0 \n"
)。分别使用&v1[i]
和&v2[i]
。
这也是表单 v1
和 v2
在这种情况下传递地址的原因。