【问题标题】:Porting GCC specific ASM code to MSVC将 GCC 特定的 ASM 代码移植到 MSVC
【发布时间】:2014-02-11 23:34:24
【问题描述】:

基于我在 google 上找到的代码(在 GCC 编译器上运行良好)

#define ASM __asm__ __volatile__
void MyFunc()
{
    ASM("enc_start:\n\t");
    printf("Hello, world!");
    ASM("enc_end:\n\t");
}
int main()
{
    unsigned int addr, len;
    ASM("movl   $enc_start, %0\n\t"
        "movl   $enc_end, %1\n\t"
        : "=r"(addr), "=r"(len));
    printf("Address of begin of function: %X", addr);
    printf("Len is of: %d bytes", len);
    return 0;
}

我想在 Visual Studio 中转换它,我试过但失败了。我什至不知道这是否可能。你能帮我转换一下吗,或者至少给我一个类似的方法来得到同样的结果?

非常感谢。

【问题讨论】:

  • __asm__ 是 gcc 的扩展。 MSVC 有类似的扩展,但语法不同,请在文档中查找。
  • 注意:GCC 与 VS 非常不同
  • @Paranaix 整个asm sn-p 是gcc 调用extended asm,所以这基本上是一个C 程序,其中asm 代码专门为gcc 编写。 gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html
  • @user2485710 是的,你想从我这里得到什么?我不是说清楚了吗?
  • @Paranaix 只是说这不仅仅是 __asm__ 关键字;)

标签: c++ visual-c++ assembly


【解决方案1】:

Visual Studio 的内联程序集不支持标签 IIRC,没有它们,整个 sn-p 就毫无用处。你首先想要完成什么?

您可以在 VS 的内联汇编中在函数执行时捕获 EIP 的当前值,但不能在外部捕获。

顺便说一句,即使在 GCC 中,它也不会捕获整个函数体的地址和长度。它将捕获函数的地址和长度,不包括序言和结尾代码。要获取函数的真实范围,请生成 MAP 文件并对其进行解析。

我隐约记得 Visual Studio 有序言/尾声大小作为预定义的宏。这个我可能记错了。

【讨论】:

    【解决方案2】:

    您可以尝试使用指向函数的指针来获取函数的起始地址,但在 Visual Studio 的情况下,在调试模式下,它是指向分支指令(分支表的一部分)的指针,该指令分支到功能。这将要求您检查指针是否指向分支指令,如果是,则解码分支指令以确定实际函数的开始。

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 2015-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 2022-11-24
      • 2021-04-04
      • 2015-08-20
      相关资源
      最近更新 更多