Зарегистрируйте правила выделения в коде, сгенерированном основными компиляторами C / C ++ - PullRequest
4 голосов
/ 02 ноября 2008

Я помню некоторые правила давным-давно (до 32-разрядных процессоров Intel), когда довольно часто (по крайней мере, для меня) приходилось анализировать выходные данные сборки, генерируемые компиляторами C / C ++ (в моем случае, Borland / Turbo в в то время), чтобы найти узкие места в производительности и безопасно смешать процедуры сборки с кодом C / C ++. Такие вещи, как использование регистра SI для указателя this , AX используется для возвращаемых значений, регистры которых должны сохраняться при возврате процедуры сборки и т. Д.

Теперь мне стало интересно, есть ли какая-нибудь ссылка на более популярные компиляторы C / C ++ (Visual C ++, GCC, Intel ...) и процессоры (Intel, ARM, ...), и если нет, где найти штук, чтобы создать один. Идеи?

Ответы [ 5 ]

11 голосов
/ 02 ноября 2008

Вы спрашиваете о «двоичном интерфейсе приложения» (ABI) и соглашениях о вызовах. Они обычно устанавливаются операционными системами и библиотеками и применяются компиляторами и компоновщиками. Google для "ABI" или "соглашение о вызовах". Некоторые отправные точки из Википедии и Debian для ARM .

4 голосов
/ 08 августа 2012

В документе «Соглашения о вызовах» Агнера Фога суммированы, среди прочего, 64-битные и 32-разрядные интерфейсы ABI для Windows и Linux: http://www.agner.org/optimize/calling_conventions.pdf. Сводная информация об использовании регистра приведена в таблице 4 на стр.

Одно предупреждение из личного опыта: не встраивайте предположения об ABI при встроенной сборке. Если вы напишите функцию во встроенной сборке, которая предполагает возврат и / или передачу параметров в определенных регистрах (например, eax, rdi, rsi), она сломается, если / когда функция будет встроена компилятором.

1 голос
/ 03 ноября 2008

Компилятор Open Watcom C / C ++ поддерживает два соглашения о вызовах: на основе регистров (по умолчанию) и на стеке (очень близко к тому, что используют другие компиляторы). Руководство пользователя этого компилятора описывает их оба и доступно бесплатно онлайн вместе с самим компилятором . Вы можете найти эти темы в Руководстве пользователя особенно полезными:

  • 10.4.1 Передача аргументов с использованием соглашений о вызовах на основе регистров
  • 10.4.6 Использование стековых соглашений о вызовах
  • 10.5 Соглашения о вызовах для приложений на базе 80x87
0 голосов
/ 02 ноября 2008

Я верю, но отнюдь не уверен, что GCC использует Itanium ABI для большинства своих функций; несовместимость между ним и используемым им ABI задокументирована .

0 голосов
/ 02 ноября 2008

Что ж, сегодня, если включена оптимизация, ее нет. Но GCC позволяет вам объявить, что ваша инструкция по сборке должна использовать конкретную переменную независимо от того, находится она в регистре или нет, или даже заставить GCC поместить эту переменную в регистр, который можно использовать с вашей инструкцией. Вы также можете объявить, какие регистры ваши резервные блоки встроенной сборки для себя (так что компилятор должен генерировать соответствующий код сохранения / восстановления вокруг вашей встроенной части, если это необходимо)

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