Встроенное умножение сборки "неопределенная ссылка" на входах - PullRequest
0 голосов
/ 16 февраля 2020

Попытка умножить 400 на 2 с помощью встроенной сборки, используя факт imul implicity умножается на eax. Тем не менее, я получаю "неопределенные ссылки" ошибки компиляции в $1 и $2

 int c;
 int a = 400;
 int b = 2;

 __asm__(
  ".intel_syntax;"
  "mov eax, $1;"
  "mov ebx, $2;"
  "imul %0, ebx;"
  ".att_syntax;"
  : "=r"(c)
  : "r" (a), "r" (b)
  : "eax");

std::cout << c << std::endl;

1 Ответ

3 голосов
/ 16 февраля 2020

Не используйте фиксированные регистры во встроенном ассемблере, особенно если вы не указали их как всплывающие подсказки и не убедились, что входы или выходы не перекрывают их. (Эта часть в основном является дубликатом ошибки ошибка сегментации (дамп ядра) при использовании встроенной сборки )

Не переключайте синтаксис во встроенной сборке, так как компилятор заменит неправильный синтаксис. Используйте -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, так что вы можете использовать любой регистр и не тратить впустую мопс, записывая старшую половину в любом месте, если вы этого даже не хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...