c++ - XCode 中的 LLVM-GCC ASM 到 LLVM

标签 c++ c llvm xcode4.5 llvm-gcc

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

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

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

Expected '(' after 'asm'

我用 () 替换了 {} 但这没有用,我在谷歌上搜索那个错误找不到任何有用的东西......有人吗?

最佳答案

内联汇编的 __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 生成可运行的可执行文件。

不过它仍然会产生如下警告。

warning: MS-style inline assembly is not supported [-Wmicrosoft]

关于c++ - XCode 中的 LLVM-GCC ASM 到 LLVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13301371/

相关文章:

c++ - c++中双括号 "[[foo()]] type name;"语法的含义?

MacOS安装LLVM

c - 假设我们有结构填充且 int 的大小为 4,double 的大小为 8 字节,下面这段代码中结构的大小是多少

c - 如何从 c 中的文本文件中删除所有文本?

测试代码生成器优化

c++ - LLVM,全局整数数组零初始化器

c++ - 进一步检查 C 头文件

c++ - QLcdNumber 奇怪的行为

c++ - 如何将常量中的值设置为struct c++

c - 加载PE header