【问题标题】:Inline assembly with intel syntax using LLVM: Unknown token in expression使用 LLVM 使用 intel 语法进行内联汇编:表达式中的未知标记
【发布时间】:2012-12-15 01:25:04
【问题描述】:

在 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"
                 );

第一个代码有什么问题?

【问题讨论】:

标签: c llvm inline-assembly


【解决方案1】:

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

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

关于 gcc 内联汇编的好文档通常很难获得,clang 在其documentation 中声明它在这方面与 gcc 大部分兼容...

【讨论】:

    猜你喜欢
    • 2021-06-06
    • 2017-04-24
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多