ОМК выполняет действия над 8-разрядными операндами. Программная модель центрального процессора 8051 (рисунок 6) содержит шесть регистров. Все регистры, кроме программного счетчика (счетчика команд) PC, являются частью объединенного адресного пространства ОЗУ данных. Для обращения к ним могут быть использованы как символьные имена регистров ‑ АСС, В, PSW, SP, DPH, DPL, так и их абсолютные адреса ‑ 0E0h, 0F0h, 0D0h, 81h, 82h, 83h соответственно.
Аккумулятор ACС | ||||||||||||||||
Регистр B | ||||||||||||||||
Регистр косвенной адресации DPTR | ||||||||||||||||
Программный счетчик PC | ||||||||||||||||
Указатель стека SP | ||||||||||||||||
Регистр признаков PSW | ||||||||||||||||
C | AC | F0 | RS1 | RS0 | OV | P | ||||||||||
Рисунок 6.- Программная модель центрального процессора |
Аккумулятор (ACС) является источником операнда и местом фиксации результата при выполнении арифметических, логических операций и ряда операций передачи данных. Кроме того, только с использованием аккумулятора могут быть выполнены операции сдвигов, проверка на нуль, формирование флага паритета и т.п.
|
|
Регистр B ‑ дополнительный 8-разрядный регистр. Используется в операциях умножения и деления. В других командах может интерпретироваться как регистр общего назначения.
Регистр-указатель данных DPTR ‑ 16-разрядный регистр (DPH ‑ старший байт, DPL ‑ младший байт). Используется как регистр косвенной адресации при обращении к памяти команд и внешней памяти данных. Система команд предусматривает возможность обращения к отдельным байтам (DPH или DPL) регистра DPTR, что позволяет использовать эти регистры для хранения промежуточных результатов вычислений или как источник одного из операндов.
Программный счетчик PC ‑ 16-разрядный регистр, содержит адрес текущей команды либо адрес операнда, используемого в текущей команде. После сброса микроконтроллера (МК) программный счетчик автоматически устанавливается в «0». Поэтому в МК с процессорным ядром MCS-51 любая программа пользователя должна начинаться с адреса 0000h. Команды обращения к РС отсутствуют. Однако он программно доступен с помощью специальных процедур.
|
|
Указатель стека SP ‑ 8-разрядный регистр, содержит адрес вершины стека. Архитектура процессорного ядра MCS-51 предполагает размещение области стековой памяти только в области внутреннего ОЗУ данных. Глубина стека ограничена объемом резидентного ОЗУ. При сбросе ОМК указатель стека устанавливается в состояние 07h, назначая область стека в первый банк регистров. Поэтому при использовании стека после сброса необходимо задавать требуемое значение SP. Обычно вершина стека размещается в старших адресах свободной зоны.
При записи в стек (команда PUSH), содержимое указателя SP увеличивается на 1, а при чтении (команда POP) – уменьшается на 1. Указатель стека аппаратно увеличивается на 2 при выполнении команд вызова подпрограммы (CALL) и обращении к подпрограмме обработки прерываний и уменьшается на 2 при выполнении команд возврата RET, RETI. В стек при этом соответственно записывается или извлекается содержимое РС.
Слово состояния процессора ССП (PSW) При выполнении большинства команд в АЛУ формируется ряд признаков операции (флагов), которые фиксируются в регистре ССП. В таблице 2 приводится перечень флагов ССП, даются их символические имена и описываются условия их формирования.
Формат слова состояния процессора PSW
Таблица 2
Символ | Позиция | Имя и назначение | ||
C | PSW.7 | Флаг переноса из старшего разряда. Устанавливается и сбрасывается при выполнении арифметических и логических операций аппаратно. Возможно изменение значения С программными средствами. | ||
AC | PSW.6 | Флаг вспомогательного переноса из третьего разряда в четвертый. Устанавливается и сбрасывается только аппаратными средствами при выполнении команд сложения и вычитания. | ||
F0 | PSW.5 | Флаг 0. Может быть установлен, сброшен или проверен программой как флаг, специфицируемый пользователем. | ||
RS1 RS0 | PSW.4 PSW.3 | Выбор банка регистров. Устанавливается и сбрасывается программой для выбора рабочего банка регистров (см. примечание) | ||
OV | PSW.2 | Флаг арифметического переполнения. Устанавливается и сбрасывается аппаратно при выполнении арифметических операций | ||
‑ | PSW.1 | Не используется | ||
P | PSW.0 | Флаг паритета. Устанавливается и сбрасывается в каждом цикле команды только аппаратно. Принимает значение 1 при четном числе единичных бит в аккумуляторе. | ||
Примечание. | RS1 | RS0 | Банк | Границы адресов |
00H-07H | ||||
08H-0FH | ||||
10H-17H | ||||
18H-1FH |
Наиболее «активным» флагом ССП является флаг переноса, который принимает участие и модифицируется в процессе выполнения многих операций, включая сложение, вычитание и сдвиги. Кроме того, флаг переноса (C) выполняет функции «булевого аккумулятора» в командах, манипулирующих с битами.
Флаг арифметического переполнения (OV) фиксирует превышение длины разрядной сетки при операциях над целыми числами со знаком.
Флаг АС используется в процедуре коррекции результата при выполнении двоично-десятичного сложения.
Флаг паритета Р обеспечивает контроль передаваемой информации. Значение бита паритета изменяется при любой операции, в которой АСС является приемником результата. При приеме информации выполняется повторное формирование Р, а затем производится сравнение битов паритета, вычисленных при приеме и передаче информации.
АЛУ не управляет флагами селекции банка регистров (RS0, RS1) и F0. Их значения полностью определяются прикладной программой.
В регистре признаков отсутствуют флаги нулевого Z и отрицательного N результатов. Признак нулевого состояния аккумулятора формируется аппаратно во всех командах, в которых аккумулятор является приемником результата. В регистре признаков равенство нулю не отображается. Команды условного перехода по признаку Z (JZ и JNZ) следует использовать после выполнения команд, в которых результат операции записывается в аккумулятор.
|
|
Признак знака результата фиксируется в старшем бите АСС и доступен с помощью битовых команд условных переходов (JB, JNB).
Назначение и функции регистров специальных функций подробно рассмотрены в разделе 4.
РПД разделена на 3 зоны, каждая из которых имеет свои функциональные особенности:
Зона регистров общего назначения (РОН) состоит из 4-х банков, расположенных с адреса 00h по 1Fh. Каждый банк состоит из 8 ячеек РПД. После сброса, активным является нулевой банк. Номер банка устанавливается в слове состояния процессора. Достоинством этой зоны является возможность использования прямой регистровой адресации. Команды работы с регистрами однобайтовые и выполняются за минимальное время (1мкс). Обычно в этой зоне располагают регистры временного хранения информации. Исключение составляют регистры R0, R1 каждого банка, которые могут использоваться как регистры косвенной адресации при обращении к РПД или как индексные регистры при обращении к внешней памяти данных.
Зона регистров специальных функций (РСФ) расположена с адреса 80h по 0FFh. В ней находятся основные регистры данных и управления.
Обращение к РСФ возможно только с указанием прямого адреса. В 8051 используется только часть адресов зоны РСФ. Неиспользованные адреса зарезервированы для развития ОМК данной серии.
8051 предоставляет большие возможности для работы с битовыми переменными, которые должны быть расположены в битовой зоне. Битовое пространство начинается в битовой зоне РПД (адреса 20h-2Fh), а заканчивается в зоне регистров специальных функций. Обращение к битам возможно только с использованием команд прямой битовой адресации. Адресное пространство битовой зоны и РПД имеют различную метрику.
Cвободная зона ‑ особенностей по способам адресации не имеет.
Структура адресного пространства РПД представлена на рисунке 7. РПД представляет собой единое адресное пространство, каждая зона которого обладает определенными особенностями. В тоже время имеется возможность обращаться к любой ячейке памяти РПД, используя прямую или косвенную адресации.
|
|
Наличие зон, обладающих различными функциональными возможностями, при грамотном их использовании позволяет минимизировать как длину кода программ, так и время их выполнения.
Адрес | Регистр | |||||||||||||||||
7Fh 30h | Ячейки резидентного ОЗУ (свободная зона) | 0FFh | ||||||||||||||||
2Fh | 7F | 7E | 7D | 7C | 7B | 7A | 0F0h | F7 | F6 | F5 | F4 | F3 | F2 | F1 | F0 | B | ||
2Eh | ||||||||||||||||||
2Dh | 6F | 6E | 6D | 6C | 6B | 6A | 0E0h | E7 | E6 | E5 | E4 | E3 | E2 | E1 | E0 | A | ||
2Ch | ||||||||||||||||||
2Bh | 5F | 5E | 5D | 5C | 5B | 5A | 0D0h | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | PSW | ||
2Ah | ||||||||||||||||||
29h | 4F | 4E | 4D | 4C | 4B | 4A | 0B8h | ‑ | ‑ | ‑ | BC | BB | BA | B9 | B8 | IP | ||
28h | ||||||||||||||||||
27h | 3F | 3E | 3D | 3C | 3B | 3A | 0B0h | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | P3 | ||
26h | ||||||||||||||||||
25h | 2F | 2E | 2D | 2C | 2B | 2A | 0A8h | AF | ‑ | ‑ | AC | AB | AA | A9 | A8 | IE | ||
24h | ||||||||||||||||||
23h | 1F | 1E | 1D | 1C | 1B | 1A | 0A7h | A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 | P2 | ||
22h | 99h | SBUF | ||||||||||||||||
21h | 0F | 0E | 0D | 0C | 0B | 0A | 98h | 9F | 9E | 9D | 9C | 9B | 9A | SCON | ||||
20h | ||||||||||||||||||
1Fh | Банк 3 (R7-R0) | 90h | P1 | |||||||||||||||
8Dh | TH1 | |||||||||||||||||
18h | 8Ch | TH0 | ||||||||||||||||
17h | Банк 2 (R7-R0) | 8Bh | TL1 | |||||||||||||||
8Ah | TL0 | |||||||||||||||||
10h | 89h | TMOD | ||||||||||||||||
0Fh | Банк 1 (R7-R0) | 88h | 8F | 8E | 8D | 8C | 8B | 8A | TCON | |||||||||
87h | PCON | |||||||||||||||||
08h | 83h | DPH | ||||||||||||||||
07h | Банк 0 (R7-R0) | 82h | DPL | |||||||||||||||
81h | SP | |||||||||||||||||
00h | 80h | P0 | ||||||||||||||||
Рисунок 7.- Структура внутренней памяти данных |
СИСТЕМА КОМАНД 8051
8051 обладает гибкой системой команд, ориентированной, главным образом, на реализацию контроллерных функций. Характеристики системы команд определяются форматами данных и команд.
Форматы данных. Тип представления данных: числовые, логические, битовые. Числовые данные могут быть представлены в двоичном и двоично-десятичном кодах в целочисленном формате. Обработка двоичных данных может выполняться в дополнительном коде. Длина формата байт, два байта, бит. В операциях обмена тетрадами используется дополнительное представление информации ‑ полубайтами (4 бита).
Форматы команд. Команды одноадресные, двухадресные, безадресные. Длина команды – байт, два байта, три байта. При обращении к РПД могут использоваться прямой регистровый, прямой, косвенный, непосредственный, стековый способы адресации. Внешняя память данных допускает применение только косвенной и индексной адресации. При работе с памятью команд возможно применение косвенного, индексного и относительного способов адресации.
Система команд МК51 содержит 111 базовых команд, которые удобно разделить по функциональному признаку на пять групп: команды передачи данных, арифметических операций, логических операций, передачи управления, операций с битами. Система команд приведена в приложении, где используются следующие обозначения:
#d ‑ непосредственный операнд;
ad ‑ адрес РПД;
аd16 ‑ адрес памяти команд или внешней памяти данных;
Rn ‑ регистр текущего банка;
Ri ‑ нулевой или первый регистр текущего банка
bit – прямой адрес бита,
rel ‑ 8-разрядное смещение в дополнительном коде для выполнения относительных переходов. Величина смещения позволяет передавать управление в пределах –128 - +127 байт относительно адреса следующей команды;
@ ‑ признак косвенной адресации;
Рассмотрим обобщенные характеристики основных команд.
К командам передачи данных (пересылок) относятся:
MOV – пересылка при работе с РПД;
MOVX – пересылка c внешней памятью данных (ВПД);
MOVC – пересылка c памятью команд;
MOV A, (Rn, ad, @Ri, #d);
MOV Rn, (A, ad, #d);
MOV ad, (Rn, А, @Ri, #d);
MOV (A, Rn, ad), #d;
MOV @Ri, (ad, Rn, #d);
MOV ad1, ad2;
MOV DPTR,#d16
Команды этой группы не модифицируют признаки результата за исключением команды загрузки PSW и пересылок, в которых приемником результата является аккумулятор А. В этом случае устанавливается бит паритета и аппаратно формируется признак равенства «0» – Z=1, который можно использовать для выполнения команд условного перехода JZ (JNZ).
XCH А, (Rn, ad, @Ri) ‑ обмен содержимым А и (Rn, @Ri, ad);
XCHD A, @Ri ‑ обмен содержимым младших тетрад байтовых операндов;
SWAP ‑ обмен содержимым тетрад в аккумуляторе;
PUSH ad – запись в стек;
POP ad – чтение из стека;
Недостатком этой группы является отсутствие команд типа MOV Rn1, Rn2 и MOV Rn, @Ri;
Обращение к внешней памяти команд ВПК и ВПД осуществляется через регистр-указатель DPTR. Обращение к регистру возможно с помощью команды MOV DPTR, #d16, старший (DPH) и младший (DPL) байты этого регистра доступны через зону РСФ.
MOVX A, @DPTR;
MOVX @DPTR, A;
MOVX @Ri, A;
MOVX A, @Ri ‑ странично-косвенный метод доступа: Смещение внутри страниц задает содержимое Ri, а номер страницы формируется на выходе порта P2. На основе этого способа можно организовать индексную адресацию.
Для чтения памяти команд используется:
MOVC A, @A+DPTR; (A):=@(A+DPTR), где в А находится целое без знаковое смещение.
Для верификации памяти команда предусмотрена:
MOVC A, @A+PC; {PC:=PC+1; (A):=((A+PC))}, где РС – программный счетчик.
Арифметические операции:
ADD A, (Rn, ad, @Ri, #d) – сложение;
ADDC A, (Rn, ad, @Ri, #d) ‑ сложение с переносом;
DA А ‑ команда двоично-десятичной коррекции при сложении;
SUBB A, (Rn, ad, @Ri, #d) ‑ вычитание с заёмом. Это единственная команда вычитания. Перед её использованием необходимо контролировать значение бита С.
Команды сложения, вычитания формируют флаги С, АС, OV, P.
INC(DEC) (A, Rn, @Ri, ad) ‑ инкремент (декремент);
INC DPTR.
Если необходим декремент, то его реализация возможна только с использованием команд декремента регистров DPL(младший байт DPTR), и DPH (старший байт DPTR).
Команды инкремента и декремента флаги не устанавливают.
MUL AB – беззнаковое умножение 8x8 (B)(A):=(A)*(B);
DIV AB – беззнаковое деление 8/8 (A)(B):=A/B.
При умножении старший байт результата записывается в регистр-расширитель В, а младший ‑ в А. Если содержимое А>256, то формируется флаг арифметического переполнения OV. Бит С всегда сбрасывается.
При делении частное записывается в А, а остаток ‑ в В. Флаги переноса C и арифметического переполнения OV сбрасываются. При делении на 0 устанавливается флаг OV.
Логические команды :
ANL A, (Rn, @Ri, #d, ad); ‑ конъюнкция;
ANL ad, (A, #d);
Структура команд ORL (дизъюнкция), XRL (сумма по модулю 2) аналогична предыдущей.
CLR A ‑ очистка аккумулятора;
CPL A ‑ инвертирование аккумулятора;
В этих логических командах признаки не формируются, за исключением бита паритета P, если результат операции записывается в аккумулятор.
RR(RL) A ‑ правый(левый) циклический сдвиг;
RRC(RLC) A ‑ правый(левый) циклический сдвиг через бит С;
При сдвигах формируются признаки P и C.
Битовые команды:
При выполнении битовых команд бит С выполняет функции аккумулятора.
Команды пересылки бит:
MOV C, bit;
MOV bit, C;
SETB bit(C) ‑ установка бита С (или прямоадресуемого бита);
CLR bit (C) ‑ очистка бита С (или прямоадресуемого бита);
CPL C(bit) ‑ инверсия бита С (или прямоадресуемого бита);
ANL C, bit ‑ конъюнкция;
ORL C, bit – дизъюнкция;
ANL C, /bit
ORL C, /bit
В последних двух командах знак «/» указывает на то, что в качестве значения используется логическое отрицание адресуемого бита, однако сам бит источника при этом не изменяется.
При работе с битами используется только прямая адресация.
К командам передачи управления относятся команды, обеспечивающие условные и безусловные переходы, вызов подпрограмм и возврат из них, команда пустой операции NOP.
Переход по всему адресному пространству обеспечивает длинный безусловный переход LJMP ad16 и обращение к подпрограмме LCALL ad16.
Переход в пределах памяти программ размером 2048 байт выполняется с помощью безусловного абсолютного перехода AJMP ad11 и обращения к подпрограмме ACALL ad11. Такие команды содержат только 11 младших бит адреса перехода и имеют длину два байта.
Команда JMP @A+DPTR использует косвенную адресацию, при которой адрес перехода определяется суммированием содержимого DPTR и беззнакового смещения, находящегося в А. Эта команда позволяет выполнять множественное ветвление по адресу неизвестному в момент написания программы, модифицируя содержимое А или DPTR.
Команда SJMP rel выполняет безусловный, короткий, относительный переход.
При программировании на ассемблере достаточно указать только тип перехода JMP или CALL. В зависимости от длины перехода конкретная команда безусловного перехода выбирается компилятором автоматически.
RET ‑ возврат из подпрограммы;
RETI ‑ возврат из подпрограммы обработки прерывания.
Условные переходы представлены двумя группами команд байтовыми и битовыми. К байтовым командам относятся:
JZ(JNZ) rel – переход при нулевом (ненулевом) результате в А. Может быть реализован после любой операции, результат которой записывается в аккумулятор;
JC(JNC) rel – переход по значению бита С;
DJNZ Rn(ad), rel. Выполняется декремент содержимого регистра или ячейки РПД. Если результат операции не равен «0» ‑ выполняется переход, иначе ‑ следующая команда.
CJNE A, (ad, #d), rel;
CJNE (Rn, @Ri), #d, rel ‑ Выполняется вычитание из первого операнда второго; если результат операции не равен нулю ‑ выполняется переход, иначе ‑ следующая команда. Содержимое регистров, участвующих в операциях, не изменяется.
При сравнении формируется бит С = 0, если первый операнд больше второго и С = 1 при противоположном результате.
Битовые переходы выполняются по значению бита, адрес которого указан в формате команды JB(JNB) bit, rel.
В команде JBC bit, rel переход выполняется при единичном значении бита, адрес которого указан в команде, после чего бит сбрасывается в «0». Эта команда удобна при реализации семафоров.
Семафор представляет собой флаг, информирующий о состоянии связанного с ним ресурса: «1» – свободен, «0» – занят. Захват ресурса допускается только в том случае, если он свободен. Затем семафор должен быть переведен в состояние «Занято». Под ресурсом понимается всякий объект, распределяемый системой.
Например, данные от различных источников должны быть записаны в разделяемую память.
WAIT:
JBC bit, OK; Проверка флага
SJMP WAIT; Ресурс занят
OK:
;Ресурс свободен
При программировании в объектном коде адрес перехода вычисляется как:
rel:= адрес перехода ‑ адрес команды перехода + длина команды перехода;
В ОМК отсутствуют команды ввода-вывода. Обращение к внешним устройствам осуществляется как к ячейкам внешней памяти данных. Возможные форматы команд приведены на рисунке 8.