2011-01-07 119 views
2

我有一個在VS2010中創建的C++項目,在VS2010中打開並編譯好。它包含有位內聯彙編,包括下面的代碼類:Visual Studio 2010像Visual Studio 6一樣在C++中編譯內聯彙編?

__asm{ 
    mov eax,this 
    mov esi,[eax].m_pImage 
    ... 

所有罰款和花花公子,直到我試圖創建VS2010一個新的MFC C++項目,並與上面顯示的彙編代碼添加類。物以稀爲貴,這將不編譯爲__asm的新的解釋,要求對代碼如下(或類似的東西,這編譯在任何情況下):

__asm{ 
    mov eax,this 
    mov esi,[eax]this.m_pImage 
    ... 

現在,我的生活,我想不通兩個項目之間的區別是什麼,它允許轉換後的VS6項目在VS2010中編譯(可推測的當前無效的)內聯彙編代碼,而新創建的項目則不能。

是否有某處允許使用舊的VS6編譯器的(隱藏)設置?

+0

爲什麼使用內聯彙編程序? – Puppy 2011-01-07 15:48:13

回答

2

VS6內聯ASM看起來像一個已修復的錯誤。我說這是因爲我不確定編譯器如何驗證m_pImage是否是eax寄存器中加載的成員,因此無法找到偏移量。爲了回答你的問題,我知道,在VS6編譯器中使用舊的ASM語義是沒有辦法的。

我會在內聯ASM之外創建一個局部變量,並將其分配給esi

void * pointer = this.m_pImage; 
__asm 
{ 
    mov ebx, pointer 
    mov esi, ebx 
    ... 
+1

當您從VS6轉換項目(並且僅VS6 - 這對其他版本不會發生)時,會應用大量的兼容性設置。很可能已經添加了這個錯誤修正,但舊的代碼路徑仍然在VS6兼容模式下使用。 – 2011-01-07 15:33:12