Регистрируйте правила распределения в коде, генерируемом основными компиляторами C / C ++

StackOverflow https://stackoverflow.com/questions/256220

Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

Agner Fog's "Соглашения о вызовах" " документ суммирует, среди прочего, 64-битные и 32-битные интерфейсы Windows и Linux: http: // www .agner.org / оптимизируют / calling_conventions.pdf . См. Таблицу 4 на стр.10 для краткого описания использования регистра.

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top