使用LLVM的英特尔语法的内联汇编:表达式中的未知令牌

Tyi*_*ilo 4 c llvm inline-assembly

在Xcode中使用Apple LLVM 4.1编译此代码时出现错误:

#include <stdio.h>

int main(int argc, const char * argv[])
{
    int a = 1;
    printf("a = %d\n", a);

    asm volatile(".intel_syntax noprefix;"
        "mov [%0], 2;"
        :
        : "r" (&a)
        );

    printf("a = %d\n", a);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

错误是Unknown token in expression.

如果我使用AT&T语法,它工作正常:

asm volatile("movl $0x2, (%0);"
                 :
                 : "r" (&a)
                 : "memory"
                 );
Run Code Online (Sandbox Code Playgroud)

第一个代码有什么问题?

lbo*_*onn 6

它看起来像编译器转换%0%reg(%rcx我的机器上),并汇编不喜欢的%(因为它是英特尔模式).

我不知道是否可以将自动寄存器分配功能(扩展asm)与intel语法混合,因为我还没有看到任何示例.

关于gcc内联汇编的好文档通常很难得到,并且文档中的clang声称它在这方面与gcc大多兼容......