2015-04-05 61 views
1

我試圖在Visual C++中使用內聯ASM調用operator newoperator deleteC++和程序集:使用ASM調用'operator new'和'operator delete'

例如,我有這樣的功能:

__forceinline void __fastcall deallocate(pointer& _ptr) 
{ 
    __asm 
    { 
     mov eax, dword ptr[_ptr] 
     mov ecx, dword ptr[eax] 
     mov dword ptr[eax], 0 
     push ecx 
     call operator delete 
     add esp, 4 
    } 
} 

不幸的是,在編譯的時候,我得到這些錯誤:

error C2414: illegal number of operands 
error C2400: inline assembler syntax error in 'first operand'; found 'bad token' 
error C2400: inline assembler syntax error in 'opcode'; found 'bad token' 

我知道這與調用operator delete.如果我更換做它帶有這樣的功能:

__forceinline void _delete(pointer _ptr) 
{ 
    ::operator delete(_ptr); 
} 

and write

call _delete 

在ASM代碼部分,我沒有得到任何錯誤。有人可以告訴我爲什麼,我該怎麼辦?我不想用這個_delete函數。如果我以類似的方式嘗試撥打operator new,也會發生這種情況。謝謝。

+1

你的方法的一個問題是每種類型都有一個不同的操作符刪除,彙編器如何知道你想要哪一個? – Dani 2015-04-05 11:06:35

+0

你認爲有什麼辦法可以解決這個問題嗎? – 2015-04-05 11:39:38

+0

我在想爲什麼你想打破C++的大會去做這個...? – 2015-04-05 12:49:47

回答

1

首先,這個調用是不明確的。每種類型可以定義自己的operator newoperator delete。 ASM如何知道應該調用哪一個?

此外,我認爲,帶空格的令牌在ASM(甚至C)中不是有效的名稱。 C++編譯器被設計成區別對待operator關鍵字,因爲運算符的名稱通常用空格分隔。我不認爲ASM知道這件事。

這就是爲什麼你收到此錯誤:

error C2414: illegal number of operands

在ASM,我們用空格分開操作數。由於您試圖撥打operator delete,因此ASM將其解釋爲兩個操作數,這對於call指令來說太多了。

+0

我也認爲'運營商'是ASM無法識別的關鍵字。你認爲有什麼辦法可以解決這個問題嗎? – 2015-04-05 11:16:12

+0

ASM不知道有關模板或重載的任何信息,所以我不認爲可以這樣做。請注意,即使編譯器發出的程序集總是包含被調用函數的直接內存地址。除此之外,編寫像這樣的任務的彙編代碼不是一個好主意。此外,由於您使用VC++,請記住,使用內聯彙編,使您的代碼非常不可移植 - 即使原生64位版本的應用程序也無法編譯,因爲在該目標上,內聯彙編被禁止。 – 2015-04-05 11:51:19

+0

感謝您提供這些信息。 – 2015-04-05 11:52:10

相關問題