【发布时间】:2013-05-26 11:48:45
【问题描述】:
我想将指针传递给 C 和 ASM 代码之间的数组。我有一个包含四个双精度值的数组,我需要将它们传递给 asm,将它们加载到 xmm,相乘并将指向四个值的指针返回给 C。将数据加载到 xmm0 时出现错误。
如何将此指针传递给 ASM 并返回给 C ? 如何将所有四个数字加载到 xmm0 ?
代码如下:
.text
.globl calkasse
.type calkasse, @function
calkasse:
pushq %rbp
movq %rsp, %rbp
movq 8(%rbp), %rax
movaps 16(%rax), %xmm0
mulps %xmm0,%xmm0
movq %rbp, %rsp
popq %rbp
ret
和C代码:
double (*calkasse(double (*)[4]))[4];
int main(void) {
double suma=0.0;
double poczatek=1.0;
double koniec=5.0;
double step=0.001;
double i=poczatek;
double array[4];
double (*wynik)[4];
array[0] = i;
array[1] = i+step;
array[2] = i+(2*step);
array[3] = i+(3*step);
wynik = calkasse(&array);
suma+=*wynik[0]+*wynik[1]+*wynik[2]+*wynik[3];
return 1;
}
【问题讨论】:
-
可能不是这样。在 Linux 和 Windows(64 位)上,前几个参数在寄存器中传递(但不同的参数和不同的数量)。这是什么平台?此外,它们是双打的,但您将它们用作浮点数。其中四个不适合 xmm 寄存器。
-
这是 linux ubuntu。那么指针将在普通寄存器中吗?那我换成花车了。
-
那么参数将在
rdi中。 -
是的,我想是的,但是你会把它指向的东西放在哪里?如果您使用被调用者的堆栈,则在返回之后,调用者将认为内存属于它(在其红色区域中),并且在您有机会访问结果之前将被允许覆盖它。它可能不会那样做,所以它可能看起来有效。给该函数一个指向输出的指针可能会更好。
-
因为
movq只移动8个字节,试试movaps
标签: c assembly parameter-passing