сохранение и восстановление регистров во встроенном коде сборки - PullRequest
0 голосов
/ 19 октября 2018

Я писал встроенный ассемблерный код для назначения операционной системы.У меня есть несколько вопросов, касающихся встроенной сборки и ее перевода в машинный код компилятором gcc.

  1. asm связывает ввод и вывод с регистрами.Нужно ли нам сохранять все регистры перед выполнением какой-либо операции с использованием asm и восстанавливать их обратно после операции?Потому что, если связанный регистр окажется регистром, содержащим важное значение в программе, это может быть потеряно, и программа может не вести себя ожидаемым образом.
  2. Как определяется, какой регистр будет связан с какимвход?
  3. Сохраняет ли asm регистры, используемые для ввода и вывода, и восстанавливает их самостоятельно?

Редактировать: Пример кода следующий.Какой регистр имеет верхнюю привязку? unsigned long long top; asm volatile("mov %0, %%rsp;" : :"r"(top) :"memory");

1 Ответ

0 голосов
/ 21 октября 2018

Компилятор имеет сложную стратегию распределения регистров, которую он использует для встроенного asm так же, как и для кода, который он генерирует сам.Он может использовать любые регистры или другие местоположения для параметров asm, которые удовлетворяют ограничениям, поэтому трудно предсказать, какие регистры могут быть использованы, и это сильно зависит от окружающего кода.

Компилятор гарантирует, что другие значениянеобходимые скомпилированному коду сохраняются путем помещения их в другие регистры или разлива в память.Программисту не нужно беспокоиться об этом.

...