Не используйте фиксированные регистры во встроенном ассемблере, особенно если вы не указали их как всплывающие подсказки и не убедились, что входы или выходы не перекрывают их. (Эта часть в основном является дубликатом ошибки ошибка сегментации (дамп ядра) при использовании встроенной сборки )
Не переключайте синтаксис во встроенной сборке, так как компилятор заменит неправильный синтаксис. Используйте -masm=intel
, если вам нужен синтаксис Intel.
Для ссылки на аргументы в строке шаблона asm используйте %
not $
prefix. В $1
нет ничего особенного; оно воспринимается как имя символа, как если бы вы использовали my_extern_int_var
. При компоновке компоновщик не находит определения для символа $1
.
Не добавляйте mov
без необходимости. Также помните, что если что-то работает в определенной среде, это не гарантирует его правильности и будет работать везде и всегда. Вдвойне так для inline asm. Ты должен быть осторожен. В любом случае исправленная версия может выглядеть так:
__asm__(
"imul %0, %1"
: "=r"(c)
: "r" (a), "0" (b)
: );
Должен быть скомпилирован с использованием -masm=intel
. Обратите внимание, что b
был помещен в тот же регистр, что и c
.
с использованием факта, что imul implicity умножается на eax
Это не так для нормальная 2-операндная форма imul . Он работает так же, как и другие инструкции, выполняя dst *= src
, так что вы можете использовать любой регистр и не тратить впустую мопс, записывая старшую половину в любом месте, если вы этого даже не хотите.