如何在 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" 破坏器。
在 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" 破坏器。