Использование ассемблера в C / C ++ - PullRequest
43 голосов
/ 17 ноября 2010

Я помню, как читал где-то, что, чтобы действительно оптимизировать и ускорить определенный раздел кода, программисты пишут этот раздел на языке ассемблера.Мои вопросы:

1002 Эта практика еще продолжается?и Как это сделать? Не слишком ли громоздко и архаично писать на ассемблере? Когда мы компилируем код C (с флагом -O3 или без него), компилятор делаетнекоторая оптимизация кода и связывание всех библиотек и преобразование кода в двоичный объектный файл.Поэтому, когда мы запускаем программу, она уже находится в ее самой основной форме, то есть в двоичном виде.Так как же помогает создание языка ассемблера?

Я пытаюсь понять эту концепцию, и любая помощь или ссылки приветствуются.

ОБНОВЛЕНИЕ: Перефразированиепункт 3 в соответствии с просьбой dbemerlin - поскольку вы, возможно, сможете написать более эффективный код сборки, чем генерирует компилятор, но если вы не являетесь экспертом по ассемблеру, ваш код будет работать медленнее, потому что часто компилятор оптимизирует код лучше, чем большинство людей.*

Ответы [ 13 ]

1 голос
/ 17 ноября 2010

У меня есть пример оптимизации сборки, который я сделал, но опять-таки он на встроенной цели. Вы также можете увидеть некоторые примеры программирования на ассемблере для ПК, и он создает действительно маленькие и быстрые программы, но, как правило, не стоит затраченных усилий (ищите «сборка для окон», вы можете найти очень маленькие и красивые программы).

Мой пример был, когда я писал контроллер принтера, и была функция, которая должна была вызываться каждые 50 микросекунд. Это должно сделать перестановку битов, более или менее. Используя C, я смог сделать это за 35 микросекунд, а со сборкой я сделал это за 8 микросекунд. Это очень специфическая процедура, но все же что-то реальное и необходимое.

1 голос
/ 17 ноября 2010

В своей работе я использовал сборку на встроенной цели (микроконтроллере) для доступа низкого уровня.

Но для программного обеспечения для ПК я не думаю, что оно очень полезно.

0 голосов
/ 17 ноября 2010
  1. Да. Используйте как встроенные модули сборки, так и модули сборки ссылок. Какой метод вы должны использовать, зависит от того, сколько ассемблерного кода вам нужно написать. Обычно можно использовать встроенную сборку для нескольких строк и переключаться на отдельные объектные модули один раз, если это более одной функции.
  2. Определенно, но иногда это необходимо. Ярким примером здесь является программирование операционной системы.
  3. Большинство современных компиляторов оптимизируют код, который вы пишете на языке высокого уровня, гораздо лучше, чем кто-либо мог бы написать код на ассемблере. Люди в основном используют его для написания кода, который в противном случае было бы невозможно написать на языке высокого уровня, таком как C. Если кто-то использует его для чего-то еще, значит, он либо лучше в оптимизации, чем современный компилятор (я сомневаюсь в этом), либо просто глупо например, он не знает, какие флаги компилятора или атрибуты функции использовать.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...