С инлайн сборки в GCC, вы можете указать непосредственный операнд ассемблера с "i"
ограничения, например, так:Как использовать непосредственное ограничение с синтаксисом Intel в gcc?
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"
с синтаксисом Intel?
Попробуйте использовать '% c1' (см. Https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#x86Operandmodifiers). Кроме того, рассмотрите использование -masm = intel вместо псевдоопераций. –
Я, должно быть, читал эту страницу, как 10 раз, но почему-то я пропустил этот бит. Благодаря! Вы должны опубликовать это как ответ. – user5434231
И как бы я хотел использовать '-masm = intel', это вызывает проблемы при включении заголовков с синтаксисом AT & T. – user5434231