如何在gcc中使用Intel语法的立即约束?

时间:2016-03-26 10:07:00

标签: gcc inline-assembly

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

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"约束?

1 个答案:

答案 0 :(得分:1)

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

请注意,如果您使用的是符号名称(我觉得更容易阅读/维护),您可以使用%c [5]。

最后,我意识到代码这只是一个“for-instance”,但是你在不告诉编译器的情况下修改内存。这是一件“坏事”。考虑使用内存的输出约束("=m")或添加“内存”clobber。