【问题标题】:Converting Visual C/C++ inline assembly code to GCC equivalent code将 Visual C/C++ 内联汇编代码转换为 GCC 等效代码
【发布时间】:2014-01-21 18:59:52
【问题描述】:

我找到了以下函数here,并希望让它在MinGW下编译:

size_t stackavail()
{
    static unsigned StackPtr;
    __asm mov [StackPtr],esp
    static MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery((PVOID)StackPtr,&mbi,sizeof(mbi));
    return StackPtr-(unsigned)mbi.AllocationBase;
}

我尝试修改上面的代码并设法编译并运行它:

size_t stackavail()
{
    static unsigned StackPtr;

    __asm__ ("movl %%esp, %0\n\t" : "=r" (StackPtr) );
    MEMORY_BASIC_INFORMATION mbi;
    VirtualQuery((PVOID)StackPtr, &mbi, sizeof(mbi));
    return StackPtr-(unsigned)mbi.AllocationBase;
}

但我有疑问。这是正确的吗?还有其他方法吗?

【问题讨论】:

  • 对我来说看起来是正确的,但您应该尽量避免将 __asm__ 用于旨在可移植的代码。
  • 此外,使用静态本地会导致这非常不安全。
  • 使用 GCC 内置 __builtin_frame_address() 代替内联汇编怎么样?这甚至可以移植到其他架构(例如 x86-64)。
  • 谢谢大家的帮助! @AdamRosenfield:很棒的提示。它工作正常。

标签: c++ c gcc inline-assembly


【解决方案1】:

你可以摆脱内联 ASM,使用

void* StackPtr = &StackPtr;

【讨论】:

    猜你喜欢
    • 2021-08-16
    • 2013-04-15
    • 2013-01-22
    • 2014-09-01
    • 2020-11-04
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多