Программирование для Linux. Профессиональный подход
Шрифт:
8.15. Функция uname
Функция
■
■
■
■
■
Функция
В листинге 8.13 показана небольшая программа, которая отображает номера версии и модификации ядра Linux, а также сообщает тип платформы.
Глава 9
Встроенный ассемблерный код
Сегодня лишь немногие программисты используют в своей практике язык ассемблера. Языки высокого уровня, такие как С и C++, поддерживаются практически на всех архитектурах и обеспечивают достаточно высокую производительность программ. Для тех редких случаев, когда требуется встроить в программу ассемблерные инструкции, в коллекции GNU-компиляторов (GCC) предусмотрены специальные средства, учитывающие особенности конкретной архитектуры.
Встроенными ассемблерными инструкциями следует пользоваться осторожно, так как они являются системно-зависимыми. Например, программу с инструкциями архитектуры x86 не удастся скомпилировать на компьютерах PowerPC. В то же время такие инструкции позволяют напрямую обращаться к аппаратным устройствам, вследствие чего программный код выполняется чуть быстрее.
В программы, написанные на языках С и C++, ассемблерные инструкции встраиваются с помощью функции
является эквивалентом следующей инструкции языка C: [30]
Обратите внимание на то, что, в отличие от обычных ассемблерных инструкций, функция
Подробнее узнать об инструкциях архитектуры x86, используемых в настоящей главе, можно по следующим адресам:
30
Выражение
9.1. Когда необходим ассемблерный код
Инструкции, указываемые в функции
Прибегать к ассемблерным инструкциям как к средству ускорения работы программы следует лишь в крайнем случае. Современные компиляторы достаточно сложны и прекрасно осведомлены об особенностях работы процессоров, для которых они генерируют код. Часто они создают цепочки кодов, которые кажутся неэффективными или неоптимальными, но на самом деле такие последовательности инструкций выполняются быстрее других. В подавляющем большинстве случаев можно положиться на оптимизирующие способности компиляторов.
Иногда одна или две ассемблерные команды способны заменить целую группу высокоуровневых инструкций. Например, чтобы определить позицию самого старшего значащего бита целого числа в языке С, требуется написать цикл, тогда как во многих ассемблерных языках для этой цели существует операция
9.2. Простая ассемблерная вставка
Вот как с помощью функции
Выражение в скобках состоит из секций, разделенных двоеточиями. В первой секции указана ассемблерная инструкция и ее операнды. Команда
Во второй секции задаются выходные операнды. Единственный такой операнд будет помещен в C-переменную