Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ВТ_4 часть.doc
Скачиваний:
10
Добавлен:
16.09.2019
Размер:
550.91 Кб
Скачать

10.3. Уровни языков программирования.

Разработка прикладных программ проводится на языке программирования одного из трёх уровней: машинном языке, языке ассемблера или языке высокого уровня.

Рассмотрим особенности использования языка того или иного уровня.

Машинный язык или язык двоичных символов является "родным" языком всех МПС и ЭВМ.

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

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

Это позволяет оптимизировать программу с точки зрения её размеров и времени исполнения.

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

Это неудобно в особенности при протяжённых программах с большим числом условных переходов.

Кроме того, программа, составленная в машинных кодах трудна для понимания и модификации.

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

Язык ассемблера вместо двоичных кодов операций использует их символические буквенные обозначения – мнемоники.

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

Например, мнемоника JMP (jump – прыгать) соответствует команде условного перехода, MOV (move – передвигать) – команде пересылки данных и т.д.

С помощью мнемоник записываются также данные и адреса, используемые в программе.

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

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

Программа на языке ассемблера состоит из ряда строк. Каждая строка имеет определённый формат и содержит только один оператор или команду.

Строка ассемблера состоит, как правило, из четырёх полей:

Поле метки

Поле кода операции

Поле операндов

Поле комментария

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

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

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

Строка символов таких операторов начинается как минимум с одного пробела.

После трансляции программы на машинный язык метка автоматически заменяется соответствующим абсолютным адресом памяти.

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

Поле метки отделяется от поля кода операции двоеточием.

Поле кода операции содержит мнемоники кодов операций или директив ассемблера.

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

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

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

Поэтому директивы ассемблера на машинный язык не транслируются.

Поле кода операций отделяется от поля операндов одним пробелом.

Поле операндов содержит один или два операнда, разделяемые запятой.

Операнды отражают информационное содержание команд МП и директив ассемблера, указанных в поле кода операции.

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

Численные константы представляются в различных системах счисления с помощью специальных идентификаторов (имён), записанных непосредственно за числом: B – двоичная, Q – восьмеричная, H – шестнадцатеричная, отсутствие идентификатора или D – десятичная.

Символьные константы заключаются в апострофы (') или кавычки.

Имена, используемые в поле операндов, могут быть:

  • метками, применяемыми в поле меток других операторов;

  • данными, определяемыми программистом с помощью директив присвоения;

  • зарезервированными словами ассемблера, например идентификаторами внутренних регистров МП.

Поле комментария начинается с разделителя – точки с запятой (;).

В поле комментария помещается краткое пояснение действий, осуществляемых данным оператором.

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

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

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

Язык ассемблера, как и машинный язык, требует от программиста свободного владения архитектурой соответствующей МПС.

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

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

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

Макрокоманда ассемблера представляет собой последовательность операторов ассемблера, заключённую в так называемые операторные скобки.

Открывающая операторная скобка имеет мнемонику MACRO, а закрывающая – мнемонику ENDM.

Эти мнемоники не входят в систему команд МП, а являются директивами языка ассемблера.

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

Имя макрокоманды записывается в поле меток той строки ассемблера, которой начинается макрокоманда.

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

Макрокоманда заканчивается строкой, поле операторов которой содержит мнемонику ENDM.

Группа операторов, расположенных между директивами MACRO и ENDM, представляет тело макрокоманды и может содержать любые мнемоники соответствующих машинных кодов, директив, комментариев и т.п.

Тело макрокоманды транслируется на машинный язык только единожды.

Далее, встречая имя макрокоманды, транслятор автоматически включает тело макрокоманды в объектную программу (в программу на машинном языке).

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

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

Трансляция программы с языка высокого уровня в последовательность машинных команд конкретной МПС осуществляется с помощью специальных программ – компилятора или интерпретатора.

При компилировании образуется полная объектная программа, готовая к исполнению данной микропроцессорной системой.

Интерпретатор в отличие от компилятора не создаёт полной объектной программы, а последовательно транслирует операторы программы в машинные коды.

В последнем случае из-за отсутствия возможности оптимизации программы существенно увеличивается время её исполнения.

Кроме того, увеличивается и время отладки программы.

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

По этим причинам большинство языков высокого уровня ориентировано на использование компиляторов.

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

Поэтому языки программирования высокого уровня являются доминирующими при программировании МПС.

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