我想打电话operator new
和operator delete
在Visual C ++内联汇编。
例如,我有一个像这样的函数:
__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);
}
和写
call _delete
在ASM代码部分,我没有收到任何错误。谁能告诉我为什么以及该怎么办?我不想使用此_delete
功能。如果我尝试operator new
以类似方式拨打电话,也会发生这种情况。谢谢你。
首先,这个调用是模棱两可的。每种类型都可以定义自己的operator new
和operator delete
。ASM如何知道应该调用哪一个?
另外,我认为带空格的标记在ASM(甚至C)中不是有效名称。C ++编译器被设计为不同地对待operator
关键字,因为运算符的名称通常用空格分隔。我认为ASM对此一无所知。
这就是为什么出现此错误的原因:
error C2414: illegal number of operands
在ASM中,我们用空格分隔操作数。由于您尝试调用operator delete
,因此ASM将其解释为两个操作数,这对于call
指令来说太多了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句