框架指针寄存器'ebx'由内联汇编代码修改

时间:2013-08-29 15:05:09

标签: visual-studio-2010 visual-c++ visual-studio-2012

不幸的是,我不得不重新映像我的笔记本电脑以安装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
}

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

最好的问候

Chintan

编辑:在上面的代码中,当我用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

1 个答案:

答案 0 :(得分:3)

请参阅MSDN about registerswarning。它们解释了警告产生的原因:它强制编译器保留EBX的值,这可能会对性能起反作用,这是使用内联asm的常见原因。相关报价:

  

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

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

#pragma warning ( disable : 4731 )

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

事实上,查看您的asm代码,只需将ebx替换为ecx即可解决问题。