2013-08-29 99 views
2

不幸的是,我不得不重新映像我的筆記本電腦來安裝Visual Studio 2012.我的項目構建但有上述警告。以前我有Visual Studio 2010,但我從來沒有得到上述警告。代碼如下:幀內指針寄存器'ebx'由內聯彙編代碼修改

__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

+0

到目前爲止沒有答案!!! –

回答

3

請參閱MSDN about registerswarning。他們解釋了爲什麼會產生警告:它強制編譯器保留EBX的價值,這可能會對性能產生反作用,因此使用內聯asm的常見原因。相關報價:

此外,通過內聯彙編代碼使用EBX,ESI或EDI,你 強制編譯器在功能 開端和結尾保存和恢復這些寄存器。

要禁用警告,我覺得語法

#pragma warning(disable : 4731)

不過,我想嘗試使用一些其他的寄存器來代替,因爲預警是有一個很好的理由,真的像大多數警告一樣。

其實,看你的asm代碼,乾脆用ecx代替ebx,那應該可以解決問題了。

+0

感謝您的回覆。用ecx替代解決了問題。乾杯CS –

+0

但現在我的程序崩潰:) –

+0

@chintans那麼,我會建議將內聯asm轉換爲純C++代碼,並查看崩潰是否消失(或者如果不是,則調試)。然後查看彙編程序輸出的結果(啓用優化),以查看是否有任何理由使用內聯彙編程序...也可以將彙編程序輸出與使用內聯彙編程序的彙編程序輸出進行比較。 – hyde

相關問題