C++ 和汇编:使用 ASM 调用 'operator new' 和 'operator delete'
C++ and Assembly: call 'operator new' and 'operator delete' with ASM
我正在尝试在 Visual C++ 中使用内联 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);
}
然后写
call _delete
在 ASM 代码部分,我没有收到任何错误。谁能告诉我为什么以及我该怎么办?我不想使用这个 _delete
函数。如果我尝试以类似方式调用 operator new
,也会发生这种情况。谢谢。
首先,这个调用是有歧义的。每种类型都可以定义自己的 operator new
和 operator delete
。 ASM 如何知道应该调用哪一个?
此外,我认为带有 spaces 的标记在 ASM(甚至 C)中不是有效名称。 C++ 编译器被设计为以不同方式对待 operator
关键字,因为运算符的名称通常以白色 space 分隔。我认为 ASM 对此一无所知。
这就是您收到此错误的原因:
error C2414: illegal number of operands
在 ASM 中,我们用白色 space 分隔操作数。由于您尝试调用 operator delete
,ASM 将其解释为两个操作数,这对于 call
指令来说太多了。
我正在尝试在 Visual C++ 中使用内联 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);
}
然后写
call _delete
在 ASM 代码部分,我没有收到任何错误。谁能告诉我为什么以及我该怎么办?我不想使用这个 _delete
函数。如果我尝试以类似方式调用 operator new
,也会发生这种情况。谢谢。
首先,这个调用是有歧义的。每种类型都可以定义自己的 operator new
和 operator delete
。 ASM 如何知道应该调用哪一个?
此外,我认为带有 spaces 的标记在 ASM(甚至 C)中不是有效名称。 C++ 编译器被设计为以不同方式对待 operator
关键字,因为运算符的名称通常以白色 space 分隔。我认为 ASM 对此一无所知。
这就是您收到此错误的原因:
error C2414: illegal number of operands
在 ASM 中,我们用白色 space 分隔操作数。由于您尝试调用 operator delete
,ASM 将其解释为两个操作数,这对于 call
指令来说太多了。