0

В чем особенность программы на языке ассемблера

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

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

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

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

Данная система должна хранить следующую информацию:

– теоретические сведения о языке ассемблера, разбитые на статьи, разделы и темы;

– справочник по командам и операторам языка ассемблера;

– вспомогательные материалы по особенностям строения персонального компьютера, важным для освоения языка ассемблера (регистры, флаги, хранение информации в памяти компьютера).

Информация должна быть хорошо структурирована и взаимосвязана между собой. Это предполагает наличие в разрабатываемой системе реляционной базы данных, созданной средствами одной из современных СУБД.

Для работы с базой данных следует разработать специальное приложение, обладающее удобным и понятным пользовательским интерфейсом.

Особенности языка ассемблера

Язык ассемблера является машинно-ориентированным языком низкого уровня с командами, обычно соответствующими командам машины. Язык ассемблера можно трактовать как систему обозначений, используемую для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, при выполнении команд условных и безусловных переходов) [10].

Перевод программы на языке ассемблера в исполняемый машинный код производится ассемблером – программой-транслятором, которая и дала языку ассемблера его название.

Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи машинных команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора.

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

Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

Каждая модель (или семейство) процессоров имеет свой набор – систему команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера – Intel-синтаксис и AT&T-синтаксис.

Язык ассемблера имеет следующие достоинства [1]:

– язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора;

– скорость работы – за счёт оптимизации вычислительного алгоритма и/или более рационального обращения к ОП, перераспределения данных;

– объем кода – сокращение объема кода также нередко повышает скорость выполнения программы;

– обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы (в том числе менее ресурсоемкие);

– при программировании на языке ассемблера возможен непосредственный доступ к аппаратуре, и, в частности, портам ввода-вывода, регистрам процессора и др.;

– язык ассемблера часто применяется для создания драйверов оборудования и ядра операционной системы (или машиннозависимых подсистем ядра ОС);

– язык ассемблера используется для создания «прошивок» BIOS;

– с помощью языка ассемблера часто создаются машиннозависимые подпрограммы компиляторов и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ;

– с помощью дизассемблера возможно исследовать существующие программы при отсутствии исходного кода.

К недостаткам языка ассемблера относятся [1]:

– в силу машинной ориентации («низкого» уровня) языка ассемблера человеку сложнее читать и понимать программу на нем по сравнению с языками программирования высокого уровня;

– требуется повышенная квалификация программиста для получения качественного кода;

– программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы, программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода;

– меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования;

– отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

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

– быстродействие (драйверы, игры);

– объём используемой памяти (загрузочные секторы, встраиваемое программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

С использованием программирования на языке ассемблера производятся [10].

1 Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.

2 Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си – языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (HAL – hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует.

3 Программирование микроконтроллеров (МК) и других встраиваемых процессоров.На сегодняшний день для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си).

4 Создание драйверов. Некоторые части драйверов программируют на языке ассемблера.

5 Создание антивирусов и других защитных программ.

6 Написание трансляторов языков программирования.

Синтаксис языка ассемблера определяется системой команд конкретного процессора.

Типичными командами языка ассемблера являются (применительно к Intel-синтаксису архитектуры x86) [1]:

– команды пересылки данных (mov и др.);

– арифметические команды (add, sub, imul и др.);

– логические и побитовые операции (or, and, xor, shr и др.);

– команды управления ходом выполнения программы (jmp, loop, ret и др.);

– команды вызова прерываний (int);

– команды ввода/вывода в порты (in, out).

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

jcxz — перейти, если содержимое регистра CX равно 0;

jz – перейти, если флаг нуля (ZF) установлен в 1.

Типичный формат записи команд:

[метка:] мнемокод [операнды] [;комментарий]

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

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

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

– определение данных (констант и переменных);

– управление организацией программы в памяти и параметрами выходного файла;

– задание режима работы компилятора;

– всевозможные абстракции (то есть элементы языков высокого уровня) – от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования);

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

Читайте также:  Как активировать роутер мегафон
Язык ассемблера
Класс языка язык программирования
Появился в 1949
Расширение файлов .asm или .s [1]

Язы́к ассе́мблера (англ. assembly language ) — машинно-ориентированный язык программирования низкого уровня. Его команды прямо соответствуют отдельным командам машины или их последовательностям, также он может предоставлять дополнительные возможности облегчения программирования, такие как макрокоманды, выражения, средства обеспечения модульности программ. Может рассматриваться как автокод (см. ниже), расширенный конструкциями языков программирования высокого уровня [2] [3] . Является существенно платформо-зависимым. Языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны.

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

Автокод — язык программирования, предложения которого по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка [3] .

