运行时检查失败#2 - 围绕变量'结果'被腐败了

时间:2016-09-11 12:01:57

标签: c++ assembly

我编译了这段代码并得到了运行时检查失败#2 - 围绕变量'结果'已损坏例外。但是当我将结果数组大小从2更改为4异常消失时。你能解释一下为什么会这样吗? 对不起,如果你发现这个问题太基础了。

#include "stdafx.h"

string get_cpu_name()
{
    uint32_t data[4] = { 0 };
    _asm
    {
        cpuid;
        mov data[0], ebx;
        mov data[4], edx;
        mov data[8], ecx;
    }
    return string((const char *)data);
}
void assembler()
{
    cout << "CPU is " << get_cpu_name() << endl;

    float f1[] = { 1.f , 22.f};
    float f2[] = { 5.f , 3.f };
    float result[2] = { 0.f };

    /*float f1[] = { 1.f , 22.f , 1.f , 22.f };
    float f2[] = { 5.f , 3.f , 1.f , 22.f };
    float result[4] = { 0.f };*/


    _asm
    {
        movups xmm1, f1;
        movups xmm2, f2;
        mulps xmm1, xmm2;
        movups result, xmm1;
    }

    /*for (size_t i = 0; i < 4; i++)*/
    for (size_t i = 0; i < 2; i++)
    {
        cout << result[i] << "\t";
    }
    cout << endl;

}


int main()
{
    assembler();
    getchar();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

movups指令writes 128 bits (16 bytes) to memory。您正在将其写入8字节数组(2 * 4字节或64位)的位置。数组后的8个字节也将被写入。

您应该确保至少有16个字节的空间来写入结果,或者您应该确保在那里写入少于16个字节。