内联汇编,SSE代码给了我一个未处理的异常

时间:2014-01-22 11:39:16

标签: c++ visual-c++ assembly

我正在尝试使用内联汇编进行向量添加,并且在逐行调试时,似乎我得到了正确的值,但是在包含内联ASM的函数返回其值后,它崩溃。这是整个代码:

#include <mmintrin.h>
#include <xmmintrin.h>
#include <emmintrin.h>
#include <pmmintrin.h>
#include <tmmintrin.h>
#include <smmintrin.h>
#include <nmmintrin.h>
#include <wmmintrin.h>
#include <immintrin.h>

#include <iostream>
#include <stdlib.h>

using namespace std;

__declspec(align(16)) struct AlignedPackedScalarStorage
{
    float x;
    float y;
    float z;
    float w;

    friend AlignedPackedScalarStorage operator+(const AlignedPackedScalarStorage& l, const AlignedPackedScalarStorage& r)
    {
        AlignedPackedScalarStorage output;

        __asm
        {
            MOV EAX, [l]
            MOV EBX, [r]

            MOVAPS XMM0, [EAX]
            MOVAPS XMM1, [EBX]

            ADDPS XMM0, XMM1
            MOVAPS [output], XMM0
        }

        return(output);
    };
};

struct UnalignedPackedScalarStorage
{
    float x;
    float y;
    float z;
    float w;
};

int main()
{
    AlignedPackedScalarStorage A = { 1, 2, 3, 4 };
    AlignedPackedScalarStorage B = { 2, 3, 4, 5 };
    AlignedPackedScalarStorage C = { 3, 5, 7, 9 };
    AlignedPackedScalarStorage D = A + B;

    cout << "Non SIMD:" << endl;
    cout << "X:" << C.x << endl;
    cout << "Y:" << C.y << endl;
    cout << "Z:" << C.z << endl;
    cout << "W:" << C.w << endl<<endl;
    cout << "SIMD:" << endl;
    cout << "X:" << D.x << endl;
    cout << "Y:" << D.y << endl;
    cout << "Z:" << D.z << endl;
    cout << "W:" << D.w << endl << endl;

    system("pause");

    return(0);
}

它给了我错误:

  

ASMTest.exe中0x013A4143处的未处理异常:0xC0000005:Access   违规写入位置0x40800000。

在+运算符中,'l'和'r'是C ++语法中的引用,但是从内联ASM中它就像指针一样处理它们,对吧?MOVAPS接受一个指针并从它移动128位给定给定的指针XMM寄存器。我在调试时挂起[输出]并且在其中添加了正确的值。结构是对齐的,因此使用MOVAPS而不是MOVEUPS没有任何问题。

0 个答案:

没有答案