2

我得到了以下 2 个定义,使用 XCode LLVM-GCC 编译器可以很好地编译(和工作):

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

但是,当我将编译器更改为 Apple LLVM 时,出现以下错误:

Expected '(' after 'asm'

我将 {} 替换为 () 但这并不能解决问题,我在那个错误上用谷歌搜索找不到任何有用的东西......有人吗?

4

2 回答 2

4

内联汇编的__asm {...}样式是非标准的,clang 不支持。相反,C++ 将内联汇编语法指定为asm("..."),请注意引号。此外,clang 使用 AT&T 汇编语法,因此需要重写宏以确保安全。

但是,一些工作一直在进行以改进对 Microsoft 的非标准汇编语法以及 Intel 风格的汇编的支持。有一个选项-fenable-experimental-ms-inline-asm可以启用到目前为止所做的事情,尽管我不确定它是什么时候引入的,或者您使用的 clang 版本的支持有多好。对您显示的代码的简单尝试似乎适用于来自 SVN 主干的最新版本的 clang。

#define SAVE_STACK(v)__asm { mov v, ESP }
#define RESTORE_STACK __asm {sub ESP, s }

int main() {
    int i;
    int s;
    SAVE_STACK(i);
    RESTORE_STACK;
}

clang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm -S -o -

        .def     main;
        .scl    2;
        .type   32;
        .endef
        .text
        .globl  main
        .align  16, 0x90
main:                                   # @main
# BB#0:                                 # %entry
        pushq   %rax
        #APP
        .intel_syntax
        mov dword ptr [rsp + 4], ESP
        .att_syntax
        #NO_APP
        #APP
        .intel_syntax
        sub ESP, dword ptr [rsp]
        .att_syntax
        #NO_APP
        xorl    %eax, %eax
        popq    %rdx
        ret

该命令clang++ tmp.cpp -fms-extensions -fenable-experimental-ms-inline-asm会生成一个可以运行的可执行文件。

它仍然会产生如下警告。

警告:不支持 MS 样式的内联汇编 [-Wmicrosoft]

于 2012-11-09T20:25:43.190 回答
4

我在使用 XCode 开发环境时遇到问题,以下代码编译正确。切换到我的 makefile 我收到以下错误消息Expected '(' after 'asm'

#define DebugBreak()  { __asm { int 3 }; }
int main(int argc, const char *argv[])
{
    DebugBreak();
}

请注意, 的定义DebugBreak()来自我在 Visual Studio 下编译的代码。

我在 make 文件中解决此问题的方法是添加参数-fasm-blocks

CFLAGS += -std=c++11 -stdlib=libc++ -O2 -fasm-blocks

于 2017-05-29T15:13:41.403 回答