这段代码(将4个 vector 加倍)可以工作:

__declspec(align(16)) struct vec4 { float a[4]; };

int main()
{
    vec4 c;
    c.a[0]=2;
    c.a[1]=0;
    c.a[2]=0;
    c.a[3]=0;

    __asm {
        movaps xmm1, c

        addps xmm1, xmm1
        movaps c, xmm1
    }
}

但是,这一段代码(执行相同操作,但现在使用指向已对齐数据的指针)没有:
__declspec(align(16)) struct vec4 { float a[4]; };

int main()
{
    vec4* c = new vec4;
    c->a[0]=2;
    c->a[1]=0;
    c->a[2]=0;
    c->a[3]=0;

    __asm {
        movaps xmm1, c

        addps xmm1, xmm1
        movaps c, xmm1
    }
}

为什么?

我需要它与指针一起使用,因为我不能将对齐的数据本身用作函数参数。

最佳答案

必须按照某些规则对ASM中的指针进行处理,您可以通过学习how "MOV" works来学到很多。

根据汇编程序的规则,您首先需要将指针复制到cpu寄存器。然后您可以使用它指向内存位置。

vec4 *d = ...;
__asm {
    mov eax, d
    movaps xmm1, [eax]

    addps xmm1, xmm1
    movaps [eax], xmm1
}

08-15 22:10