在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"
);
第一个代码出了什么问题?
答案 0 :(得分:5)
看起来编译器正在将%0
转换为%reg
(我的机器上为%rcx
)并且汇编程序不喜欢%
(因为它处于intel模式下) )。
我不知道是否可以将自动寄存器分配功能(extended asm)与intel语法混合,因为我还没有看到任何示例。
关于gcc内联汇编的好文档通常很难得到,而且documentation中的clang声明它在这个领域与gcc大多兼容......