C ++和汇编语言:使用ASM调用“新操作符”和“删除操作符”

无羽两足动物

我想打电话operator newoperator 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以类似方式拨打电话也会发生这种情况谢谢你。

马特乌斯·格热耶克(Mateusz Grzejek)

首先,这个调用是模棱两可的。每种类型都可以定义自己的operator newoperator deleteASM如何知道应该调用哪一个?

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

这就是为什么出现此错误的原因:

error C2414: illegal number of operands

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用操作符int()而不是操作符+的C ++

来自分类Dev

操作符<<(操作数类型std :: ostream)不匹配c ++ OOP和Point

来自分类Dev

带操作符说明的C宏

来自分类Dev

C ++定义内部类的<<操作符

来自分类Dev

<<操作符模板的实现// C ++

来自分类Dev

C ++定义内部类的<<操作符

来自分类Dev

C99 VLA大小确定和操作符大小

来自分类Dev

数据类型text和varchar在C#中等于操作符不兼容

来自分类Dev

在两次递增和间接操作符的情况下,C如何处理操作优先级?

来自分类Dev

C ++成员访问/间接操作符对等

来自分类Dev

C ++获取没有操作符的变量地址

来自分类Dev

具有操作符的C ++ const指针[]

来自分类Dev

在C ++中使用友函数进行I / O操作符重载

来自分类Dev

在C ++中使用友函数进行I / O操作符重载

来自分类Dev

C ++在操作符重载函数内创建,分配新变量并将其与两个对象进行比较

来自分类Dev

+和*操作符的贪婪行为

来自分类Dev

在模板化类中重载<<操作符会给我链接器错误(C ++)

来自分类Dev

当打印std :: vector <std :: pair>时,C ++“操作符<<”不匹配

来自分类Dev

在模板化类中重载<<操作符会给我链接器错误(C ++)

来自分类Dev

ruby 2.3安全操作符“&”之间的区别。和CoffeeScript存在操作符“。?”

来自分类Dev

与操作符混淆

来自分类Dev

使用单个删除操作符删除多个指针

来自分类Dev

重定向操作符<和>的组合的订购要求

来自分类Dev

地图操作符[](和“ at”方法)的返回值

来自分类Dev

和操作符如何在python中工作?

来自分类Dev

重载函数调用操作符(),用于索引和分配模板对象

来自分类Dev

RecognizeWithUIAsync无法使用等待操作符

来自分类Dev

使用 NSPredicate 的 `array[FIRST]` 操作符

来自分类Dev

想要与和一起使用和操作符

Related 相关文章

  1. 1

    使用操作符int()而不是操作符+的C ++

  2. 2

    操作符<<(操作数类型std :: ostream)不匹配c ++ OOP和Point

  3. 3

    带操作符说明的C宏

  4. 4

    C ++定义内部类的<<操作符

  5. 5

    <<操作符模板的实现// C ++

  6. 6

    C ++定义内部类的<<操作符

  7. 7

    C99 VLA大小确定和操作符大小

  8. 8

    数据类型text和varchar在C#中等于操作符不兼容

  9. 9

    在两次递增和间接操作符的情况下,C如何处理操作优先级?

  10. 10

    C ++成员访问/间接操作符对等

  11. 11

    C ++获取没有操作符的变量地址

  12. 12

    具有操作符的C ++ const指针[]

  13. 13

    在C ++中使用友函数进行I / O操作符重载

  14. 14

    在C ++中使用友函数进行I / O操作符重载

  15. 15

    C ++在操作符重载函数内创建,分配新变量并将其与两个对象进行比较

  16. 16

    +和*操作符的贪婪行为

  17. 17

    在模板化类中重载<<操作符会给我链接器错误(C ++)

  18. 18

    当打印std :: vector <std :: pair>时,C ++“操作符<<”不匹配

  19. 19

    在模板化类中重载<<操作符会给我链接器错误(C ++)

  20. 20

    ruby 2.3安全操作符“&”之间的区别。和CoffeeScript存在操作符“。?”

  21. 21

    与操作符混淆

  22. 22

    使用单个删除操作符删除多个指针

  23. 23

    重定向操作符<和>的组合的订购要求

  24. 24

    地图操作符[](和“ at”方法)的返回值

  25. 25

    和操作符如何在python中工作?

  26. 26

    重载函数调用操作符(),用于索引和分配模板对象

  27. 27

    RecognizeWithUIAsync无法使用等待操作符

  28. 28

    使用 NSPredicate 的 `array[FIRST]` 操作符

  29. 29

    想要与和一起使用和操作符

热门标签

归档