ПРАВИЛА ЗАПИСИ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА MSC 51

 

Исходный текст программы на языке ассемблера MSC 51 имеет определенный формат. Каждая команда представляет собой строку четырехзвенной структуры: метка – операция – операнд(ы) – комментарий. Звенья между собой могут отделяться произвольным числом пробелов. Ассемблер не различает регистр символов.

Метка. В поле метки размещается символическое имя ячейки памяти, в которой хранится отмеченная команда или операнд. Представляет собой буквенно-цифровую комбинацию, начинающуюся с буквы. Используются только буквы латинского алфавита. Длина метки для MSC 51 не должна превышать 31 символа. Метка всегда завершается двоеточием (:).

Директивы (псевдокоманды) ассемблера не преобразуются в двоичные коды, и поэтому не могут иметь меток. Исключение составляют псевдокоманды резервирования памяти и определения данных (DS, DB, DW). У псевдокоманд, осуществляющих определение символических имен, в поле метки записывается определяемое символическое имя, после которого двоеточие не ставится.

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

Операция.В поле операции записывается мнемоническое обозначение команды микроконтроллера или директивы ассемблера, которое является сокращением (аббревиатурой) полного английского наименования выполняемого действия. Например: MOV – move – переместить, DB – define byte – определить байт.

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

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

Операнд может быть задан непосредственно или в виде его адреса (прямого или косвенного). Непосредственный операнд представляется числом (MOV A, #15) или символическим именем (ADDC A, #OPER2) с указанием префикса непосредственного операнда (#). Прямой адрес операнда может быть задан мнемоническим обозначением (IN A, P1), числом (INC 40), символическим именем (MOV A, MEMORY). Указанием на косвенную адресацию служит префикс @. В командах передачи управления операндом может являться число (LCALL 0135H), метка (JMP LABEL) или косвенный адрес(JMP @)

Используемые в качестве операндов символические имена и метки должны быть определены, а числа представлены с указанием системы счисления, для чего используется суффикс (буква, стоящая после числа): В – для двоичной, Q – для восьмеричной, D – для десятичной и H – для шестнадцатеричной. Число без суффикса по умолчанию считается десятичным.

Ассемблер MSC 51 допускает использование выражений в поле операндов, значения которых вычисляются в процессе трансляции. Выражение представляет собой совокупность символических имен и чисел, связанных операторами ассемблера. Операторы ассемблера обеспечивают выполнение арифметических («+» – сложение, «–» – вычитание, * – умножение, / – целое деление, MOD – деление по модулю) и логических (OR – ИЛИ, AND – И, XOR – исключающее ИЛИ, NOT – отрицание) операций в формате 2-байтных слов.

Например, запись ADD A,#((NOT 13) + 1) эквивалентна записи ADD A,#0F3H и обеспечивает сложение содержимого аккумулятора с числом – 13, представленным в дополнительном коде.

Широко используются также операторы LOW и HIGH, позволяющие выделить младший и старший байты 2-байтного операнда.

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

 

Директивы (псевдокоманды ассемблера)

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

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

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

MOD EGU 20

приводит к тому, что в процессе ассемблирования всюду, где встретится символическое имя MOD, оно будет заменено числом 20.

Символические имена операндов, переопределяемых в процессе исполнения программы, определяются псевдокомандой SET:

 

ALFA SET 3

…..

…..

ALFA SET ALFA+1

Ассемблер MSC 51 позволяет определить символическое имя как адрес внутренних (псевдокоманда DATA), внешних (XDATA) данных или адрес бита (псевдокоманда BIT). Например, директива

FLAG BIT 25H.3

определяет символическое имя FLAG как третий вит ячейки ОЗУ с адресом 25H.

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

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

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

В соответствии с форматом команд для представления их объектных кодов отводятся одна, две или три ячейки памяти программ. В первой ячейке располагается код операции, во второй и третьей – непосредственный операнд, адрес прямоадресуемого операнда или смещение (для команд передачи управления). Для команд LCALL и LJMP во втором и третьем байтах объектного кода указывается адрес передачи управления (во втором старшая часть, в третьем – младшая).