xmm0 的函数参数

Posted

技术标签:

【中文标题】xmm0 的函数参数【英文标题】:function parameter to xmm0 【发布时间】:2017-04-02 18:50:02 【问题描述】:

我正在尝试将 ALIGNED 浮点数组移动到 xmm 寄存器中

#define ALIGNED16 __declspec(align(16))

ALIGNED16 float vector1[4] =  1.0f, 2.0f, 3.0f, 4.0f ;
ALIGNED16 float vector2[4] =  1.0f, 2.0f, 3.0f, 4.0f ;
ALIGNED16 float result[4];

_add_vector(vector1, vector2, result);
....

_add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec)

  __asm
  
    movaps xmm0, xmmword ptr [v1]
    movaps xmm1, xmmword ptr [v2]

    addps xmm0, xmm1

    movaps xmmword ptr [rvec], xmm0
  ;

所以当编译器试图从 v1 复制到 xmm0 时,我有“读取访问冲突”v1 was0xFFFFFFFF

但如果我这样做了

__asm
  
    movaps xmm0, xmmword ptr [v1]
  ;

在 vector1 声明之后,它就可以工作了。为什么?

【问题讨论】:

v1(和v2rvec)是压入堆栈的浮点数的指针。在您的 _add_vector 函数中,您需要取消引用这些指针,然后将该数据移动到 xmm0(和 xmm1) 除非您有使用汇编语言的特定要求,否则您将通过使用内在函数为自己节省大量时间和烦恼。 【参考方案1】:

问题在于v1v2vrec 是指向浮点数组的指针。您需要取消引用这些指针中的每一个以获取实际的数组。这样的事情可能会奏效:

void _add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec);

void _add_vector(float *__restrict v1, float * __restrict v2, float * __restrict rvec)

    __asm
    
        mov ecx, [v1]
        mov edx, [v2]
        mov eax, [rvec]

        movaps xmm0, xmmword ptr [ecx]
        movaps xmm1, xmmword ptr [edx]

        addps xmm0, xmm1

        movaps xmmword ptr [eax], xmm0
    ;

在这种情况下,我使用调用者保存的 EAXECXEDX 的寄存器来取消引用变量。

【讨论】:

以上是关于xmm0 的函数参数的主要内容,如果未能解决你的问题,请参考以下文章

在 x86_64 汇编问题中添加双精度

如何在某处计算正弦值,然后在 Assembly 中移动到 XMM0?

GCC内联汇编中的C数组?

js参数是一个函数怎么做?

python 函数参数类型

函数名作为参数传递与回调函数