使用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"
约束?
答案 0 :(得分:1)
您应该可以使用%c1(请参阅modifiers)。
请注意,如果您使用的是符号名称(我觉得更容易阅读/维护),您可以使用%c [5]。
最后,我意识到代码这只是一个“for-instance”,但是你在不告诉编译器的情况下修改内存。这是一件“坏事”。考虑使用内存的输出约束("=m"
)或添加“内存”clobber。