2015-04-05 63 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

相关问题