Что такое ассемблер
Определения
Термином ассемблер обозначаются два понятия:
• Язык программирования, представляющий собой набор мнемонических обо-значений машинных команд и поддержку символьных меток. Используется также термин язык ассемблера.
• Программа для трансляции команд на языке ассемблера (транслятор) в исполняемый код. Процесс трансляции с языка ассемблера называется ассем-блированием.

Команды процессора, которыми оперирует ассемблер, отличаются от команд типичного алгоритмического языка. Такие действия как A+B или A/B, над которыми обычный прикладной программист обычно даже не задумывается, на языке ас-семблера требуют нескольких команд процессора. В ассемблере, например, для процессора семейства Intel, отсутствуют условные конструкции, аналогичные конструкциям if–else, там имеется всего лишь одна очень простая команда цикла. Таким образом, программы на языке ассемблера состоят из гораздо большего количества команд, чем аналогичные программы на языках высокого уровня. Но увеличение количества инструкций в программе однозначно ведет к увеличению количества ошибок в ней. Следовательно, программирование на ассемблере требует больших усилий и большей внимательности от программиста.

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

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

Где и когда используют ассемблер
Вопрос о том, где и когда использовать язык ассемблера всплывает гораздо чаще, чем в отношении других языков. Это и понятно – язык ассемблера, на первый взгляд, сложнее других языков. На поверку же оказывается, что основная слож-ность языка ассемблера заключается в его большей детальности, чем в других языках. Но для многих программистов эта детальность языка ассемблера как раз и является его преимуществом, дающим ощущение власти над компьютером. Согласитесь, что имеется разница в том, написана ли картина с нуля, когда каждую линию, каждый мазок вы сделали собственноручно или же составлена из больших нарисованных кем-то (не вами) блоков.

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

Одним из преимуществ, о котором всегда говорили сторонники языка ассемблера, является возможность создания быстро исполняемых программ. Правда в настоящее время многие трансляторы с языков высокого уровня учитывают особенности конкретных процессоров и создают программы не менее оптимизированные, чем, если бы они были написаны на ассемблере. Написать длинный код на языке ассемблера с соблюдением оптимизационных возможностей процессора доволь-но сложная задача. Написание же не большого компактного и быстро исполняе-мого кода на ассемблере позволяет оптимизировать программы на языках высоко-го уровня, не смотря на наличие оптимизирующего транслятора. Этому способствует тот факт, что большинство реализаций языков высокого уровня позволяют в той или иной форме использовать в программах язык ассемблера. Это могут быть непосредственно вставки на языке ассемблера, как это реализовано в Visual C++ и Delphi, в форме объектных библиотек или динамически компонуемых библиотек.

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

Ассемблеры для процессоров Intel
Как я уже сказал, ассемблеры для разных процессоров будут отличаться друг от друга по определению. В данной книге мы рассматриваем только ассемблеры для семейства процессоров Intel. Все рассматриваемые ассемблеры являются одно-временно и макроассемблерами, поэтому они могут отличаться не только синтак-сисом написания команд процессора, но и набором и синтаксисом макрокоманд. Все перечисленные ниже ассемблеры (кроме ассемблера GAS) поддерживают синтаксис команд процессора, разработанный корпорацией Intel. Отличие между ними заключается в наборе макрокоманд, которые они поддерживают.

Windows или Unix
Что выбрать Windows или Unix – это спор пользователей, ну на худой конец сисадминов, но только не программистов. Программист по определению занимается программированием, а не выбирает операционные системы. Когда-то я программировал в MS DOS, теперь пишу программы в Windows и Unix-системах. Уверяю Вас, дорогой читатель, на получение удовольствия от процесса написание программа это никак не влияет.

Ну, а если серьезно, то в любой программе есть алгоритмическая часть и та часть, которая отвечает за взаимодействие с системой. Поскольку, как я уже отметил, здесь рассматривается программирование для одного семейства процессоров, то алгоритмические части в программах для разных операционных систем будут очень схожи. Однако, как будет видно в дальнейшем, и программный интерфейс (во всяком случае, его принципы) в операционных системах Windows и Unix очень похож.

Мы не всегда задумываемся, что под именами Windows или Unix скрывается не одна операционная система, разработанная раз и навсегда, а довольно большие семейства. Члены одного семейства отличаются друг от друга в значительной степени внутренним устройством, поскольку подобие пользовательских интерфейсов - это жесткое требование рынка. И тут возникает проблема переносимости про-граммного интерфейса в пределах одного семейства операционных систем. Из общих соображений, очевидно, что для этого необходимо, чтобы у членов одного семейства было что-то общее. Тут следует также отметить, что и переносимость программного обеспечения может быть разной: на уровне программного кода и на уровне двоичного кода. Системные архитекторы корпорации Microsoft уже давно решили для себя, что переносимость программного кода должна быть на уровне двоичного кода. И это очень логичное решение – ведь все операционные системы Windows разрабатываются в рамках одной организации, а, значит, имеют одну потенциальную пользовательскую аудиторию. Простому же пользователю важно, чтобы программа запускалась для любых представителей семейства Windows. Таким средством переноса стал API-интерфейс . API-функции – это про-слойка между прикладной программой и операционной системой (системными функциями). Чтобы ни случилось с ядром Windows, а API-интерфейс должен поддерживать программы, написанные для предыдущих версий .

Unix-же системы еще на заре их создания, производились разными разработчика-ми. Для того, чтобы переносить программное обеспечение с одной системы на другую, нужно было найти другое средство. Таким средством оказались язык C и его библиотеки, в частности библиотека libc. Библиотека libc, таким образом, иг-рает для Unix систем роль своего рода API-прослойки. Конечно, вы можете ис-пользовать и непосредственно системные вызовы, но эти системные вызовы могут иметь различия (иногда очень существенные) для разных систем, а вот вероятность того, что реализация какой-либо функции из библиотеки libc, входящей в стандарт ANSI, для разных систем будет кардинально отличаться маловероятна. Здесь есть некоторое неудобство для простого пользователя, ведь пакеты должны перекомпилироваться, однако с точки зрения безопасности — это, несомненно, большой плюс.

Когда мы будем сравнивать взаимодействие программного кода с операционной системой, то обнаружим, что в Windows и Unix системах имеется много общего. Это касается и файловой обработки, и использования многозадачности, и взаимо-действия с менеджером памяти. Когда я, занимаясь программированием под Windows уже несколько лет, решил попробовать свои силы под Linux, мне это не составило никакого труда, так как общие принципы функционирования операци-онных систем были одни и те же. Я очень надеюсь, что по прочтению этой книги многие читатели согласятся со мной.

Еще одно важное замечание следует сделать по поводу того, в каких операцион-ных системах мы будем рассматривать программирование на ассемблере. Как уже было сказано во введении, мы рассматриваем только 64-битовые системы и, соответственно, будет писать только 64-битовые программы.



 Назад       Сайт       Заметки       Страница-портал       Журнал
(c) Copyright Владислава Юрьевич Пирогов