Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Kharakhnin / Система команд миконтроллера

.pdf
Скачиваний:
50
Добавлен:
08.03.2016
Размер:
1.36 Mб
Скачать

XRL A,#0F5H;

; После выполнения команды: (A)=36H.

5. XRL <direct>,A <direct> <direct> (A).

Пример: ; До выполнения команды: (A)=31H, (P1)=82H. XRL P1,A;

;После выполнения команды: (A)=31H, (P1)=0B3H.

6.XRL <direct>,#<data> , <direct> <direct> <data>.

Пример: ; До выполнения команды: (P1)=77H. XRL P1,#77H;

;После выполнения команды: (P1)=00H.

В табл.2 приведены команды ОМК, разделенные по группам: команды передачи данных; арифметические команды, логические команды; команды передачи управления, операции с битами.

3. Правила написания программ на языке ASSEMBLER

Исходный текст программы на языке ассемблера имеет определенный формат. Каждая команда и директива представляет собой строку:

МЕТКА ОПЕРАЦИЯ ОПЕРАНД(Ы) КОММЕНТАРИИ

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

3.1.Метка

Вполе метки размещается символическое имя ячейки памяти, в которой хранится отмеченная команда или операнд. Метка представляет собой буквенноцифровую комбинацию, начинающуюся с буквы. Используются только буквы латинского алфавита. Ассемблер допускает использование в метках символа подчеркивания “_” . Метка всегда завершается двоеточием “ : ”.

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

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

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

3.2.Операция

Вполе операции записывается мнемоническое обозначение команды или директивы ассемблера, которое является сокращением (аббревиатурой) полного

31

английского наименования выполняемого действия. Например: MOV - move - переместить, JMP - jump - перейти, DB - define byte - определить байт.

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

3.3.Операнды

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

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

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

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

Выражение представляет собой совокупность символических имен и чисел, связанных операторами ассемблера. Операторы ассемблера обеспечивают выполнение арифметических (“+” - сложение, “-” - вычитание, “*” - умножение, “/” - целое деление, MOD – деление по модулю) и логических (OR - ИЛИ, AND - И, XOR - исключающее ИЛИ, NOT - отрицание) операций в формате 2-байтных слов. Например, запись ADD A, #((NOT 13)+1) эквивалентна записи ADD A, #0F3H и обеспечивает сложение содержимого аккумулятора с числом -13, представленным в дополнительном коде.

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

3.4. Комментарий

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

32

4. Директивы ассемблера

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

Ассемблер поддерживает ряд директив, которые позволяют дать символическое определение переменным, резервируют и инициализируют пространство памяти, определяют расположение сгенерированного объектного кода в памяти. За исключением DB и DW директивы не производят объектный код. Директивы используются, чтобы изменить состояние ассемблера, определить объекты и добавить информацию к объектному файлу.

Рассмотрим основные наиболее часто употребляемые директивы ассемблера.

4.1. Директивы символических определений

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

Директива

 

Описание

BIT

 

Определяет символическое имя, ссылающееся на адрес бита.

Формат директивы:

symbol BIT bit-address,

 

где

symbol - символическое имя,

 

 

bit-address - адрес бита в резидентной памяти данных.

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

нены или переопределены.

Пример:

 

 

 

ALARM

BIT

P1.0

;бит включения сигнализации;

IM1

BIT

ALARM+1 ;бит включения первого испол-

 

 

 

;нительного механизма P1.1.

DATA Определяет символическое имя, ссылающееся на адрес резидентной памяти данных.

Формат директивы: symbol DATA address,

33

где symbol - символическое имя, которое может использоваться во всей программе,

address - адрес резидентной памяти данных, должен находиться в диапазоне от 0 до 255.

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

Пример:

 

 

SERBUF

DATA

SBUF

RESULT

DATA

40H

RESULT2

DATA

RESULT + 2

PORT1

DATA

90H

EQU Назначает символическому имени числовое значение или имя регистра.

Формат директивы: Symbol EQU expression symbol EQU register,

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

expression - числовое выражение.

register - одно из следующих имен регистра: A, R0-R7. Символические имена, определенные директивой, могут использоваться в

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

Пример:

BUF_DISPL EQU 20H

SERIAL

EQU

SBUF

COUNT

EQU

R5

IDATA

Определяет символическое имя, ссылающееся на косвенно ад-

 

ресуемый адрес резидентной памяти данных.

Формат директивы: symbol IDATA expression,

symbol - символическое имя, которое заменяется на выражение во всей ассемблерной программе,

expression - числовое выражение.

Пример:

 

 

BUFFER

IDATA

60H; Начало буфера

BUF_LEN

EQU

20H; Длина буфера

BUF_END

IDATA

BUFFER + BUF_LEN – 1; Конечный адрес

буфера.

34

SET Назначает символическое имя числовому значению или регистру. Имя может быть впоследствии изменено с помощью директивы SET.

Формат директивы:

symbol SET expression

 

symbol SET register,

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

expression - числовое выражение,

register - одно из следующих имен регистра: A, R0-R7. Символические имена, определенные директивой, могут использоваться в

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

SET.

Пример:

COUNTER SET R1; Указание на регистр R1 для работы его в качестве счетчика.

XDATA Определяет символическое имя, ссылающееся на адрес внешней памяти данных.

