
Kharakhnin / Аналоговые и цифр. устройства авт. пособие
.pdfКоманда 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