【问题标题】:ASM Direct Call InstructionASM 直接调用指令
【发布时间】:2014-11-29 07:37:38
【问题描述】:
  1. 如何在不取消引用指针的情况下使用调用操作码生成直接调用?

  2. 由于 call 指令可以表示 xE8、xFF 和 x9A 等多种操作码中的任何一个,当我使用 call 指令时,如何告诉 Visual Studio 我要生成哪一个?

【问题讨论】:

  • 基于 E8 的 call 操作码仅适用于具有局部位移的目标。很有可能(我目前没有要测试的 MSVC),那么,被调用的函数必须具有本地链接,例如声明为 static,至少。
  • 谢谢,克里斯。我将问题编辑为更清楚。
  • 跳转/分支/调用指令的选择通常在链接器中完成。启用链接时优化可能使链接器可以使用直接调用。

标签: visual-studio assembly x86


【解决方案1】:

汇编器将根据您使用的表达式确定要生成的操作码。

如果你写call foo,这将是一个近亲调用E8。如果你写call [foo]call [eax]call eax,它将接近间接调用FF(操作码扩展2)。如果你写call foo:bar(或者如果汇编器知道你正在调用一个far 过程)它将是一个直接的far 调用9A。如果你写call far [foo],它将是一个间接远调用,也是FF(但操作码扩展名3)。

PS:不确定 VS 的远调用语法,请参阅文档了解详细信息。不过,您通常不使用远调用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 2017-11-16
    • 2011-11-27
    • 1970-01-01
    • 2016-07-21
    • 2011-02-10
    • 2011-09-13
    相关资源
    最近更新 更多