Формат директивы: symbol XDATA address,

где symbol - символическое имя, которое может использоваться во всей программе,

address - адрес внешней памяти данных, должен находиться в диапазоне от 0 до 65535.

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

Пример:

 

 

OZU_ORG

XDATA

0800H; Адрес начала области внешнего ОЗУ.

OZU_END

XDATA

0FFFH; Адрес конца области внешнего ОЗУ.

4.2. Директивы резервирования и инициализации памяти

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

DB Заносит в память программ байтовую константу. Директива имеет следующий формат: label: DB expression , expression …,

35

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

Директива DB может быть определена только внутри сегмента кода. Если директива используется в другом сегменте, ассемблер генерирует сообщение об ошибке.

Пример: TABLE: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH

DBIT Резервирует пространство в битовом сегменте (20Н – 2FH). Директива имеет следующий формат: Метка: DBIT выражение.

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

Пример:

 

 

 

 

ON_FLAG:

DBIT

1

;резервируется 1 бит.

OFF_FLAG:

DBIT

1

 

 

DS

Резервирует пространство памяти в текущем сегменте.

Директива имеет следующий формат:

label: DS expression,

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

Директива резервирует пространство в текущем сегменте по текущему адресу. Затем текущий адрес увеличивается на значение выражения. Сумма счётчика адреса и значения выражения не может превышать границу текущего адресного пространства.

Пример: TIME: DS 8

DW Инициализирует память значением слова.

Директива DW инициализирует память программ 16-разрядными значениями слова. Директива имеет следующий формат:

label: DW expression , expression …,

где label: - метка, присвоенная адресу зарезервированной памяти, expression - выражения - данные, которые могут содержать символ, символьную строку или выражение.

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

Пример: TABLE: DW 3F06H, 5B4FH, 666DH, 7D07H,7F6FH

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

36

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

END Сообщает о конце транслируемого модуля.

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

Пример: ORG 0100H

.

END

ORG Изменяет значение ассемблерного счётчика адреса текущего сегмента программы.

Директива ORG ( начало) имеет следующий формат: ORG выражение. Значением выражения является допустимый шестнадцатиразрядный адрес,

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

Пример: ORG

0000H

; Стартовый адрес прикладной программы

JMP

START

;

ORG 000BH

; Адрес - вектор прерывания при переполнении

JMP INT_TIMER0

 

; таймера счетчика 0.

USING Выбирает номер банка регистров общего назначения. Формат директивы: USING expression,

где expression

- № банка регистров.

Пример:

USING 1 ; Использование первого банка регистров.

Задания для самостоятельной проработки материала

1.Разработать программу для тестирования внутреннего (IRAM) и внешнего двухкилобайтного (ERAM) ОЗУ. Адреса внешнего ОЗУ с 0800Н по 0FFFH. Проверочные коды 55Н и ААН.

2.Разработать программу для обнуления ячеек с адреса 09Н по 70Н внутреннего ОЗУ (IRAM) и области ячеек с 0800Н по 0900Н внешнего

(ERAM) ОЗУ.

3.Разработать программу для сохранения данных регистров нулевого банка (IRAM) во внешнем ОЗУ (ERAM), начиная с адреса 0900Н.

37

4.Разработать программу для передачи данных из внешнего ОЗУ (ERAM) с адреса 0А00Н по 0А0FH в регистры 1 и 2 банков внутреннего ОЗУ

(IRAM).

5.Разработать программу для подсчета числа внешних импульсов на входе P3.4 (T0) SMC за одну секунду, результат счета разместить в 20Н и 21Н ячейках IRAM.

6.Разработать программу для сложения многобайтных чисел.

7.Разработать программу для вычитания многобайтных чисел.

8.Разработать программу для сдвига двухбайтного содержимого ячеек 10Н и 11Н влево на один разряд.

9.Разработать программу, обеспечивающую подсчет 10 нулевых импульсов на входе Т1 (P3.5), после чего установить в “1” все разряды порта Р2.

10.Разработать программу, обеспечивающую последовательную выдачу “1” в разряды порта Р1, при поступлении на вход INT0=0 наступает прерывание и в порт Р1 выдать число 55Н.

11.Разработать программу, обеспечивающую подсчет числа импульсов на входе Т1, при первом переполнении счетчика обнулить Р1, при втором переполнении в порт выслать ААН.

12.Разработать программу, обеспечивающую вывод “0” (через 1 секунду) в разряды порта Р2, при INT0 = 0 наступает прерывание и в порт Р2 высылается код 33Н.

13.Разработать программу, обеспечивающую: если Р3.0 = 1, а Р3.1 = 0, начать счет импульсов счетчиком Т0. При Р3.1 = 1 счет прекратить.

14.Разработать программу, обеспечивающую эффект “ бегущая 1 “ порте Р2, время переключения разрядов порта 1 секунда (сформировать таймером Т1).

15.Разработать программу инвертирования всех программно доступных битов в области IRAM с 20Н по 2FH.

16.Разработать программу, формирующую серию из 10 прямоугольных импульсов в разряде порта Р2.0, длительность импульса 65535 микросекунд.

Библиографический список:

1. Однокристальные микроЭВМ.- М.: МИКАП, 1994. - 400 с.

38

39

40