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

Kharakhnin / Аналоговые и цифр. устройства авт. пособие

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

Команда SUBB A,<байт источника>.

Команда “ вычитание с заемом ” вычитает указанную переменную вместе с флагом переноса из содержимого аккумулятора. Команда устанавливает флаг С, если вычитаемое больше уменьшаемого, в противном случае флаг С = 0. Флаг вспомогательного переноса АС устанавливается, если заем необходим для бита 3, и сбрасывается в противном случае. Флаг переполнения OV необходим, если заем необходим для бита 6, но его нет для бита 7 или есть для бита 7, но нет для бита 6.

Алгоритм: (A) (A) - <байт источника> - (С).

Рассмотрим имеющиеся команды вычитания с заемом.

1. SUBB A,Ri , где Ri - один из регистров R0 – R7, (A) (A) – (Ri) – (C).

Пример: ;До выполнения команды: (А)=0C9H, (R4)=54H, (C)=1. SUBB A,R4;

;После выполнения команды: (A)=74H, (R4)=54H, (C)=0, (AC)=0, (OV)=1.

2.SUBB A,<direct>, где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или реги-

стром специальных функций. (A) (A) - <direct> - (C). Пример: ;До выполнения команды: (А)=97H, (P3)=25H, (C)=0.

SUBB A,P3;

;После выполнения команды: (A)=72H, (P3)=25H, (C)=0, (AC)=0, (OV)=1.

3.SUBB A,@RI ,где Ri - один из регистров R0 или R1, (A) (A) – (Ri)

– (C).

Пример: ;До выполнения команды: (А)=49H, (ОЗУ[21H])=68H, (C)=1, (R0)=21H.

SUBB A,@R0;

;После выполнения команды: (A)=0E0H, (ОЗУ[21H])=68H, (C)=1, (AC)=0, (OV)=0, (R0)=21H.

4.SUBB A,#<data> , (A) (A) - <data> (C).

Пример: ;До выполнения команды: (А)=0BEH, (C)=0. SUBB A,#3FH;

;После выполнения команды: (A)=7FH, (C)=0, (AC)=1, (OV)=1.

71

Команда SWAP A.

Команда “ обмен тетрадами внутри аккумулятора” осуществляет обмен между четырьмя младшими и четырьмя старшими битами аккумулятора. На флаги команда не влияет.

Алгоритм: (A[3-0]) (A[4-7]), (A[7-4]) (A[3-0]).

Пример: ;До выполнения команды: (А)=0BEH=10111110B. SWAP A;

;После выполнения команды: (A)=11101011B=0EBH.

Команда XCH A,<байт>.

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

Алгоритм: (A) <байт>, <байт> (А).

Рассмотрим имеющиеся команды:

1. XCH A,Ri , где Ri - один из регистров R0 – R7, (A) (Ri).

2. XCH A,<direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром специальных функций. (A) <direct>.

3. XCH A,@Ri , где Ri - один из регистров R0 или R1. (A) ((Ri)).

Пример: ;До выполнения команд: (A)=05H, (P2)=0FFH,

(ОЗУ[20H])=0AAH, (R0)=20H, (R5)=0CCH. XCH A,R5; (A)=0CCH, (R5)=05H. XCH A,P2; (A)=0FFH, (P2)= 0CCH.

XCH A,@R0; (A)=0AAH, (ОЗУ[20H])=0FFH.

;После выполнения команд: (R5)=05H, (P2)=0CCH, (A)=0AAH, (ОЗУ[20H])=0FFH.

Команда XCHD A,@Ri .

Команда

“ обмен тетрадой ” выполняет обмен младшей тетрады

аккумулятора

с

содержимым младшей тетрады

ячейки внутреннего

ОЗУ, косвенная адресация к которой производится

с помощью

указан-

ного регистра. На старшие биты [7- 4] эта команда не влияет.

 

Алгоритм:

XCHD A,@Ri , где Ri – один из регистров R0

или R1,

 

 

72

 

 

(A[3-0]) ((Ri[3-0])), ((Ri[3-0])) (A[3-0]).

Пример: ;До выполнения команды: (A)=89H, (R0)=20H,

(ОЗУ[20H])=0FEH. XCHD A,@R0;

;После выполнения команды: (A)=8EH, (R0)=20H,

,(ОЗУ[20H])=0F9H.

Команда XRL <байт назначения>, <байт источника>.

Команда “логическое “ИЛИ ИСКЛЮЧАЮЩЕЕ” для переменных байтов” выполняет операцию “ ИЛИ ИСКЛЮЧАЮЩЕЕ ” над битами указанных переменных, записывая результат в байт назначения. На флаги команда не влияет.

Рассмотрим имеющиеся команды:

1.XRL A,Ri , где Ri - один из регистров R0 – R7, (A) (A) (Ri).

Пример: ; До выполнения команды: (A)=0C3H, (R7)=0AAH. XRL A,R7;

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

2.XRL A,<direct> , где direct – прямоадресуемый байт, который может быть ячейкой внутреннего ОЗУ (00Н - 7FH) или регистром

специальных функций. (A) (A) <direct>.

Пример: ; До выполнения команды: (A)=0FH, (P2)=0A6H. XRL A,Р2;

;После выполнения команды: : (A)=0A9H, (P2)=0A6H.

3.XRL A,@Ri , где Ri – один из регистров R0 или R1, (A) (A) ((Ri)).

Пример: ; До выполнения команды: (A)=55H, (R0)=77H,

(ОЗУ[77])=5AH. XRL A,@R0;

;После выполнения команды: (A)=0FH, (R0)=77H,

(ОЗУ[77])=5AH.

4. XRL A, #<data>, (A) (A) <data>.

Пример: ; До выполнения команды: (A)=0C3H. XRL A,#0F5H;

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

73

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 приведены команды М, разделенные по группам: команды передачи данных; арифметические команды, логические команды; команды передачи управления, операции с битами.

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

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

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

КОММЕНТАРИИ

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

2.3.1.Метка

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

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

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

74

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

2.3.2.Операция

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

мер: MOV - move - переместить, JMP - jump - перейти, DB - define byte -

определить байт.

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

2.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 – для шестнадцатеричной. Число без суффикса по умолчанию считается десятичным.

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

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

75

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

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

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

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

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

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

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

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

76

2.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,

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

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

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

Пример:

 

 

SERBUF

DATA

SBUF

RESULT

DATA

40H

RESULT2

DATA

RESULT + 2

PORT1

DATA

90H

 

 

77

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; Конечный адрес

буфера.

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

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

symbol SET expression

 

symbol SET register,

78

где 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; Адрес конца области внешнего ОЗУ.

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

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

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

79

где 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 - выражения - данные, которые могут содержать символ, символьную строку или выражение.

80