Конспекты лекций. Конспект лекций. Микропроцессорные устройства систем управления
Скачать 0.73 Mb.
|
3.2. Программирование на языке ассемблера.Исходная программа (исходный модуль), написанная на языке ассемблера состоит из последовательности строк или операторов. Как правило, оператор исходного модуля содержит четыре поля, обозначаемые: "метка", "операция", "операнд", "комментарии". В поле "операция" записывают мнемоническое обозначение выполняемой команды. Например: ADD, МОV, LXI и т.д. При написании программы на языке ассемблера программист не следит за адресами команд, поэтому для того, чтобы выделить команду, к которой необходимо осуществить переход из другого места программы, ей присваивается символический адрес, называемый меткой. В процессе трансляции исходной программы в объектную программа-транслятор определит адреса всех команд и заменит символические адреса (метки) конкретными адресами. Метка проставляется в поле "метка" перед мнемоникой команды. Непосредственно после метки ставится двоеточие. Меткой может служить последовательность из цифр и латинских букв, причем первым символом должна быть буква. На длину метки ограничений не накладывается, но большинство программ-трансляторов с языка ассемблера в процессе трансляции контролирует только восемь первых символов. В качестве меток нельзя использовать мнемонические обозначения команд, названия регистров и регистровых пар. Рассмотрим пример (как мы договорились ранее, при составлении примеров будем использовать гипотетические регистры А, В и С):
В рассмотренном примере по команде безусловного перехода JMP LAB будет осуществлен переход к команде, имеющей метку LАВ, т.е. к команде MOV А,В, которая содержимое из регистра В пересылает в аккумулятор. В ходе трансляции программы в объектную программа-транслятор определит действительный адрес команды MOV А,В и поставит его в команду JMP LАВ вместо метки LАВ. Как правило, допускается наличие у одной команды нескольких меток, которые должны размещаться в разных строках, например:
В рассмотренном примере к команде RAR можно перейти, используя любую из меток МЕТА и МЕТB. В зависимости от типа команды поле "операнд" в общем случае может или ничего не содержать или содержать: Название регистра (регистровой пары). Адрес. Операнд. Названия двух регистров (регистровых пар). Название регистра (регистровой пары) и операнд. Операнды и адреса представляются в поле "операнд" символическими именами (метками), числами и выражениями. В рассмотренном выше примере при записи команды безусловного перехода JMP addr в качестве адреса была использована метка LAB, помечающая команду MOV А,В. Метки, присваиваемые операндам, имеют те же правила написания, что и метки команд, например:
Первый из операторов складывает с содержимым аккумулятора число, обозначенное меткой В5C, а второй - заносит в регистр С число, обозначенное меткой FOR. При этом в программе должно быть определено, какие именно числа соответствуют меткам В5С и FOR. Операнды и адреса могут быть представлены десятичными, двоичными, восьмеричными, шестнадцатеричными числами. Десятичное число не сопровождается никаким специальным признаком, например:
Первый из операторов вычитает из содержимого аккумулятора десятичное число 120, а второй - пересылает содержимое аккумулятора в ячейку памяти с адресом 26805. Двоичное число в поле "операнд" в большинстве языков ассемблера дополняется в конце латинской буквой В, например:
Записанный оператор производит операцию поразрядного логического умножения содержимого аккумулятора и числа 000100002 (индекс 2 указывает на то, что число двоичное). Восьмеричное число в поле "операнд" дополняется буквой О или Q, например:
Первый оператор передает в аккумулятор данные из порта, адрес которого 468, а второй - заносит в указатель стека SP число 103078. Широкое применение при написании программ получила шестнадцатеричная форма представления чисел. В шестнадцатеричной системе счисления используется 16 символов: десять цифровых (от 0 до 9) и шесть буквенных (от А до F). Ниже приведено соответствие между десятичными, двоичными и шестнадцатеричными значениями величин.
Для перевода двоичного числа в шестнадцатеричное оно разбивается на тетрады, т.е. группы по 4 разряда в каждой. При этом, если длина двоичного числа не кратна 4, оно дополняется слева нулями. После этого каждая тетрада заменяется соответствующим символом шестнадцатеричной системы. Например, двоичное число 101100 дополняется слева двумя нулями и разбивается на тетрады 0010 и 1100. После замены каждой тетрады соответствующим символом шестнадцатеричной системы получаем шестнадцатеричное число 2С (2C16). Таким образом, для представления в шестнадцатеричной системе счисления однобайтового операнда достаточно двух разрядов, а двухбайтового операнда или адреса - четырех разрядов. За шестнадцатеричным числом в поле "операнд" должна следовать латинская буква Н. Для того, чтобы шестнадцатеричное число можно было отличить от метки, оно должно начинаться с цифры. В случае, если первым символом является буква, перед числом проставляется незначащий нуль. Рассмотрим примеры:
Первый оператор пересылает в аккумулятор содержимое ячейки памяти с адресом 6СА216, второй оператор - заносит в регистровую пару BC число E06016. Кратко остановимся на представлении операндов и адресов с помощью выражений. Выражение состоит из чисел и меток, связанных арифметическими и логическими выражениями. Вычисление выражений осуществляется при трансляции исходной программы в объектную. При этом программа-транслятор в ходе этих вычислений может производить, например, такие операции, как умножение и деление, хотя МП соответствующих команд может и не иметь. Рассмотрим пример:
Данный оператор производит сравнение содержимого аккумулятора с числом 55 если, например, метка МЕТА имеет значение 2. Поле "комментарии" может содержать любой пояснительный текст, который используется только для удобства чтения программы и полностью игнорируется в процессе трансляции исходной программы в объектную. Перед комментариями в большинстве языков ассемблера ставится специальный символ, например, точка с запятой с тем, чтобы выделить его в структуре оператора для игнорирования его программой-транслятором. Слева и справа от текста в строке программы, а также между полями допустимо любое число пробелов. Небольшие по объему исходные программы на языке ассемблера не сложно транслировать в объектные программы и ручным путем, используя приводимые в системе команд двоичные машинные коды. При ручной трансляции исходной программы оператор дополняется слева двумя полями: полем "адрес" и полем "код". Таким образом, порядок расположения полей в рассматриваемом случае следующий: "адрес", "код", "метка", "операция", "операнд", "комментарии". Поле "адрес" содержит адреса ячеек памяти, в которых размещаются коды первых байтов команд. Поле "код" содержит коды команд. Оба поля заполняются числами в шестнадцатеричном представлении, причем буква Н в конце не проставляется. В общем случае в языках ассемблера выделяют следующие группы операторов: операторы машинных команд, операторы псевдокоманд, макрокоманды, команды управления ассемблером. Операторы машинных команд представляют собой мнемоническую запись машинных кодов МП. Каждый такой оператор в результате трансляции преобразуется в соответствующую машинную команду. Команды, образующие операторы машинных команд, содержатся в системе команд МП. Все рассмотренные раннее примеры операторов принадлежат группе операторов машинных команд. В процессе трансляции исходной программы в объектную программа-транслятор ассемблер нуждается в некоторых уточнениях. Например, ассемблер не знает, в какую ячейку памяти должна быть помещена первая команда программы. Эта и другая информации, необходимая для работы ассемблера, вводится в виде так называемых операторов псевдокоманд. Приставка "псевдо" указывает на то, что такие команды не отображаются машинными кодами в объектной программе, а используются только в процессе трансляции. Мнемоника и состав таких команд для каждого языка ассемблера индивидуальны. Макрокомандой можно назвать такой оператор, который при трансляции в объектную программу заменяется последовательностью других операторов. Для определения макрокоманды вводятся понятие макроопределения. Макроопределение представляет собой последовательность операторов, задаваемых макрокомандой. Макроопределение может находиться как в тексте основной программы, но чаще всего в библиотеке макроопределений. Команды управления ассемблером не являются элементом языка программирования, а служат для организации диалогового режима между программистом и ЭВМ, на которой осуществляется ассемблирование. Операторы этой группы могут управлять режимами выдачи листинга, обеспечивать выбор внешних устройств для ввода программы и вывода результатов трансляции и прочие аналогичные функции. |