2

不幸的是,我不得不重新映像我的笔记本电脑以安装 Visual Studio 2012。我的项目构建但出现上述警告。以前我有 Visual Studio 2010,但从未收到上述警告。代码如下:

__asm
{
    //Initialize pointers on matrices
    mov eax, dword ptr [this]

    mov ebx, dword ptr [eax+UPkk] 
    mov dword ptr [UPkk_ptr],ebx

    mov ebx, dword ptr [eax+UPk1k] 
    mov dword ptr [UPk1k_ptr],ebx

    mov ebx, dword ptr [eax+DPk1k] 
    mov dword ptr [DPk1k_ptr],ebx

    mov ebx, dword ptr [eax+DPkk] 
    mov dword ptr [DPkk_ptr],ebx

    mov ebx, dword ptr [eax+mat_A] 
    mov dword ptr [mat_A_ptr],ebx

    mov ebx, dword ptr [eax+vec_a] 
    mov dword ptr [vec_a_ptr],ebx

    mov ebx, dword ptr [eax+vec_b] 
    mov dword ptr [vec_b_ptr],ebx
}

我需要更改项目中的任何设置吗?

最好的祝福

钦坦

编辑:在上面的代码中,当我用 ecx 替换 ebx 时,警告消失并且代码工作正常。但是,我在另一段代码中使用了 ebx 和 ecx,在这种情况下我的程序崩溃了。这是代码:

__asm
{
    //Initialize UPk1k[idx_4] pointer
    mov eax, dword ptr [UPk1k_ptr]
    mov ebx, dword ptr [idx_4]
    imul ebx,8
    add eax,ebx
    mov dword ptr [UPk1k_id4_ptr],eax

    //Initialize UPkk[idx_4] pointer
    mov eax, dword ptr [UPkk_ptr]
    mov ebx, dword ptr [idx_4]
    imul ebx,8
    add eax,ebx
    mov dword ptr [UPkk_id4_ptr],eax

    //Initialize UPk1k[idx_4] pointer
    mov eax, dword ptr [vec_b_ptr]
    mov ebx, dword ptr [idx_1]
    imul ebx,8
    add eax,ebx
    mov dword ptr [vec_b_id1_ptr],eax

    mov edi, dword ptr [idx_1] //Load idx_1 in edi
    mov esi, 0 //initialize loop counter
    jmp start_proc11

    start_for11:inc esi //idx_2++

    start_proc11:cmp esi, edi //idx_2<idx_1 ?
    jge end_for11 //If yes so end of the loop

    mov eax, UPk1k_id4_ptr //load UPk1k[idx_4] adress
    mov ebx, vec_b_ptr //load vec_b adress
    mov ecx, esi
    imul ecx,8
    add eax, ecx //UPk1k[idx_4+idx_2] in eax
    add ebx, ecx //vec_b[idx_2] in eax

    fld qword ptr [eax]//push UPk1k[idx_4+idx_2]
    fld qword ptr [ebx] //push vec_b[idx_2]
    mov edx,dword ptr [Sd_ptr]
    fmul qword ptr [edx] //vec_b[idx_2]*Sd
    fadd //pop UPk1k[idx_4+idx_2]+vec_b[idx_2]*Sd
    mov edx,dword ptr [UPkk_id4_ptr]
    fstp qword ptr [edx+esi*8] //pop UPkk[idx_4+idx_2]=UPk1k[idx_4+idx_2]+vec_b[idx_2]*Sd
    fld qword ptr [ebx] //push vec_b[idx_2]
    mov edx,dword ptr [vec_b_id1_ptr]
    fld qword ptr [edx] //push vec_b[idx_2]
    fmul qword ptr [eax]
    fadd
    fstp qword ptr [ebx]
    jmp start_for11 //end of the loop
    end_for11:
}

非常感谢

最好的祝福

CS

4

1 回答 1

3

有关寄存器和该警告的信息,请参阅 MSDN 。他们解释了为什么会产生警告:它强制编译器保留 EBX 的值,这可能会适得其反,这通常是使用内联 asm 的原因。相关报价:

此外,通过在内联汇编代码中使用 EBX、ESI 或 EDI,您可以强制编译器在函数序言和结尾处保存和恢复这些寄存器。

要禁用警告,我认为语法是

#pragma warning( disable : 4731 )

但是,我会尝试使用其他寄存器,因为警告的存在是有充分理由的,真的,就像大多数警告一样。

实际上,查看您的 asm 代码,只需替换ebxWith ecx,应该可以解决问题。

于 2013-08-30T10:42:04.343 回答