C++和组装:通过ASM呼叫'operator new'和'operator delete'

C++ and Assembly: call 'operator new' and 'operator delete' with ASM

本文关键字:operator new delete ASM 通过 C++ 呼叫      更新时间:2023-10-16

我正在尝试用Visual C++中的内联ASM调用operator newoperator 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);
}

并写入

call _delete

在ASM代码部分,我没有得到任何错误。有人能告诉我为什么要做什么吗?我不想使用这个_delete函数。如果我尝试以类似的方式调用operator new,也会发生这种情况。非常感谢。

首先,这个调用是不明确的。每种类型都可以定义自己的operator newoperator delete。ASM如何知道应该调用哪一个?

另外,我认为带空格的令牌在ASM(甚至C)中不是一个有效的名称。C++编译器设计用于不同地处理operator关键字,因为运算符的名称通常用空格分隔。我认为ASM对此一无所知。

这就是为什么你会得到这个错误:

error C2414: illegal number of operands

在ASM中,我们用空格分隔操作数。由于尝试调用operator delete,ASM将其解释为两个操作数,这对于call指令来说太多了。