GCC: встроенная сборка - хорошо для? - PullRequest
2 голосов
/ 22 октября 2009

Итак, я только что узнал, что GCC может выполнять встроенную сборку, и мне было интересно две вещи:

  1. В чем преимущество возможности встроенной сборки?

  2. Можно ли использовать GCC в качестве компилятора / ассемблера для изучения ассемблера?

Я нашел пару статей, но все они старые, 2000 и 2001 гг., Не совсем уверенны в их актуальности.

Спасибо

Ответы [ 7 ]

12 голосов
/ 22 октября 2009

Преимущество встроенной сборки заключается в наличии встроенного кода сборки (подождите, подождите, не убивайте меня). Делая это, вам не нужно беспокоиться о соглашениях о вызовах, и у вас гораздо больше контроля над конечным объектным файлом (то есть вы можете решить, куда каждая переменная направляется - в какой регистр или хранится ли она в памяти), потому что этот код выиграл не оптимизировать (если вы используете ключевое слово volatile).

Относительно вашего второго вопроса, да, это возможно. Что вы можете сделать, это написать простые программы на C, а затем перевести их на ассемблер, используя

gcc -S source.c

С этим, а также с руководствами по архитектуре ( MIPS , Intel и т. Д.), А также с руководством GCC , вы можете пройти долгий путь.

В Интернете есть материал.

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/

Недостатком встроенной сборки является то, что обычно ваш код не будет переносимым между различными компиляторами.

Надеюсь, это поможет.

9 голосов
/ 22 октября 2009

Встроенная сборка полезна для оптимизации на месте и доступа к функциям ЦП, недоступным ни для каких библиотек или операционной системы.

Например, некоторые приложения требуют строгого отслеживания времени. В системах x86 команда сборки RDTSC может использоваться для считывания внутреннего таймера ЦП.

Счетчик отметок времени - Википедия

Использование GCC или любого компилятора C / C ++ со встроенной сборкой полезно для небольших фрагментов кода, но во многих средах отсутствует хорошая поддержка отладки, что будет более важно при разработке проектов, в которых встроенная сборка предоставляет определенные функции. Кроме того, переносимость станет постоянной проблемой, если вы используете встроенную сборку. Предпочтительно создавать определенные элементы в подходящей среде (ассемблер GNU, MASM) и импортировать их по мере необходимости.

8 голосов
/ 22 октября 2009

Встроенная сборка обычно используется для доступа к аппаратным функциям, не предоставляемым компилятором иным образом (например, к векторным SIMD-инструкциям, в которых нет встроенных функций), и / или для оптимизации вручную критических участков кода, где компилятор генерирует субоптимальный код.

Конечно, ничто не мешает вам использовать встроенный ассемблер для тестирования подпрограмм, написанных на языке ассемблера; однако, если вы намереваетесь писать большие участки кода, вам лучше использовать настоящий ассемблер, чтобы не увязнуть в нерелевантности. Вы, вероятно, обнаружите, что ассемблер GNU был установлен вместе с остальной частью цепочки инструментов;)

3 голосов
/ 22 октября 2009
  1. Преимущество встраивания пользовательского кода сборки состоит в том, что иногда (смею сказать, часто) разработчик может написать более эффективный код сборки, чем компилятор. Так что для элементов с чрезвычайно высокой производительностью может быть полезна заказная сборка. Игры, как правило, приходят на ум ....

  2. Что касается его использования для изучения сборки, я не сомневаюсь, что вы могли бы. Но я думаю, что использование фактического SDK для сборки может быть лучшим выбором. Помимо стандартного эксперимента по изучению использования языка, вам, вероятно, понадобятся знания по настройке среды разработки.

2 голосов
/ 23 октября 2009

Это на самом деле не ответ, а своего рода расширенный комментарий к ответам других людей.

Встроенная сборка все еще используется для доступа к функциям ЦП. Например, в чипах ARM, используемых в сотовых телефонах, разные производители выделяют свои предложения с помощью специальных функций, которые требуют необычных инструкций машинного языка, которые не имеют эквивалента в C / C ++.

В 80-х и начале 90-х я много использовал встроенную сборку для оптимизации циклов. Например, компиляторы C, нацеленные на процессоры 680x0, тогда делали бы действительно глупые вещи, такие как:

calculate a value and put it in data register D1
PUSH D1, A7     # Put the value from D1 onto the stack in RAM
POP D1, A7      # Pop it back off again
do something else with the value in D1

Но мне не нужно было делать это, наверное, через пятнадцать лет, потому что современные компиляторы намного умнее. Фактически, современные компиляторы иногда генерируют более эффективный код, чем большинство людей. Особенно с учетом процессоров с длинными конвейерами, прогнозированием ветвлений и т. Д., Последовательность команд, выполняемая быстрее всего, не всегда является наиболее подходящей для человека. Таким образом, вы можете сказать: «Делайте A B C D в таком порядке», и компилятор будет разбирать порядок вокруг для большей эффективности.

Немного поиграть со встроенной сборкой - это хорошо для начинающих, но если вы серьезно, я присоединяюсь к тем, кто предлагает вам перейти к «настоящему» ассемблеру через некоторое время.

2 голосов
/ 22 октября 2009

Вы не должны изучать язык ассемблера, используя встроенную функцию asm .

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

Однако все это можно было бы сделать, просто написав соответствующий C-код и затем написав модуль ассемблера и вызвав расширение как обычную функцию. Возможно, давным-давно машинная операция вызова процедуры была слишком медленной, чтобы ее терпеть, но сегодня вы не заметите.

Я полагаю, что реальный ответ заключается в том, что это легче, если вы знаете DSL с ограничениями. Люди просто добавляют asm и запутывают программу на C, а не пытаются изменить Makefile и добавить новый модуль в рабочий процесс сборки и развертывания.

1 голос
/ 22 октября 2009
  1. Ручная оптимизация циклов, которые выполняются много. Эта статья устарела, но может дать вам представление о том, для каких видов оптимизации используется сборка с ручным кодированием.

  2. Вы также можете использовать ассемблер, который использует gcc напрямую. Это называется as (см. man as). Однако во многих книгах и статьях по сборке предполагается, что вы используете среду DOS или Windows. Так что это может быть довольно сложно изучить в Linux (может быть, запускать FreeDOS на виртуальной машине), потому что вам нужно не только знать процессор (вы обычно можете скачать официальные руководства), для которого вы пишете код, но также и как подключиться к ОС ты бежишь.

Хорошей книгой для начинающих, использующих DOS, является книга Нортона и Сочи. Он довольно старый (третье и последнее издание 1992 года), поэтому вы можете получить использованные копии примерно за 0,01 доллара (без шуток). Единственная известная мне книга, которая относится к Linux, - это бесплатное " программирование с нуля "

...