Ассемблеры для операционной системы DOS



ЯЗЫКИ ПРОГРАММИРОВАНИЯ НИЗКОГО УРОВНЯ

Конспект лекций

Введение в программирование на языках низкого уровня. Средства программирования на низком уровне

 

Преимущества знания низкоуровневых языков

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

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

Преимущества, которые дает знание ассемблера:

1. Глубокое понимание работы компьютера и операционной системы

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

2. Максимальная гибкость при работе с аппаратными ресурсами

Используя ассемблер, можно делать с аппаратурой компьютера все что угодно. Языки же высокого уровня ограничены компилятором и используемыми библиотеками. Такие современные языки, как Java и C#, вообще не позволяют работать с аппаратными ресурсами и операционной системой напрямую.

3. Оптимизация программ по скорости выполнения

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

4. Оптимизация программ по размеру кода

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

5. Дизассемблирование и отладка

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

 

Понятие низкоуровневого программирования

Низкоуровневое программирование – это программирование, основанное на прямом использовании возможностей и особенностей конкретной вычислительной системы. Для того чтобы писать программы на этом уровне, необходимо знать архитектуру аппаратной части системы:

структуру и функционирование системы в целом;

организацию оперативной памяти;

состав внешних устройств, их адреса и форматы регистров;

организацию и функционирование процессора, состав и форматы его регистров, способы адресации, систему команд;

систему прерываний и т. д.

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

В истории развития программирования существовали три разновидности низкоуровневых языков, последовательно сменивших друг друга:

машинный код;

мнемокод;

ассемблер.

В машинных кодах программа представляется в виде последовательности чисел, являющихся кодами команд процессора, адресами оперативной памяти, номерами регистров процессора и внешних устройств и т. д. Фрагмент последовательности кодов команд микропроцессора с архитектурой Intel для добавления двухбайтового слова с адресом 36 к слову с адресом 32:

Адрес    Код

0000      A1

0001      20

0002      00

0003      03

0004      06

0005      24

0006      00

0007      A3

0008      20

0009      00

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

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

Movax,ds:[32]

Add ax,ds:[36]

Mov ds:[32],ax

В этом фрагменте уже виден смысл команд, из которых складывается сложение двух слов памяти. 

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

 

Назначение языков ассемблера

Ассемблер (от англ. assemble — собирать) — компилятор с языка ассемблера в команды машинного языка.

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

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

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

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

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

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

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

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

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

Достоинства языков ассемблера.

1. Максимально оптимальное использование средств процессора, использование меньшего количества команд и обращений в память и, как следствие, большая скорость и меньший размер программы. 

2. Использование расширенных наборов инструкций процессора(MMX, SSE, SSE2, SSE3).

3. Доступ к портам ввода-вывода и особым регистрам процессора (вбольшинстве ОС эта возможность доступна только на уровне модулей ядра и драйверов) 

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

5. Максимальная адаптация для нужной платформы.

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

Технология W^X используется в OpenBSD , в других BSD-системах, в Linux. В Microsoft Windows (начиная с Windows XP SP2) применяется схожая технология DEP.

Недостатки языков ассемблера.

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

2. Трудоемкость чтения и поиска ошибок (хотя здесь многое зависит откомментариев и стиля программирования).

3. Часто компилятор языка высокого уровня, благодаря современнымалгоритмам оптимизации, даёт более эффективную программу (по соотношению качество/время разработки). 

4. Непереносимость на другие платформы (кроме совместимых).

5. Ассемблер более сложен для совместных проектов.

 

На языке ассемблера пишут:

1) программы, требующие максимальной скорости выполнения: ядра операционных систем реального времени, основные компоненты компьютерных игр и критичные по времени участки программ;

2) программы, взаимодействующие с внешними устройствами: драйверы, программы, работающие напрямую с портами, звуковыми и видеокартами;

3) программы, использующие полностью возможности процессора: ядра многозадачных операционных систем, серверы;

4) программы, полностью использующие возможности операционной системы: вирусы, антивирусы, защита от несанкционированного доступа, программы обхода защиты от несанкционированного доступа.

 

Ассемблеры для операционной системы DOS

Наиболее известными ассемблерами для операционной системы DOS являлись пакеты Borland Turbo Assembler (TASM) и Microsoft Macro Assembler (MASM). Также в свое время был популярен простой ассемблер A86. Изначально они поддерживали лишь 16-битные команды (до появления процессора Intel 80386). Более поздние версии TASM и MASM поддерживают и 32-битные команды, а также все команды, введенные в более современных процессорах, и системы команд, специфические для конкретной архитектуры (такие, как MMX, SSE, 3DNow! и т. д.).

Особенностью TASM всегда была быстрота трансляции и обширный набор макросредств. Кроме поддержки стандартного режима, совместимого с ассемблером MASM, данный ассемблер поддерживал также расширенный режим «IDEAL». Несмотря на то что уже много лет Turbo Assembler не поддерживается корпорацией Borland, он до сих пор популярен в кругах программистов.

 

 


Дата добавления: 2018-06-27; просмотров: 1057; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!