Содержание

Общее определение [ править | править код ]

Язык ассемблера — система обозначений, используемая для представления в удобно читаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления) [4] .

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

Содержание языка [ править | править код ]

Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи — мнемокоды — команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора [5] .

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

Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

Каждая модель (или семейство) процессоров имеет свой набор — систему — команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера — Intel-синтаксис и AT&T-синтаксис.

Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Форт, Лисп, Эль-76). Фактически, в таких компьютерах они выполняют роль языков ассемблера.

Возможности [ править | править код ]

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

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

    • драйверов оборудования и ядра операционной системы (по крайней мере, машинозависимых подсистем ядра ОС), тогда, когда важно временно́е согласование работы периферийных устройств с центральным процессором;
    • программ, которые должны храниться в ПЗУ ограниченного объёма и/или выполняться на устройствах с ограниченной производительностью («прошивок» компьютеров и различных электронных устройств)
    • платформо-зависимых компонентов компиляторов и интерпретаторовязыков высокого уровня, системных библиотек и кода, реализующего совместимость платформ.

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

    Ограничения [ править | править код ]

    • В силу машинной ориентации («низкого уровня») языка ассемблера человеку сложнее читать и понимать программу на нём по сравнению с языками программирования высокого уровня. Это серьёзно затрудняет сопровождение программ, написанных на языке ассемблера.
    • Программа на языке ассемблера состоит из очень «мелких» элементов — машинных команд, соответственно, объём программы в командах пропорционально больше. Поскольку, как известно, программист за единицу времени может написать и отладить примерно одно и то же число операторов, вне зависимости от языка, на котором он пишет, разработка на ассемблере больших программ оказывается существенно медленнее.
    • Усложняются программирование и отладка, растут трудоёмкость и вероятность внесения ошибок.
    • Требуется повышенная квалификация программиста для получения качественного кода: код, написанный средним программистом на языке ассемблера, обычно оказывается не лучше или даже хуже кода, порождаемого оптимизирующим компилятором для сравнимых программ, написанных на языке высокого уровня [6] . При этом чем больше объём программы, тем меньше выигрыш от использования языка ассемблера.
    • Программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы [7] , программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода [8][9] .
    • Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
    • Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

    Применение [ править | править код ]

    Исторически, если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нём больших программных комплексов привели к появлению языков третьего поколения — языков программирования высокого уровня (таких как Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки программирования высокого уровня и их наследники в основном используются в настоящее время в индустрии информационных технологий. Однако языки ассемблера сохраняют свою нишу, обусловленную их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.

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

    • быстродействие (драйверы, игры);
    • объём используемой памяти (загрузочные секторы, встраиваемое (англ. embedded ) программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

    С использованием программирования на языке ассемблера производятся:

    • Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийныхкодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.
    • Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графический многооконный интерфейс.
    • Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени [10] . Сейчас (2013 г.) для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си). В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров [11] .
    • Создание драйверов. Драйверы (или их некоторые программные модули) программируют на языке ассемблера. Хотя в настоящее время драйверы также стремятся писать на языках высокого уровня (на высокоуровневом языке много проще написать надёжный драйвер) в связи с повышенными требованиями к надёжности и достаточной производительностью современных процессоров (быстродействие обеспечивает временно́е согласование процессов в устройстве и процессоре) и достаточным совершенством компиляторов с языков высокого уровня (отсутствие ненужных пересылок данных в сгенерированном коде), подавляющая часть современных драйверов пишется на языке ассемблера. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы.
    • Создание антивирусов и других защитных программ.
    • Написание кода низкоуровневых библиотек трансляторов языков программирования.
    Читайте также:  Как включить подсветку клавиатуры на windows 10

    Связывание программ на разных языках [ править | править код ]

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

    • На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ. inline assembler ) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.
    • На этапе компоновки при раздельной компиляции. Для взаимодействия компонуемых модулей достаточно, чтобы импортируемые функции (определённые в одних модулях и используемые в других) поддерживали определённое соглашение о вызове (англ. calling conventions ). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера.

    Синтаксис [ править | править код ]

    Синтаксис языка ассемблера определяется системой команд конкретного процессора.

    Набор команд [ править | править код ]

    Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

    • Команды пересылки данных ( mov и др.)
    • Арифметические команды ( add , sub , imul и др.)
    • Логические и побитовые операции ( or , and , xor , shr и др.)
    • Команды управления ходом выполнения программы ( jmp , loop , ret и др.)
    • Команды вызова прерываний (иногда относят к командам управления): int
    • Команды ввода-вывода в порты ( in , out )
    • Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
    • cjne — перейти, если не равно
    • djnz — декрементировать, и если результат ненулевой, то перейти
    • cfsneq — сравнить, и если не равно, пропустить следующую команду

    Инструкции [ править | править код ]

    Типичный формат записи команд [ править | править код ]

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

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

    Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86, ARM, SPARC, PowerPC, M68k). Они описываются в спецификации процессоров. Возможные исключения:

    • если ассемблер использует кроссплатформенный AT&T-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T);
    • если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

    Например, процессор Zilog Z80 наследовал систему команд Intel 8080, расширил её и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel и в данный момент половина ассемблеров для Fireball работает с мнемониками Intel, а половина — с мнемониками Zilog.

    Директивы [ править | править код ]

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

    • определение данных (констант и переменных),
    • управление организацией программы в памяти и параметрами выходного файла,
    • задание режима работы компилятора,
    • всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования),
    • макросы.

    Пример программы [ править | править код ]

    Примеры программы Hello, world! для разных платформ и разных диалектов:

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

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

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

    Ассемблер (assembly language, assembler) является машинно-ориентированным языком программирования. В переводе с английского слово assembly означает собрание, сборка, монтаж и т. п. Выбор такого названия объясняется тем, что первые трансляторы с Алгола, Фортрана, Кобола и PL/I использовали ассемблер в качестве промежуточного языка при сборке программы из отдельных модулей.

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

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

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

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

    Специфические особенности языка

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

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

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

    Очевидным недостатком является низкий уровень абстрагирования от особенностей конкретной ЭВМ, необходимость знать и учитывать эти особенности. В то время как при работе с языками высокого уровня программист может полностью сосредоточить свое внимание на особенностях реализуемого алгоритма.

    Другим недостатком является большое, а иногда и очень большое, количество команд, выполняемых конкретной машиной. Например, у микропроцессора Pentium 4 их около 500! Это вынуждает пользоваться при работе специальными справочниками, – не держать же в голове все разнообразие имен команд и особенностей их выполнения.

    Ассемблер и макроассемблер

    С точки зрения программиста язык ассемблера является подмножеством языка макроассемблера. Последний обязательно компилирует полный набор инструкций конкретного семейства микропроцессоров и, кроме того, исполняет большой набор операторов и директив (далее макросредств) различного назначения. У программистов, работающих на компьютерах IBM PC, наибольшей популярностью пользуются макроассемблеры MASM (компании Microsoft) и TASM (компании Borland), имеющие примерно одинаковые возможности и во многом (но не полностью) совместимые. В данном разделе мы будем говорить об особенностях MASM.

    Читайте также:  В чем польза компьютерных игр

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

    При определенных условиях исходный текст программы, выполняющей достаточно сложные действия, может содержать только макросредства. В нем не будет ни одной команды ассемблера! О какой сложности и трудоемкости программирования можно говорить в подобных случаях?

    В руководствах по MASM, в том числе и в HELP, обычно описываются 8 типов операторов и 12 типов директив, начиная с версии MASM 6.10, их количество не изменялось. В рамках данной статьи не имеет смысла приводить полное описание макросредств, поэтому мы ограничимся их общей характеристикой.

    Директивы макроассемблера предназначены для выполнения трех основных категорий действий:

    1. управление распределением оперативной памяти выполняют директивы, предназначенные для описания простых переменных, структур данных, записей и сегментирования программ;
    2. управление работой с внешними и внутренними подпрограммами, фрагментами программ и макроопределениями выполняют директивы их явного или предварительного описания и вызова;
    3. управление процессом компиляции программы выполняют директивы условной компиляции, среди них встречаются такие знакомые каждому программисту имена, как IF, ELSE, FOR, WHILE, REPEAT, GOTO.

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

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

    Ахиллесовой пятой ассемблера является трудоемкость программирования на этом языке. Что может сделать программист для упрощения собственного труда?

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

    1. В состав полной версии системы программирования на макроассемблере (дистрибутивного пакета) входит набор макроопределений и подпрограмм различного назначения и примеры их использования. Внимательно просмотрите все подкаталоги вашей версии макроассемблера, наверняка в них найдутся полезные и интересные решения, которые можно применять в вашей работе.
    2. Не забывайте о том, что при составлении программ можно использовать модули библиотек, входящих в состав систем программирования на языках высокого уровня, например, на Си. Правда, для этого надо иметь описание этих библиотек, но без него невозможно их использование и в рамках той системы программирования, для которой они созданы.
    3. Если у вас есть доступ к сети Internet, то на разных ее сайтах можно найти множество готовых решений буквально на все случаи жизни. Только обращайте внимание на даты разработки программ и подпрограмм. Многие из них морально устарели и при использовании новых инструкций микропроцессоров могут быть существенно упрощены.
    4. В процессе работы с ассемблером у вас постепенно будет накапливаться набор собственных решений, которые пригодятся в новых разработках. Для удобства их последующего использования старайтесь при написании программ составлять как можно больше подпрограмм, оформленных в виде отдельных модулей, лучше исходных, а не объектных – первые проще модифицировать в случае необходимости. Применение подпрограмм несколько увеличивает размеры задачи и замедляет процесс ее выполнения. Но взамен вы получаете возможность отлаживать большую программу по частям и использовать отлаженные подпрограммы в других своих разработках.
    5. Не забывайте о существовании такого эффективного средства, как макросы – макроопределения и макровызовы. Они позволяют сокращать не только исходный текст программы, но и количество возможных ошибок при его наборе. Кроме того, макровызовы удобно применять при запросе системных функций, которые выполняют много полезных действий таких, как работа с окнами, с файловой системой, ввод и вывод данных и пр.

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

    Когда ассемблеру нет альтернативы

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

    Обвинять в этом разработчиков компиляторов не имеет смысла, – проблема не столь тривиальна, и для ее решения нужно не только улучшать технику компиляции, но и разрабатывать принципиально новые языковые средства. Мы привыкли к тому, что арифметические и логические операции выполняются над одной парой операндов, иногда над одним операндом (смена знака или отрицание). А групповые операции современных микропроцессоров (не только семейства Pentium) могут оперировать сразу с несколькими парами операндов, количество и разрядность которых не фиксированы.

    В этой ситуации альтернативы ассемблеру просто не существует. Недаром в технической документации к компилятору "Intel C++ Compiler" рекомендуются три варианта работы с новыми командами:

    1. прямые вставки ассемблерного текста в тело программы, написанной на Си;
    2. составление процедур (подпрограмм) на языке ассемблера;
    3. использование Intrinsic (встроенные функции).

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

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

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

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

    Компания Intel разработала и продает специальный анализатор производительности микропроцессора в процессе выполнения конкретной задачи (VTuneTM Performance Analyzer 6.0). Он позволяет выявить в ней слабые места (критические участки кода задачи), и затем исправить их с помощью ассемблерных вставок.

    Подробнее о новых возможностях микропроцессоров вы можете прочитать в моей статье "Pentium глазами программиста"[1]. В Internet она опубликована на странице http://www.macro.aaanet.ru/apnd_4.html

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

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

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

    admin

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *

    0

    В чем особенность программы на языке ассемблера

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

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

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

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

    Данная система должна хранить следующую информацию:

    – теоретические сведения о языке ассемблера, разбитые на статьи, разделы и темы;

    – справочник по командам и операторам языка ассемблера;

    – вспомогательные материалы по особенностям строения персонального компьютера, важным для освоения языка ассемблера (регистры, флаги, хранение информации в памяти компьютера).

    Информация должна быть хорошо структурирована и взаимосвязана между собой. Это предполагает наличие в разрабатываемой системе реляционной базы данных, созданной средствами одной из современных СУБД.

    Для работы с базой данных следует разработать специальное приложение, обладающее удобным и понятным пользовательским интерфейсом.

    Особенности языка ассемблера

    Язык ассемблера является машинно-ориентированным языком низкого уровня с командами, обычно соответствующими командам машины. Язык ассемблера можно трактовать как систему обозначений, используемую для представления в удобочитаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, при выполнении команд условных и безусловных переходов) [10].

    Перевод программы на языке ассемблера в исполняемый машинный код производится ассемблером – программой-транслятором, которая и дала языку ассемблера его название.

    Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи машинных команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора.

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

    Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

    Каждая модель (или семейство) процессоров имеет свой набор – систему команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера – Intel-синтаксис и AT&T-синтаксис.

    Язык ассемблера имеет следующие достоинства [1]:

    – язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора;

    – скорость работы – за счёт оптимизации вычислительного алгоритма и/или более рационального обращения к ОП, перераспределения данных;

    – объем кода – сокращение объема кода также нередко повышает скорость выполнения программы;

    – обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы (в том числе менее ресурсоемкие);

    – при программировании на языке ассемблера возможен непосредственный доступ к аппаратуре, и, в частности, портам ввода-вывода, регистрам процессора и др.;

    – язык ассемблера часто применяется для создания драйверов оборудования и ядра операционной системы (или машиннозависимых подсистем ядра ОС);

    – язык ассемблера используется для создания «прошивок» BIOS;

    – с помощью языка ассемблера часто создаются машиннозависимые подпрограммы компиляторов и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ;

    – с помощью дизассемблера возможно исследовать существующие программы при отсутствии исходного кода.

    К недостаткам языка ассемблера относятся [1]:

    – в силу машинной ориентации («низкого» уровня) языка ассемблера человеку сложнее читать и понимать программу на нем по сравнению с языками программирования высокого уровня;

    – требуется повышенная квалификация программиста для получения качественного кода;

    – программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы, программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода;

    – меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования;

    – отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

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

    – быстродействие (драйверы, игры);

    – объём используемой памяти (загрузочные секторы, встраиваемое программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

    С использованием программирования на языке ассемблера производятся [10].

    1 Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийных кодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.

    2 Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си – языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (HAL – hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует.

    3 Программирование микроконтроллеров (МК) и других встраиваемых процессоров.На сегодняшний день для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си).

    4 Создание драйверов. Некоторые части драйверов программируют на языке ассемблера.

    5 Создание антивирусов и других защитных программ.

    6 Написание трансляторов языков программирования.

    Синтаксис языка ассемблера определяется системой команд конкретного процессора.

    Типичными командами языка ассемблера являются (применительно к Intel-синтаксису архитектуры x86) [1]:

    – команды пересылки данных (mov и др.);

    – арифметические команды (add, sub, imul и др.);

    – логические и побитовые операции (or, and, xor, shr и др.);

    – команды управления ходом выполнения программы (jmp, loop, ret и др.);

    – команды вызова прерываний (int);

    – команды ввода/вывода в порты (in, out).

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

    jcxz — перейти, если содержимое регистра CX равно 0;

    jz – перейти, если флаг нуля (ZF) установлен в 1.

    Типичный формат записи команд:

    [метка:] мнемокод [операнды] [;комментарий]

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

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

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

    – определение данных (констант и переменных);

    – управление организацией программы в памяти и параметрами выходного файла;

    – задание режима работы компилятора;

    – всевозможные абстракции (то есть элементы языков высокого уровня) – от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования);

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

    Читайте также:  В чем польза компьютерных игр
    Язык ассемблера
    Класс языка язык программирования
    Появился в 1949
    Расширение файлов .asm или .s [1]

    Язы́к ассе́мблера (англ. assembly language ) — машинно-ориентированный язык программирования низкого уровня. Его команды прямо соответствуют отдельным командам машины или их последовательностям, также он может предоставлять дополнительные возможности облегчения программирования, такие как макрокоманды, выражения, средства обеспечения модульности программ. Может рассматриваться как автокод (см. ниже), расширенный конструкциями языков программирования высокого уровня [2] [3] . Является существенно платформо-зависимым. Языки ассемблера для различных аппаратных платформ несовместимы, хотя могут быть в целом подобны.

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

    Автокод — язык программирования, предложения которого по своей структуре в основном подобны командам и обрабатываемым данным конкретного машинного языка [3] .

    Содержание

    Общее определение [ править | править код ]

    Язык ассемблера — система обозначений, используемая для представления в удобно читаемой форме программ, записанных в машинном коде. Язык ассемблера позволяет программисту пользоваться алфавитными мнемоническими кодами операций, по своему усмотрению присваивать символические имена регистрам ЭВМ и памяти, а также задавать удобные для себя схемы адресации (например, индексную или косвенную). Кроме того, он позволяет использовать различные системы счисления (например, десятичную или шестнадцатеричную) для представления числовых констант и даёт возможность помечать строки программы метками с символическими именами с тем, чтобы к ним можно было обращаться (по именам, а не по адресам) из других частей программы (например, для передачи управления) [4] .

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

    Содержание языка [ править | править код ]

    Команды языка ассемблера один к одному соответствуют командам процессора. Фактически, они и представляют собой более удобную для человека символьную форму записи — мнемокоды — команд и их аргументов. При этом одной команде языка ассемблера может соответствовать несколько вариантов команд процессора [5] .

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

    Директивы ассемблера позволяют, в частности, включать блоки данных, задать ассемблирование фрагмента программы по условию, задать значения меток, использовать макрокоманды с параметрами.

    Каждая модель (или семейство) процессоров имеет свой набор — систему — команд и соответствующий ему язык ассемблера. Наиболее популярные синтаксисы языков ассемблера — Intel-синтаксис и AT&T-синтаксис.

    Существуют компьютеры, реализующие в качестве машинного язык программирования высокого уровня (Форт, Лисп, Эль-76). Фактически, в таких компьютерах они выполняют роль языков ассемблера.

    Возможности [ править | править код ]

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

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

    • драйверов оборудования и ядра операционной системы (по крайней мере, машинозависимых подсистем ядра ОС), тогда, когда важно временно́е согласование работы периферийных устройств с центральным процессором;
    • программ, которые должны храниться в ПЗУ ограниченного объёма и/или выполняться на устройствах с ограниченной производительностью («прошивок» компьютеров и различных электронных устройств)
    • платформо-зависимых компонентов компиляторов и интерпретаторовязыков высокого уровня, системных библиотек и кода, реализующего совместимость платформ.

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

    Ограничения [ править | править код ]

    • В силу машинной ориентации («низкого уровня») языка ассемблера человеку сложнее читать и понимать программу на нём по сравнению с языками программирования высокого уровня. Это серьёзно затрудняет сопровождение программ, написанных на языке ассемблера.
    • Программа на языке ассемблера состоит из очень «мелких» элементов — машинных команд, соответственно, объём программы в командах пропорционально больше. Поскольку, как известно, программист за единицу времени может написать и отладить примерно одно и то же число операторов, вне зависимости от языка, на котором он пишет, разработка на ассемблере больших программ оказывается существенно медленнее.
    • Усложняются программирование и отладка, растут трудоёмкость и вероятность внесения ошибок.
    • Требуется повышенная квалификация программиста для получения качественного кода: код, написанный средним программистом на языке ассемблера, обычно оказывается не лучше или даже хуже кода, порождаемого оптимизирующим компилятором для сравнимых программ, написанных на языке высокого уровня [6] . При этом чем больше объём программы, тем меньше выигрыш от использования языка ассемблера.
    • Программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы [7] , программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода [8][9] .
    • Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
    • Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

    Применение [ править | править код ]

    Исторически, если первым поколением языков программирования считать машинные коды, то язык ассемблера можно рассматривать как второе поколение языков программирования. Недостатки языка ассемблера, сложность разработки на нём больших программных комплексов привели к появлению языков третьего поколения — языков программирования высокого уровня (таких как Фортран, Лисп, Кобол, Паскаль, Си и др.). Именно языки программирования высокого уровня и их наследники в основном используются в настоящее время в индустрии информационных технологий. Однако языки ассемблера сохраняют свою нишу, обусловленную их уникальными преимуществами в части эффективности и возможности полного использования специфических средств конкретной платформы.

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

    • быстродействие (драйверы, игры);
    • объём используемой памяти (загрузочные секторы, встраиваемое (англ. embedded ) программное обеспечение, программы для микроконтроллеров и процессоров с ограниченными ресурсами, вирусы, программные защиты).

    С использованием программирования на языке ассемблера производятся:

    • Оптимизация критичных к скорости участков программ в программах на языках высокого уровня, таких как C++ или Pascal. Это особенно актуально для игровых приставок, имеющих фиксированную производительность, и для мультимедийныхкодеков, которые стремятся делать менее ресурсоёмкими и более быстрыми.
    • Создание операционных систем (ОС) или их компонентов. В настоящее время подавляющее большинство ОС пишут на более высокоуровневых языках (в основном на Си — языке высокого уровня, который специально был создан для написания одной из первых версий UNIX). Аппаратно зависимые участки кода, такие как загрузчик ОС, уровень абстрагирования от аппаратного обеспечения (hardware abstraction layer) и ядро, часто пишутся на языке ассемблера. Фактически, ассемблерного кода в ядрах Windows или Linux совсем немного, поскольку авторы стремятся обеспечить переносимость и надёжность, но, тем не менее, он там присутствует. Некоторые любительские ОС, такие как MenuetOS и KolibriOS, целиком написаны на языке ассемблера. При этом MenuetOS и KolibriOS помещаются на дискету и содержат графический многооконный интерфейс.
    • Программирование микроконтроллеров (МК) и других встраиваемых процессоров. По мнению профессора Таненбаума, развитие МК повторяет историческое развитие компьютеров новейшего времени [10] . Сейчас (2013 г.) для программирования МК весьма часто применяют язык ассемблера (хотя и в этой области широкое распространение получают языки вроде Си). В МК приходится перемещать отдельные байты и биты между различными ячейками памяти. Программирование МК весьма важно, так как, по мнению Таненбаума, в автомобиле и квартире современного цивилизованного человека в среднем содержится 50 микроконтроллеров [11] .
    • Создание драйверов. Драйверы (или их некоторые программные модули) программируют на языке ассемблера. Хотя в настоящее время драйверы также стремятся писать на языках высокого уровня (на высокоуровневом языке много проще написать надёжный драйвер) в связи с повышенными требованиями к надёжности и достаточной производительностью современных процессоров (быстродействие обеспечивает временно́е согласование процессов в устройстве и процессоре) и достаточным совершенством компиляторов с языков высокого уровня (отсутствие ненужных пересылок данных в сгенерированном коде), подавляющая часть современных драйверов пишется на языке ассемблера. Надёжность для драйверов играет особую роль, поскольку в Windows NT и UNIX (в том числе в Linux) драйверы работают в режиме ядра системы. Одна тонкая ошибка в драйвере может привести к краху всей системы.
    • Создание антивирусов и других защитных программ.
    • Написание кода низкоуровневых библиотек трансляторов языков программирования.
    Читайте также:  Доверительный платеж мтс интернет

    Связывание программ на разных языках [ править | править код ]

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

    • На этапе компиляции — вставка в исходный код программы на языке высокого уровня ассемблерных фрагментов (англ. inline assembler ) с помощью специальных директив языка. Способ удобен для несложных преобразований данных, но полноценного ассемблерного кода с данными и подпрограммами, включая подпрограммы со множеством входов и выходов, не поддерживаемых языком высокого уровня, с его помощью сделать невозможно.
    • На этапе компоновки при раздельной компиляции. Для взаимодействия компонуемых модулей достаточно, чтобы импортируемые функции (определённые в одних модулях и используемые в других) поддерживали определённое соглашение о вызове (англ. calling conventions ). Написаны же отдельные модули могут быть на любых языках, в том числе и на языке ассемблера.

    Синтаксис [ править | править код ]

    Синтаксис языка ассемблера определяется системой команд конкретного процессора.

    Набор команд [ править | править код ]

    Типичными командами языка ассемблера являются (большинство примеров даны для Intel-синтаксиса архитектуры x86):

    • Команды пересылки данных ( mov и др.)
    • Арифметические команды ( add , sub , imul и др.)
    • Логические и побитовые операции ( or , and , xor , shr и др.)
    • Команды управления ходом выполнения программы ( jmp , loop , ret и др.)
    • Команды вызова прерываний (иногда относят к командам управления): int
    • Команды ввода-вывода в порты ( in , out )
    • Для микроконтроллеров и микрокомпьютеров характерны также команды, выполняющие проверку и переход по условию, например:
    • cjne — перейти, если не равно
    • djnz — декрементировать, и если результат ненулевой, то перейти
    • cfsneq — сравнить, и если не равно, пропустить следующую команду

    Инструкции [ править | править код ]

    Типичный формат записи команд [ править | править код ]

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

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

    Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров x86, ARM, SPARC, PowerPC, M68k). Они описываются в спецификации процессоров. Возможные исключения:

    • если ассемблер использует кроссплатформенный AT&T-синтаксис (оригинальные мнемоники приводятся к синтаксису AT&T);
    • если изначально существовало два стандарта записи мнемоник (система команд была наследована от процессора другого производителя).

    Например, процессор Zilog Z80 наследовал систему команд Intel 8080, расширил её и поменял мнемоники (и обозначения регистров) на свой лад. Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel и в данный момент половина ассемблеров для Fireball работает с мнемониками Intel, а половина — с мнемониками Zilog.

    Директивы [ править | править код ]

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

    • определение данных (констант и переменных),
    • управление организацией программы в памяти и параметрами выходного файла,
    • задание режима работы компилятора,
    • всевозможные абстракции (то есть элементы языков высокого уровня) — от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования),
    • макросы.

    Пример программы [ править | править код ]

    Примеры программы Hello, world! для разных платформ и разных диалектов:

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

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

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

    Ассемблер (assembly language, assembler) является машинно-ориентированным языком программирования. В переводе с английского слово assembly означает собрание, сборка, монтаж и т. п. Выбор такого названия объясняется тем, что первые трансляторы с Алгола, Фортрана, Кобола и PL/I использовали ассемблер в качестве промежуточного языка при сборке программы из отдельных модулей.

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

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

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

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

    Специфические особенности языка

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

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

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

    Очевидным недостатком является низкий уровень абстрагирования от особенностей конкретной ЭВМ, необходимость знать и учитывать эти особенности. В то время как при работе с языками высокого уровня программист может полностью сосредоточить свое внимание на особенностях реализуемого алгоритма.

    Другим недостатком является большое, а иногда и очень большое, количество команд, выполняемых конкретной машиной. Например, у микропроцессора Pentium 4 их около 500! Это вынуждает пользоваться при работе специальными справочниками, – не держать же в голове все разнообразие имен команд и особенностей их выполнения.

    Ассемблер и макроассемблер

    С точки зрения программиста язык ассемблера является подмножеством языка макроассемблера. Последний обязательно компилирует полный набор инструкций конкретного семейства микропроцессоров и, кроме того, исполняет большой набор операторов и директив (далее макросредств) различного назначения. У программистов, работающих на компьютерах IBM PC, наибольшей популярностью пользуются макроассемблеры MASM (компании Microsoft) и TASM (компании Borland), имеющие примерно одинаковые возможности и во многом (но не полностью) совместимые. В данном разделе мы будем говорить об особенностях MASM.

    Читайте также:  Бывшая не заходит в контакт

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

    При определенных условиях исходный текст программы, выполняющей достаточно сложные действия, может содержать только макросредства. В нем не будет ни одной команды ассемблера! О какой сложности и трудоемкости программирования можно говорить в подобных случаях?

    В руководствах по MASM, в том числе и в HELP, обычно описываются 8 типов операторов и 12 типов директив, начиная с версии MASM 6.10, их количество не изменялось. В рамках данной статьи не имеет смысла приводить полное описание макросредств, поэтому мы ограничимся их общей характеристикой.

    Директивы макроассемблера предназначены для выполнения трех основных категорий действий:

    1. управление распределением оперативной памяти выполняют директивы, предназначенные для описания простых переменных, структур данных, записей и сегментирования программ;
    2. управление работой с внешними и внутренними подпрограммами, фрагментами программ и макроопределениями выполняют директивы их явного или предварительного описания и вызова;
    3. управление процессом компиляции программы выполняют директивы условной компиляции, среди них встречаются такие знакомые каждому программисту имена, как IF, ELSE, FOR, WHILE, REPEAT, GOTO.

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

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

    Ахиллесовой пятой ассемблера является трудоемкость программирования на этом языке. Что может сделать программист для упрощения собственного труда?

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

    1. В состав полной версии системы программирования на макроассемблере (дистрибутивного пакета) входит набор макроопределений и подпрограмм различного назначения и примеры их использования. Внимательно просмотрите все подкаталоги вашей версии макроассемблера, наверняка в них найдутся полезные и интересные решения, которые можно применять в вашей работе.
    2. Не забывайте о том, что при составлении программ можно использовать модули библиотек, входящих в состав систем программирования на языках высокого уровня, например, на Си. Правда, для этого надо иметь описание этих библиотек, но без него невозможно их использование и в рамках той системы программирования, для которой они созданы.
    3. Если у вас есть доступ к сети Internet, то на разных ее сайтах можно найти множество готовых решений буквально на все случаи жизни. Только обращайте внимание на даты разработки программ и подпрограмм. Многие из них морально устарели и при использовании новых инструкций микропроцессоров могут быть существенно упрощены.
    4. В процессе работы с ассемблером у вас постепенно будет накапливаться набор собственных решений, которые пригодятся в новых разработках. Для удобства их последующего использования старайтесь при написании программ составлять как можно больше подпрограмм, оформленных в виде отдельных модулей, лучше исходных, а не объектных – первые проще модифицировать в случае необходимости. Применение подпрограмм несколько увеличивает размеры задачи и замедляет процесс ее выполнения. Но взамен вы получаете возможность отлаживать большую программу по частям и использовать отлаженные подпрограммы в других своих разработках.
    5. Не забывайте о существовании такого эффективного средства, как макросы – макроопределения и макровызовы. Они позволяют сокращать не только исходный текст программы, но и количество возможных ошибок при его наборе. Кроме того, макровызовы удобно применять при запросе системных функций, которые выполняют много полезных действий таких, как работа с окнами, с файловой системой, ввод и вывод данных и пр.

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

    Когда ассемблеру нет альтернативы

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

    Обвинять в этом разработчиков компиляторов не имеет смысла, – проблема не столь тривиальна, и для ее решения нужно не только улучшать технику компиляции, но и разрабатывать принципиально новые языковые средства. Мы привыкли к тому, что арифметические и логические операции выполняются над одной парой операндов, иногда над одним операндом (смена знака или отрицание). А групповые операции современных микропроцессоров (не только семейства Pentium) могут оперировать сразу с несколькими парами операндов, количество и разрядность которых не фиксированы.

    В этой ситуации альтернативы ассемблеру просто не существует. Недаром в технической документации к компилятору "Intel C++ Compiler" рекомендуются три варианта работы с новыми командами:

    1. прямые вставки ассемблерного текста в тело программы, написанной на Си;
    2. составление процедур (подпрограмм) на языке ассемблера;
    3. использование Intrinsic (встроенные функции).

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

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

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

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

    Компания Intel разработала и продает специальный анализатор производительности микропроцессора в процессе выполнения конкретной задачи (VTuneTM Performance Analyzer 6.0). Он позволяет выявить в ней слабые места (критические участки кода задачи), и затем исправить их с помощью ассемблерных вставок.

    Подробнее о новых возможностях микропроцессоров вы можете прочитать в моей статье "Pentium глазами программиста"[1]. В Internet она опубликована на странице http://www.macro.aaanet.ru/apnd_4.html

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

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

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

    admin

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *