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如何知道应该调用哪一个?
另外,我认为带空格的令牌在ASM(甚至C)中不是一个有效的名称。C++编译器设计用于不同地处理operator
关键字,因为运算符的名称通常用空格分隔。我认为ASM对此一无所知。
这就是为什么你会得到这个错误:
error C2414: illegal number of operands
在ASM中,我们用空格分隔操作数。由于尝试调用operator delete
,ASM将其解释为两个操作数,这对于call
指令来说太多了。
相关文章:
- 过载'operator new'如何导致无限循环?
- 在C++中调用 malloc() 与"operator new"函数之间的实现差异
- C++和组装:通过ASM呼叫'operator new'和'operator delete'
- 'operator new':函数不接受 2 个参数
- 错误 C2661:'CObject::operator new':没有重载函数需要 4 个参数
- 错误 35 错误 C2661:'operator new':没有重载函数占用 2 个参数
- 什么是"::operator new"和"::operator delete"?
- void* in malloc vs operator new
- 我们还需要"placement new"和"operator new"吗?
- 'operator new'的第一个形式参数必须'size_t'
- 正在对使用operator new okay的放置delete操作的结果调用delete
- operator new[]在MSVC调试时非常慢
- ::operator new[]()与::operator new()有什么不同?
- 为什么替换malloc()需要了解链接器,而::operator new()不需要
- 带nothrow选项的Operator new仍然会抛出异常
- :operator delete(void*)是否知道使用::operator new(size_t)分配的内存大小
- 类x没有默认构造函数,operator new继承
- 如何使用operator new对包含复合类的派生类进行直接初始化
- 如何使用operator new创建动态2D字符数组
- 执行operator new的任何实现都返回指向大小为零的数组的保护页的指针