Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Флоренсов А.Н. УП Системное программное обеспечение.docx
Скачиваний:
46
Добавлен:
28.06.2021
Размер:
148.95 Кб
Скачать

1. Основы программирования на ассемблере

1.1. Принципы построения ассемблерных программ

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

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

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

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

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

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

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

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

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

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

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

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

9. В общем случае команда ассемблера имеет вид

метка мнемокод операнды комментарии

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