6

在 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&T 语法,它可以正常工作:

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

第一个代码有什么问题?

4

1 回答 1

6

看起来编译器正在翻译%0%reg%rcx在我的机器上),而汇编器不喜欢%(因为它处于 intel 模式)。

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

关于 gcc 内联汇编的良好文档通常很难获得,并且 clang 在其文档中声明它在该领域与 gcc 大部分兼容......

于 2012-12-30T17:39:41.653 回答