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

时间:2012-12-30 16:07:56

标签: 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;
}

错误为Unknown token in expression

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

asm volatile("movl $0x2, (%0);"
                 :
                 : "r" (&a)
                 : "memory"
                 );

第一个代码出了什么问题?

1 个答案:

答案 0 :(得分:5)

看起来编译器正在将%0转换为%reg(我的机器上为%rcx)并且汇编程序不喜欢%(因为它处于intel模式下) )。

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

关于gcc内联汇编的好文档通常很难得到,而且documentation中的clang声明它在这个领域与gcc大多兼容......