GCC: Встроенный ассемблер — подходит?

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

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

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

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

Спасибо


person Nope    schedule 22.10.2009    source источник


Ответы (7)


Преимущество встроенной сборки заключается в том, что ассемблерный код встроен (подождите, подождите, не убивайте меня). Делая это, вам не нужно беспокоиться о соглашениях о вызовах, и у вас гораздо больше контроля над конечным объектным файлом (это означает, что вы можете решить, куда идет каждая переменная — в какой регистр или в какой памяти она хранится), потому что этот код победил. не быть оптимизированным (при условии, что вы используете ключевое слово 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/

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

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

person Tom    schedule 22.10.2009

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

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

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

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

person meklarian    schedule 22.10.2009

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

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

person moonshadow    schedule 22.10.2009

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

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

person Frank V    schedule 22.10.2009
comment
Я бы не осмелился сказать часто. Немногие разработчики могут написать на ассемблере лучше, чем компилятор. Это как быть волшебником высокого уровня. - person Tom; 23.10.2009
comment
Вы правы, однако я позволил себе некоторую свободу в отношении того, кто может использовать такую ​​​​функцию. Но, подмечено. - person Frank V; 23.10.2009

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

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

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

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

person DigitalRoss    schedule 22.10.2009
comment
Это не правильно. Модуль записи на ассемблере требует написания полных функций, а это обычно гораздо больше кода, чем короткие фрагменты, где ассемблер действительно оправдан. При встроенном ассемблере вы можете использовать механизм C/C++ для размещения переменных, соблюдения соглашений о вызове/выходе функций и выборе регистров. - person vonbrand; 31.01.2013

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

Встроенная сборка по-прежнему используется для доступа к функциям ЦП. Например, в чипах 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 в таком порядке», и компилятор зашифрует порядок для большей эффективности.

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

person Bob Murphy    schedule 23.10.2009

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

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

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

person mdm    schedule 22.10.2009