如何在 gcc 中使用 Intel 语法的直接约束?

How to use the immediate constraint with Intel syntax in gcc?

在 GCC 中使用内联汇编,您可以使用 "i" 约束指定立即汇编操作数,如下所示:

void set_to_five(int* p)
{
    asm
    (
        "movl %1, (%0);"
        :: "r" (p)
        ,  "i" (5)
    );
}

int main()
{
    int i;
    set_to_five(&i);
    assert(i == 5);
}

到目前为止这没有任何问题,只是它的 AT&T 语法很糟糕。所以让我们再试一次 .intel_syntax noprefix:

void set_to_five(int* p)
{
    asm
    (
        ".intel_syntax noprefix;"
        "mov [%0], %1;"
        ".att_syntax prefix;"
        :: "r" (p)
        ,  "i" (5)
    );
}

但这行不通,因为编译器在立即值之前插入了一个 $ 前缀,而汇编器不再理解它。

如何使用英特尔语法的 "i" 约束?

您应该可以使用 %c1(参见 modifiers)。

请注意,如果您使用的是符号名称(我觉得这样更容易 read/maintain),您可以使用 %c[five].

最后,我意识到这只是一个 "for-instance," 代码,但您在不告知编译器的情况下修改内存。这是 "bad thing." 考虑对内存使用输出约束 ("=m") 或添加 "memory" 破坏器。