2009-10-22 1 views
2

Так что я только что узнал, GCC может сделать ассемблерные и мне было интересно, две вещи:GCC: Встроенная сборка - хорошо?

  1. Что польза от возможности встраивать сборки?

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

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

Благодаря

+2

obfuscation ;-) – jldupont

ответ

12

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

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

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/

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

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

8

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

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

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

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

+1

Я бы не посмел сказать «часто раз». Немногие разработчики могут лучше писать ассемблер, чем компилятор. Это вроде как мастер высокого уровня. – Tom

+1

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

9

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

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

Time Stamp Counter - Wikipedia

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

2

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

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

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

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

+0

Это неправильно. «Написать модуль ассемблера» требует написания _full_-функций, и это обычно намного больше кода, чем краткие фрагменты, когда сборка действительно оправдана. С помощью встроенной сборки вы можете использовать механизм C/C++ для распределения переменных, соблюдения соглашений о вызовах/выходах функций и выбора регистров. – vonbrand

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

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

Хорошая книга для начинающих с использованием DOS - это компания Norton и Socha. Это довольно старый (3-е и последнее издание - с 1992 года), поэтому вы можете использовать использованные копии за $ 0,01 (без шуток). Единственная книга, которую я знаю об этом, относится к Linux - это бесплатный «Programming from the Ground Up»

+0

Процессоры (и компиляторы) существенно изменились с тех пор, как Pentium ... – vonbrand

2

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

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

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

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