Структура резидентной памяти программ микроконтроллера
0FFFH |
|||
23H ¬ TI, RI |
|||
1BH ¬ T/C1 |
|||
|
13H ¬ INT1 |
||
0BH ¬ T/C0 |
|||
|
03H ¬ INT0 |
||
00H |
|||
15 8 |
|||
PC |
|||
7 0 |
|||
Рис.1. Структура резидентной памяти программ микроконтроллера 8051 |
|||
Программная модель МК 8051 содержит резидентную память данных, регистры специальных функций, резидентную память программ и программный счетчик PC.
Резидентная память программ (рис.1) имеет байтовую организацию и доступна только по чтению, при этом ее ячейки (4 Кбайт) адресуются с использованием двенадцати младших разрядов PC. Резидентная память программ может быть дополнена внешней памятью. В этом случае общий максимально допустимый объем памяти программ составит 64 К. Младшие адреса резидентной памяти программ отведены под обработку внешних прерываний , , прерываний от таймеров/счетчиков T/C0, T/C1 и прерывания от последовательного порта. В случае возникновения какого-либо из указанных прерываний происходит обращение к соответствующей ячейке резидентной памяти программ (например, при возникновении прерывания в PC записывается код 0003H).
Резидентная память данных (рис.2) состоит из 128-ми 8-разрядных ячеек с адресами 00H-7FH и может быть дополнена внешней памятью данных емкостью до 64 К. При этом пространства резидентной и внешней
Резидентная память данных |
Регистры специальных функций |
|||||||||||||||||||||
7FH |
F7 |
F6 |
F5 |
F4 |
F3 |
F2 |
F1 |
F0 |
0F0H |
|||||||||||||
E7 |
E6 |
E5 |
E4 |
E3 |
E2 |
E1 |
E0 |
0E0H |
||||||||||||||
30H |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
0D0H |
|||||||||||||
7F |
7E |
7D |
7C |
7B |
7A |
79 |
78 |
2FH |
- |
- |
- |
BC |
BB |
BA |
B9 |
B8 |
0B8H |
|||||
77 |
76 |
75 |
74 |
73 |
72 |
71 |
70 |
2EH |
B7 |
B6 |
B5 |
B4 |
B3 |
B2 |
B1 |
B0 |
0B0H |
|||||
6F |
6E |
6D |
6C |
6B |
6A |
69 |
68 |
2DH |
AF |
- |
- |
AC |
AB |
AA |
A9 |
A8 |
0A8H |
|||||
67 |
66 |
65 |
64 |
63 |
62 |
61 |
60 |
2CH |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
0A0H |
|||||
5F |
5E |
5D |
5C |
5B |
5A |
59 |
58 |
2BH |
SBUF |
99H |
||||||||||||
57 |
56 |
55 |
54 |
53 |
52 |
51 |
50 |
2AH |
9F |
9E |
9D |
9C |
9B |
9A |
99 |
98 |
98H |
|||||
4F |
4E |
4D |
4C |
4B |
4A |
49 |
48 |
29H |
97 |
96 |
95 |
94 |
93 |
92 |
91 |
90 |
90H |
|||||
47 |
46 |
45 |
44 |
43 |
42 |
41 |
40 |
28H |
TH1 |
8DH |
||||||||||||
3F |
3E |
3D |
3C |
3B |
3A |
39 |
38 |
27H |
TH0 |
8CH |
||||||||||||
37 |
36 |
35 |
34 |
33 |
32 |
31 |
30 |
26H |
TL1 |
8BH |
||||||||||||
2F |
2E |
2D |
2C |
2B |
2A |
29 |
28 |
25H |
TL0 |
8AH |
||||||||||||
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
24H |
TMOD |
89H |
||||||||||||
1F |
1E |
1D |
1C |
1B |
1A |
19 |
18 |
23H |
8F |
8E |
8D |
8C |
8B |
8A |
89 |
88 |
88H |
|||||
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
22H |
PCON |
87H |
||||||||||||
0F |
0E |
0D |
0C |
0B |
0A |
09 |
08 |
21H |
DPH |
83H |
||||||||||||
07 |
06 |
05 |
04 |
03 |
02 |
01 |
00 |
20H |
DPL |
82H |
||||||||||||
R7 |
1FH |
SP |
81H |
|||||||||||||||||||
87 |
86 |
85 |
84 |
83 |
82 |
81 |
80 |
80H |
||||||||||||||
R0 |
18H |
|||||||||||||||||||||
R7 |
17H |
|||||||||||||||||||||
R0 |
10H |
|||||||||||||||||||||
R7 |
0FH |
|||||||||||||||||||||
R0 |
08H |
Рис.2. Структура резидентной памяти данных и регистров специальных функций микроконтроллера 8051 |
||||||||||||||||||||
R7 |
07H |
|||||||||||||||||||||
R0 |
00H |
|||||||||||||||||||||
памяти не пересекаются, так как доступ к ним осуществляется с помощью разных команд.
Младшие 32 байта РПД сгруппированы в 4 банка по 8 регистров R0-R7 в каждом. Отметим, что Банк0, Банк1, Банк2 и Банк3 занимают соответственно адреса 00H-07H, 08H-0FH, 10H-17H и 18H-1FH. Следующие после банков регистров 16 байт (адреса 20H-2FH) или 128 бит (адреса 00H-7FH) образуют область ячеек, к которым возможно побитовое обращение. Набор команд МК 8051 содержит значительное количество инструкций, позволяющих работать с указанными битами.
Область регистров специальных функций (РСФ) (рис.2) содержит 21 регистр, назначение которых приведено в табл.2.1. Как видно из рис.2 и табл.2.1, 11 РСФ допускают побитовое обращение (биты с адресами 80H-0F7H).
Таблица 2.1
Наименование |
Назначение |
Адрес |
P0* |
Порт 0 |
80H |
SP |
Указатель стека |
81H |
DPL |
Младший байт указателя данных DPTR |
82H |
DPH |
Старший байт указателя данных DPTR |
83H |
PCON |
Регистр управления потреблением |
87H |
TCON* |
Регистр управления таймеров/счетчиков |
88H |
TMOD |
Регистр режимов таймеров/счетчиков |
89H |
TL0 |
Таймер/счетчик 0. Младший байт |
8АH |
TL1 |
Таймер/счетчик 1. Младший байт |
8BH |
TH0 |
Таймер/счетчик 0. Старший байт |
8CH |
TH1 |
Таймер/счетчик 1. Старший байт |
8DH |
P1* |
Порт 1 |
90H |
SCON* |
Регистр управления последовательным портом |
98H |
SBUF |
Буфер последовательного порта |
99H |
P2* |
Порт 2 |
0A0H |
IE* |
Регистр разрешения прерываний |
0A8H |
P3* |
Порт 3 |
0B0H |
IP* |
Регистр приоритетов прерываний |
0B8H |
PSW* |
Регистр состояния программы |
0D0H |
A* |
Аккумулятор |
0E0H |
B* |
Регистр B |
0F0H |
Рассмотрим регистры специальных функций более подробно.
Порты P0, P1, P2, P3 являются двунаправленными портами ввода/вывода и предназначены для обеспечения обмена информацией МК с внешними устройствами, образуя 32 линии ввода/вывода.
Помимо обычного ввода/ вывода указанные порты могут выполнять ряд дополнительных функций. В частности, при работе МК с внешней памятью данных или с внешней памятью программ через порты P0 и P2 выводятся соответственно младший и старший байты адреса, кроме того через порт P0 выдается (принимается) байт данных (байт данных или байт команды). При этом обмен байтом данных, ввод байта команды и вывод младшего байта адреса внешней памяти мультиплексированы во времени. Линии порта P3 имеют следующие альтернативные функции: P3.0 (P3.1) - вход (выход) последовательного порта; P3.2 (P3.3) - вход внешнего прерывания (); P3.4 (P3.5) - счетный вход 0 (1); P3.6 (P3.7) - выход сигнала записи (чтения) во внешнюю память данных (из внешней памяти данных).
Указатель стека SP (Stack Pointer) - регистр, содержимое которого инкрементируется (увеличивается на единицу) перед записью данных в стек при выполнении команд PUSH и CALL. Начальный сброс устанавливает указатель стека в 07H, а область стека в РПД начинается с адреса 08H. При необходимости, путем переопределения указателя стека область стека может быть расположена в любом месте РПД.
Указатель данных DPTR (Data PoinTeR) предназначен для хранения 16-разрядного адреса внешней памяти данных и состоит из двух программно доступных регистров DPH (Data Pointer High) и DPL (Data Pointer Low), которые могут использоваться в качестве независимых регистров общего назначения, если нет необходимости в хранении упомянутого адреса. Кроме того, DPTR служит базовым регистром при косвенной адресации в некоторых командах пересылки или перехода.
Регистр PCON (Power Control). Конструкция регистра PCON определяется технологией изготовления микроконтроллера. Для варианта изготовления по технологи n-МОП (8051) регистр PCON имеет всего один бит - SMOD, управляющий скоростью передачи последовательного порта. Для варианта изготовления по технологии КМОП (80С51) наименование и назначение разрядов регистра PCON приведены в табл.2.2.
Для 8051 и 80С51 расположение и назначение разряда SMOD идентичны. Биты GF0 и GF1 пользователь может задействовать по своему усмотрению. Если в PD и IDL одновременно записана "1", то преимущество имеет PD.
Особенности режима холостого хода и режима микропотребления заключаются в том, что при первом блокируются только узлы, составляющие центральный процессор микроконтроллера (тактовый генератор продолжает функционировать), а при втором блокируется работа всех узлов. Токи потребления микроконтроллера 80С51 в режимах холостого хода и микропотребления составляют соответственно не более 4,2 мА и не более 50 мкА. Для окончания режима холостого хода имеются два способа. Активизация любого разрешенного прерывания автоматически приведет к сбросу бита IDL в "0", оканчивая режим холостого хода, при этом состояние резидентной памяти данных и РСФ остается таким же, каким оно было на момент перехода в указанный режим. После исполнения команды (инструкции), обеспечивающей выход из подпрограммы обслуживания прерывания, будет выполняться инструкция, которая следует за командой, переведшей микроконтроллер в режим холостого хода. Другим способом окончания режима холостого хода является инициализация (сброс) микроконтроллера. В этом случае сохраняется только содержимое РПД. Указанный способ используется и для окончания режима микропотребления.
Таблица 2.2
Биты |
Наименование |
Назначение |
7 |
SMOD |
Бит удвоения скорости передачи через последовательный порт. При установке в "1" скорость передачи удваивается. Доступен по чтению. |
6 |
- |
Не используется. |
5 |
- |
Не используется. |
4 |
- |
Не используется. |
3 |
GF1 |
Программно управляемый флаг пользователя. |
2 |
GF0 |
Программно управляемый флаг пользователя. |
1 |
PD |
Бит включения режима микропотребления ("1" - включение, "0" - отмена). Доступен по чтению. |
0 |
IDL |
Бит включения режима холостого хода. ("1" - включение, "0" - отмена). Доступен по чтению. |
Регистры TH0, TL0, TH1, TL1 (Timer/counter Low (High) byte). Исходное (текущее) состояние j-го таймера/счетчика T/Cj в микроконтроллере определяется (отражается) программно доступными регистрами THj, TLj. Причем регистр THj - старшие, а регистр TLj - младшие 8 разрядов. Указанные регистры могут быть программно прочитаны или загружены как при выключенных, так и при работающих таймерах/счетчиках. Новая загрузка THj, TLj сразу же означает новую величину с которой будет начат счет в T/Cj, а старая теряется. Если загрузка произведена при включенном T/Cj, то счет продолжается с новой величины. Очередность загрузки регистров THj, TLj произвольная. Выключение T/Cj не искажает код, находящийся в THj, TLj. Таймер/счетчик T/Cj можно выключить, через произвольное время вновь включить и счет начнется с той величины, которая была в регистрах THj, TLj на момент выключения.
Регистр TCON (Timer/counter Control). Наименование и назначение разрядов регистра TCON приведены в табл.2.3. Все разряды этого регистра доступны по записи и по чтению.
Таблица 2.3
Биты |
Наименование |
Назначение |
7 |
TF1 |
Флаг переполнения T/C1. |
6 |
TR1 |
Бит включения T/C1. TR1=1 - включен, TR1=0 - выключен. |
5 |
TF0 |
Флаг переполнения T/C0. |
4 |
TR0 |
Бит включения T/C0. TR0=1 - включен, TR0=0 - выключен. |
3 |
IE1 |
Флаг запроса внешнего прерывания . |
2 |
IT1 |
Бит, определяющий вид прерывания . IT1=0 - прерывание по уровню (низкому), IT1=1 - прерывание по фронту (переход из"1" в "0"). |
1 |
IE0 |
Флаг запроса внешнего прерывания . |
0 |
IT0 |
Бит, определяющий вид прерывания . IT0=0 - прерывание по уровню (низкому), IT0=1 - прерывание по фронту (переход из"1" в "0"). |
Если прерывание от T/ Cj разрешено, то установка флага TFj вызовет прерывание. Бит TFj аппаратно сбрасывается в "0" при обращении к подпрограмме обработки прерывания. Флаг IEj аппаратно устанавливается в "1" от внешнего прерывания : от низкого уровня или перехода из "1" в "0" сигнала прерывания. Если при этом внешнее прерывание разрешено, то осуществляется переход к подпрограмме его обслуживания. Сброс флага IEj выполняется аппаратно при обслуживании прерывания только в том случае, когда ITj=1.
Регистр TMOD (Timer/counter Mode). Наименование и назначение разрядов регистра TMOD приведены в табл.2.4. Все разряды этого регистра доступны по записи и по чтению.
При работе в качестве таймера содержимое T/Cj инкрементируется с частотой , где f есть частота синхронизации микроконтроллера. При работе T/Cj в качестве счетчика внешних событий, его содержимое инкрементируется в ответ на переход из "1" в "0" сигнала на j-ом счетном входе микроконтроллера. Для надежной работы T/Cj в режиме счетчика необходимо, чтобы максимальная частота указанного сигнала была не более , а уровень этого сигнала оставался неизменным в течение как минимум одного машинного цикла ().
Таблица 2.4
Биты |
Наименование |
Назначение |
|||||
7 |
GATE1 |
Бит разрешает (запрещает) управлять T/C1 от внешнего вывода . GATE1=1 - управление разрешено, GATE1=0 - управление запрещено. |
|||||
6 |
|
Бит определяет работу T/C1 в качестве таймера (=0), счетчика внешних событий (=1). |
|||||
5 4 |
М1.1 М0.1 |
Биты определяют один из 4-х режимов работы T/C1. |
|||||
M1.1 |
M0.1 |
Режим |
|||||
0 |
0 |
0 |
|||||
0 |
1 |
1 |
|||||
1 |
0 |
2 |
|||||
1 |
1 |
3 |
|||||
3 |
GATE0 |
Бит разрешает (запрещает) управлять T/C0 от внешнего вывода . GATE0=1 - управление разрешено, GATE0=0 - управление запрещено. |
|||||
2 |
|
Бит определяет работу T/C0 в качестве таймера (=0), счетчика внешних событий (=1). |
|||||
1 0 |
М1.0 М0.0 |
Биты определяют один из 4-х режимов работы T/C0. |
|||||
M1.0 |
M0.0 |
Режим |
|||||
0 |
0 |
0 |
|||||
0 |
1 |
1 |
|||||
1 |
0 |
2 |
|||||
1 |
1 |
3 |
Таймер/счетчик T/Cj в режиме 0 (1) представляет собой устройство на основе 13- (16-) разрядного регистра, состоящего из 8-ми разрядов регистра THj и 5-ти младших разрядов (8-ми разрядов) регистра TLj. В режиме 2 T/Cj представляет собой устройство на основе 8-разрядного регистра TLj. При каждом переполнении TLj кроме установки в регистре TCON флага TFj происходит автозагрузка регистра TLj содержимым THj, причем указанная автозагрузка не влияет на содержимое регистра THj. Таймер/счетчик T/C1 в режиме 3 заблокирован (значение кода в регистрах TH1, TL1 не изменяется). Эффект такой же, как при сбросе TR1 в "0". Таймер/счетчик T/C0 в режиме 3 представляет собой два независимых устройства на основе регистров TH0 и TL0. Устройство на основе TL0 может работать в режиме таймера или в режиме счетчика и при переполнении устанавливает флаг TF0. За этим устройством сохраняются биты управления TR0, GATE0, . Устройство на основе регистра TH0 может работать только в режиме таймера. Оно использует бит включения TR1, при переполнении выставляет флаг TF1. Других битов управления устройство на основе TH0 не имеет.
Регистр SCON (Serial port Control) предназначен для приема и хранения кода, который управляет последовательным интерфейсом. Наименование и назначение разрядов регистра SCON приведены в табл.2.5. Все разряды этого регистра программно доступны по записи и чтению.
Таблица 2.5
Биты |
Наименование |
Назначение |
|||
7 6 |
SM0 SM1 |
Биты определяют один из 4-х режимов работы последовательного порта |
|||
SM0 |
SM1 |
Режим |
Характеристика режима |
||
0 |
0 |
0 |
Сдвиговый регистр. Скорость (частота) приема/ передачи f/12. |
||
0 |
1 |
1 |
8-битовый универсальный асинхронный приемник/ передатчик (УАПП). Скорость (частота) приема/ передачи задается частотой переполнений T/C1. |
||
1 |
0 |
2 |
9-битовый УАПП. Скорость (частота) приема/ передачи f/64 или f/32. |
||
1 |
1 |
3 |
9-битовый УАПП. Скорость (частота) приема/ передачи задается частотой переполнений T/C1. |
||
5 |
SM2 |
Бит разрешения многопроцессорной работы. |
|||
4 |
REN |
Бит разрешает (запрещает) прием. REN=1 - прием разрешен, REN=0 - прием запрещен. |
|||
3 |
TB8 |
Девятый бит передаваемых данных в режимах 2, 3. |
|||
2 |
RB8 |
Девятый бит принятых данных в режимах 2, 3. |
|||
1 |
TI |
Флаг прерывания передатчика. |
|||
0 |
RI |
Флаг прерывания приемника. |
В режимах 2 и 3 при SM2= 1 флаг RI не активизируется (не устанавливается в "1"), если девятый принятый бит данных равен "0". В режиме 1 при SM2=1 флаг RI не активизируется, если не принят стоп-бит равный "1". В режиме 0 бит SM2 не используется и должен быть сброшен в "0". Флаг TI аппаратно устанавливается в "1" в конце периода передачи 8-го бита в режиме 0 или в начале периода передачи стоп-бита в других режимах. Флаг RI аппаратно устанавливается в "1" в конце периода приема 8-го бита в режиме 0 или в середине периода приема стоп-бита (девятого бита) в режиме 1 (в режимах 2 и 3) при SM2=0.
Режим 2 и режим 3 последовательного порта позволяют организовать работу микроконтроллеров 8051 в многопроцессорных системах, использующих для обмена информацией между МК разделяемый моноканал (коаксиальный кабель, витая пара, оптоволокно и др.). В этих режимах флаг RI установится только в том случае, когда либо SM2=0, либо принятый девятый бит данных равен "1". Указанную особенность работы последовательного порта можно использовать для организации межконтроллерного обмена следующим образом. Пусть ведущему МК требуется передать блок данных некоторому (нескольким) ведомому (ведомым) МК. С этой целью ведущий МК в протокольном режиме "широковещательной" передачи (всем ведомым МК) выдает в моноканал байт-идентификатор абонента (код адреса МК-получателя), который отличается от байтов данных только тем, что в его девятом бите содержится "1". Программа реализации протокола сетевого обмена информацией должна быть построена таким образом, чтобы при получении байта-идентификатора во всех ведомых МК произошли прерывание прикладных программ и вызов подпрограммы сравнения байта-идентификатора с кодом собственного сетевого адреса. Адресуемый МК сбрасывает свой управляющий бит SM2 в "0" и готовится к приему блока данных. Остальные ведомые МК, адрес которых не совпал с кодом байта-идентификатора, оставляют неизменным состояние SM2=1 и передают управление основной программе.
Байты данных, поступающие по моноканалу в последовательный порт ведомых микроконтроллеров у которых SM2=1, прерывание не вызывают (не устанавливается флаг RI), т.е. игнорируются.
Регистр SBUF (Serial port Buffer). Через SBUF обеспечивается программный доступ к регистрам передатчика и приемника последовательного порта. Причем передача начинается любой командой микроконтроллера, использующей SBUF в качестве регистра назначения, т.е. выполняющей операцию "запись в SBUF".
Регистр IE (Interrupt Enable) используется для разрешения или запрещения прерываний от соответствующих источников. Наименование и назначение разрядов регистра IE приведены в табл.2.6. Все биты указанного регистра программно доступны по записи и чтению.
Регистр IP (Interrupt Priority) используется для установки уровня приоритета прерывания для каждого из пяти источников прерываний. Наименование и назначение разрядов регистра IP приведены в табл.2.7. Все биты этого регистра программно доступны по записи и чтению. Наличие в заданном разряде регистра IP "1" устанавливает для соответствующего источника высокий уровень приоритета, а наличие "0" - низкий уровень приоритета.
Таблица 2.6
Биты |
Наименование |
Назначение |
7 |
EA |
Бит управления всеми источниками прерываний одновременно. EA=0 - прерывания запрещены, EA=1 - прерывания могут быть разрешены индивидуальными разрешениями EX0, EX1, ET0, ET1, ES. |
6 |
- |
Не используется. |
5 |
- |
Не используется. |
4 |
ES |
Бит управления прерыванием от последовательного порта. ES=0 - прерывание запрещено, ES=1 - прерывание разрешено. |
3 |
ET1 |
Бит управления прерыванием от T/C1. ET1=0 - прерывание запрещено, ET1=1 - прерывание разрешено. |
2 |
EX1 |
Бит управления прерыванием от внешнего источника . EX1=0 - прерывание запрещено, EX1=1 - прерывание разрешено. |
1 |
ET0 |
Бит управления прерыванием от T/C0. ET0=0 - прерывание запрещено, ET0=1 - прерывание разрешено. |
0 |
EX0 |
Бит управления прерыванием от внешнего источника . EX0=0 - прерывание запрещено, EX0=1 - прерывание разрешено. |
Программа обработки прерывания с низким уровнем приоритета может быть прервана запросом прерывания с высоким уровнем приоритета, но не может быть прервана другим запросом прерывания с низким уровнем приоритета. Программа обработки прерывания с высоким уровнем приоритета не может быть прервана никаким другим запросом прерывания ни от одного из источников. Если два запроса с разными уровнями приоритета приняты одновременно, сначала будет обслужен запрос с высоким уровнем приоритета. Если одновременно приняты запросы с одинаковым уровнем приоритета, обработка их будет производится в порядке, задаваемом последовательностью внутреннего опроса флагов прерываний. Таким образом, в пределах одного приоритетного уровня существует еще одна структура приоритетов:
Источник |
Приоритет внутри уровня |
IE0 |
высокий |
TF0 |
|
IE1 |
|
TF1 |
|
RI, TI |
низкий |
Таблица 2.7
Биты |
Наименование |
Назначение |
7 |
- |
Не используется. |
6 |
- |
Не используется. |
5 |
- |
Не используется. |
4 |
PS |
Бит установки уровня приоритета прерывания от последовательного порта. |
3 |
PT1 |
Бит установки уровня приоритета прерывания от таймера/счетчика T/C1. |
2 |
PX1 |
Бит установки уровня приоритета прерывания от внешнего источника . |
1 |
PT0 |
Бит установки уровня приоритета прерывания от таймера/счетчика T/C0. |
0 |
PX0 |
Бит установки уровня приоритета прерывания от внешнего источника . |
Аккумулятор A представляет собой 8-разрядный регистр, который является источником операнда и местом фиксации результата при выполнении арифметических, логических операций и ряда операций передачи данных.
Кроме того, только с использованием аккумулятора могут быть выполнены операции сдвигов, проверки на нуль, формирование флага паритета и т.п.
Регистр B - 8-разрядный регистр, используемый в сочетании с аккумулятором при выполнении операций умножения и деления для хранения второго входного операнда и помещения возвращаемых 8-ми битов результата. В других операциях регистр B является обычным регистром общего назначения.
Таблица 2.8
Биты |
Наименование |
Назначение |
|||||
7 |
C |
Флаг переноса. Устанавливается в "1" (сбрасывается в "0") аппаратно или программно. Аппаратно устанавливается (сбрасывается) во время выполнения команды сложения или вычитания при наличии (отсутствии) соответственно переноса или заема в 7-ом бите результата. Во время выполнения команды умножения или деления флаг всегда аппаратно сбрасывается. |
|||||
6 |
AC |
Флаг дополнительного переноса. Устанавливается (сбрасывается) аппаратно или программно. Аппаратно устанавливается (сбрасывается) во время выполнения команды сложения или вычитания при наличии (отсутствии) соответственно переноса или заема в 3-ем бите результата. |
|||||
5 |
F0 |
Программно управляемый флаг пользователя. |
|||||
4 3 |
RS1 RS0 |
Разряды управления выбором банка рабочих регистров. Устанавливаются (сбрасываются) программно. |
|||||
RS1 |
RS0 |
Банк |
|||||
0 |
0 |
0 |
|||||
0 |
1 |
1 |
|||||
1 |
0 |
2 |
|||||
1 |
1 |
3 |
|||||
2 |
OV |
Флаг переполнения. Устанавливается (сбрасывается) аппаратно или программно. Аппаратно устанавливается во время выполнения команды сложения (вычитания) если есть перенос (заем) в 6-ом бите результата и нет переноса (заема) в бите 7, или есть перенос (заем) в бите 7 и нет в бите 6, в противном случае флаг сбрасывается. Во время выполнения команды деления флаг аппаратно сбрасывается, а в случае деления на нуль - устанавливается. При умножении флаг аппаратно устанавливается если результат больше 255, в противном случае - сбрасывается. |
|||||
1 |
без имени |
Флаг пользователя. Устанавливается (сбрасывается) программно. Доступен по чтению. |
|||||
0 |
P |
Флаг паритета. Программно доступен только по чтению. Аппаратно сбрасывается (устанавливается) в каждом машинном цикле для индикации четности (нечетности) количества разрядов аккумулятора, находящихся в состоянии "1". Если в аккумуляторе все разряды сброшены в "0", флаг аппаратно сбрасывается. |
2.2. Ассемблерный язык микроконтроллера 8051
Для эффективной разработки прикладного программного обеспечения микропроцессоров и микроконтроллеров необходимо выбрать подходящий язык программирования. Если требуется не очень сложная и при этом быстрая и компактная программа, которая не содержит сложных вычислительных операций, то для ее написания лучше выбрать язык низкого уровня (язык ассемблера). Язык высокого уровня (ЯВУ) следует выбрать в том случае, если необходимо производить сложные вычисления: операции над 16-, 32-разрядными числами, числами с плавающей точкой и др. Очень часто наиболее подходящей является смешанная модель, где критичные к быстродействию части программы написаны на ассемблере, а вычислительные процедуры реализованы на ЯВУ, например, на Си.
Изучение языков программирования целесообразнее всего начинать с ассемблера, поскольку он дает наглядное представление о функционировании аппаратной части целевого микропроцессора (микропроцессора для которого разрабатывается прикладная программа), что в конечном счете обеспечивает получение оптимальных схемотехнических решений разрабатываемой микропроцессорной техники. Язык ассемблера относится к группе машинно-ориентированных языков. Иначе говоря, каждому типу микропроцессоров или микроконтроллеров соответствует свой ассемблерный язык.
Оператором языка ассемблера микроконтроллера 8051 (языка АСМ51) является строка исходного текста микроконтроллерной программы (МК-программы), имеющая следующий формат:
<метка> |
< команда/ директива > |
;<комментарий> |
|
<операция> <операнды> |
Поле <операция> содержит мнемоническое обозначение команды или директивы ассемблера, которое является сокращением (аббревиатурой) полного английского наименования выполняемого действия.
Например: MOV - move - переслать, JMP - jump - перейти, DB - define byte - определить байт. Кроме того, поле <операция> может содержать символическое имя ассемблерной макрокоманды.
Поле <операнды> зависит от поля <операция> и может указывать группу разделенных запятой операндов, либо может быть исключено вообще.
Операнды ассемблерных команд определяют тип используемых данных (бит, байт, 2-байтовое слово), способ адресации этих данных и адреса переходов в области памяти программ микроконтроллера. Различают следующие способы адресации данных: регистровый, прямой, косвенно-регистровый и непосредственный.
Регистровая адресация обеспечивает обращение к байтовому содержимому регистров A, B или регистров R0-R7 выбранного банка, к 2-байтовому содержимому регистра DPTR и к битовому содержимому флага переноса C, при этом в качестве операндов используются принятые имена перечисленных программно доступных элементов, а также символические имена (только для регистров R0-R7), определяемые пользователем.
Прямая адресация применяется для обращения к байтовому содержимому 128-ми ячеек резидентной памяти данных или 21-го регистра специальных функций, а также к битовому содержимому 16-ти ячеек РПД или 11-ти РСФ, допускающих побитовое обращение (рис.2). При прямой адресации данных в поле <операнды> указывается прямой адрес используемых ячейки РПД, регистра специальных функций или бита. Этот адрес может быть задан числом, символическим именем, выражением, именем (только для РСФ и битов РСФ). Имена регистров специальных функций приведены в табл.2.1, а имена битов РСФ - в табл.2.3, табл.2.5-2.8. Кроме того, имя бита РСФ может быть представлено структурой вида: <имя РСФ>.<номер бита>. Например, имя пятого бита регистра TCON можно записать как TCON.5, имя второго бита аккумулятора - как A.2 и т.д.
С помощью косвенно-регистровой адресации обеспечивается обращение к байтовому содержимому 128-ми ячеек РПД, при этом адрес используемой ячейки определяется содержимым указателя стека SP или одного из регистров R0, R1 выбранного банка.
Косвенно- регистровая адресация используется также для обращения к внешней памяти данных. В этом случае регистром-указателем может быть 16-разрядный указатель данных DPTR или один из упомянутых выше регистров R0, R1. Для работы с данными, "зашитыми" в виде констант в память программ микроконтроллера, применяется косвенно-регистровая адресация по сумме: базовый регистр (содержимое DPTR или программного счетчика PC) плюс индексный регистр (содержимое аккумулятора A). Любая такая константа может быть выбрана по адресу, который вычисляется сложением содержимого DPTR (PC) с содержимым A. Операнд, определяющий косвенно-регистровую адресацию данных, задается именем регистра-указателя или символическим именем (только для R0 и R1) с обязательным префиксом @.
При непосредственной адресации данные, предназначенные для обработки, непосредственно указываются в поле <операнды> и могут быть представлены в нем числом, символическим именем или выражением с обязательным префиксом #.
Аналогичным образом (за исключением префикса #) представляется операнд, определяющий адрес перехода в памяти программ микроконтроллера.
В качестве операндов ассемблерных директив и макрокоманд обычно используются числа, символические имена, выражения, имена программно доступных элементов микроконтроллера (только для директивы REG и макрокоманд), а в ряде случаев мнемоники языка АСМ51 (только для макрокоманд).
Символические имена, являющиеся операндами команд или директив, должны быть обязательно определены с помощью соответствующих директив (EQU, VAR или REG) языка АСМ51. Кроме того, символическое имя адреса в памяти программ может быть определено использованием этого имени в поле <метка> одной из строк исходного текста МК-программы. Отметим, что корректное символическое имя должно быть представлено комбинацией букв латинского алфавита и цифр и начинаться с буквы, при этом указанная комбинация допускает использование символа подчеркивания.
Применяемые в качестве операндов числа приводятся с указанием системы счисления (СС), для чего используется суффикс (латинская буква, стоящая после числа): B - для двоичной СС, Q - для восьмеричной СС, D - и H - соответственно для десятичной и шестнадцатеричной СС.
Число без суффикса считается десятичным.
Выражение, используемое в поле <операнды>, вычисляется в процессе трансляции исходной МК-программы и представляет собой совокупность символических имен и (или) чисел (в формате 2-байтовых слов), содержащую следующие основные операторы:
"+" - сложение (третий уровень приоритета);
"-" - вычитание (третий уровень приоритета);
"*" - умножение (четвертый уровень приоритета);
"/" - деление (четвертый уровень приоритета);
"**" - возведение в степень (пятый уровень приоритета);
.OR. - ИЛИ (первый уровень приоритета);
.AND. - И (второй уровень приоритета);
.XOR. - исключающее ИЛИ (первый уровень приоритета);
.NOT. - отрицание (шестой уровень приоритета);
"<" (">") - выделение младшего (старшего) байта 2-байтового слова (шестой уровень приоритета).
Оператор с более высоким уровнем приоритета выполняется в первую очередь. Если в выражении присутствуют операторы с одинаковым уровнем приоритета, то вычисления производятся слева направо. Чтобы изменить указанный порядок выполнения расчетов допускается использовать скобки. В качестве примера приведем выражение <.NOT.13H+1, реализующее процедуру преобразования числа 13H в дополнительный код и эквивалентное числу 0EDH, которое будет получено при трансляции исходной МК-программы.
Поле <метка> не является обязательным, отделяется от поля <команда/ директива> пробелом и может содержать символическое имя непосредственных данных, одного из регистров R0-R7, прямого адреса, макрорасширения или адреса перехода в памяти программ. Если метка заканчивается двоеточием, то она может быть расположена в любом месте строки, в противном случае метка должна начинаться в начале строки.
Поле <комментарий> содержит пояснения различного характера - может объяснять применение той или иной команды или директивы, содержать описание алгоритма участка или МК-программы в целом и др. Это поле не является обязательным и при использовании должно начинаться символом ;.
2.2.1. Система команд языка АСМ51
Система команд языка АСМ51 содержит 111 команд, которые обеспечивают реализацию широкой номенклатуры арифметических и логических операций, а также операций пересылки данных и передачи управления. В табл.2.9 приведены обозначения, используемые в описании команд.
Таблица 2.9
Обозначение |
Назначение |
addr |
Символическое имя вычисляемого адреса ячейки памяти программ. |
addr11 |
Символическое имя 11-битового адреса ячейки памяти программ. |
addr16 |
Символическое имя 16-битового адреса ячейки памяти программ. |
bit |
Символическое имя 8-разрядного адреса бита в области ячеек резидентной памяти данных или регистров специальных функций, допускающей побитовое обращение (см. рис.2). |
data8 |
Символическое имя байта данных. |
Обозначение |
Назначение |
data16 |
Символическое имя 16-битовых данных. |
direct |
Символическое имя 8-разрядного адреса ячейки резидентной памяти данных или регистра специальных функций. |
rel |
Значение байта смещения, используемое при вычислении адреса addr. |
(X) |
Содержимое элемента X. |
((X)) |
Содержимое по адресу, хранящемуся в элементе X. |
X[M] |
Разряд M элемента X. |
X[3-0] |
Группа разрядов элемента X. |
:= |
Оператор присваивания. |
Ú |
Дизъюнкция. |
Ù |
Конъюнкция. |
Å |
Сложение по модулю 2. |
X:Y |
Целочисленное деление элемента X на элемент Y. |
mod[X:Y] |
Остаток при целочисленном делении. |
ACALL addr11 |
addr11[10-8] 1 0 0 0 1 |
addr11[7-0] |
Команда " абсолютный вызов подпрограммы" вызывает безусловно подпрограмму, размещенную по адресу addr11. При этом содержимое счетчика команд PC увеличивается на 2 для получения адреса следующей команды, после чего полученное 16-разрядное значение PC помещается в стек, и содержимое указателя стека SP также увеличивается на 2. Адрес перехода образуется с помощью конкатенации (сцепления) 5-ти старших бит увеличенного содержимого счетчика команд PC, содержимого 7-5 битов старшего байта команды и содержимого второго байта команды. Адрес перехода и указанная команда должны находиться внутри одной страницы памяти программ (ПП) объемом 2 Кбайт, определяемой содержимым пяти старших бит PC. Время выполнения команды 2 цикла.
Алгоритм |
Пример |
||||
(PC):=(PC)+2, (SP):=(SP)+1 ((SP)):=(PC[7-0]), (SP):=(SP)+1 ((SP)):=(PC[15-8]) (PC[10-0]):=addr11[10-8] çêaddr11[7-0], где çêесть знак конкатенации |
;(SP)=07H, (PC)=28DH, ;MT1 соответствует адресу ;345H в ПП ACALL MT1 ;(PC)=345H, ;(SP)=09H, ;в РПД (09H)=02H, (08H)=8FH |
||||
ADD A,Rn
;где n=0-7 |
0 0 1 0 1 r r r |
где rrrB=000B-111B |
|||
Алгоритм |
Пример |
(A):=(A)+(Rn), где n=0-7 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=0C3H, (R6)=0AAH ADD A,R6 ;(A)=6DH,(R6)=0AAH, ;(AC)=0, (C)=1, (OV)=1 |
ADD A,@Ri ;где iÎ{0,1} |
0 0 1 0 0 1 1 i |
Команда "сложение" складывает содержимое аккумулятора A с содержимым ячейки резидентной памяти данных (РПД), адресуемой содержимым заданного регистра Ri выбранного банка. Результат размещается в A. Содержимое используемой ячейки не изменяется. Логика установки (сброса) флагов и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой.
Алгоритм |
Пример |
(A):=(A)+((Ri)), где iÎ{0,1} (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=95H, (R1)=31H, ;в РПД (31H)=4CH ADD A,@R1 ;(A)=0E1H, (C)=0, ;(AC)=1, (OV)=0, (31H)=4CH |
ADD A,direct |
0 0 1 0 0 1 0 1 |
direct |
Алгоритм |
Пример |
||||
(A):=(A)+(direct) (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=77H, (P1)=0FFH ADD A,P1 ;(A)=76H, ;(AC)=1, (C)=1, (OV)=0 ;(P1)=0FFH |
||||
ADD A,#data8 |
0 0 1 0 0 1 0 0 |
data8 |
|||
Алгоритм |
Пример |
(A):=(A)+data8 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=09H ADD A,#0D3H ;(A)=0DCH, ;(AC)=0, (C)=0, (OV)=0 |
ADDC A,Rn ;где n=0-7 |
0 0 1 1 1 r r r |
где rrrB=000B-111B |
Содержимое используемого регистра не изменяется. При появлении переносов из разрядов 7 и 3 результата устанавливаются в "1" флаг переноса C и флаг дополнительного переноса AC соответственно, в противном случае эти флаги сбрасываются в "0". Флаг переполнения OV устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита 7 и нет - из бита 6, в противном случае флаг OV сбрасывается. Время выполнения команды 1 цикл.
Алгоритм |
Пример |
(A):=(A)+(C)+(Rn), где n=0-7 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=0B2H, (R3)=99H, (C)=1 ADDC A,R3 ;(A)=4CH,(R3)=99H, ;(AC)=0, (C)=1, (OV)=1 |
ADDC A,@Ri ;где iÎ{0,1} |
0 0 1 1 0 1 1 i |
Алгоритм |
Пример |
(A):=(A)+(C)+((Ri)), где iÎ{0,1} (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=0D5H, (R0)=3AH, ;в РПД (3AH)=1AH, (C)=1 ADDC A,@R0 ;(A)=0F0H, ;(AC)=1, (C)=0, (OV)=0, ;(3AH)=1AH |
ADDC A,direct |
0 0 1 1 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(A)+(C)+(direct) (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=11H, (C)=1, ;(DPH)=0DFH ADDC A,DPH ;(A)=0F1H, ;(AC)=1, (C)=0, (OV)=0, ;(DPH)=0DFH |
ADDC A,#data8 |
0 0 1 1 0 1 0 0 |
data8 |
Алгоритм |
Пример |
(A):=(A)+(C)+data8 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=55H, (C)=0 ADDC A,#55H ;(A)=0AAH, ;(AC)=0, (C)=0, (OV)=1 |
AJMP addr11 |
addr11[10-8] 0 0 0 0 1 |
addr11[7-0] |
Алгоритм |
Пример |
||||
(PC):=(PC)+2 (PC[10-0]):=addr11[10-8] çêaddr11[7-0], где çêесть знак конкатенации |
;(PC)=28FH, ;MT2 соответствует адресу ;34AH в ПП AJMP MT2 ;(PC)=34AH |
||||
ANL A,Rn
;где n=0-7 |
0 1 0 1 1 r r r |
где rrrB=000B-111B |
|||
Алгоритм |
Пример |
(A):=(A)Ù(Rn), где n=0-7 |
;(A)=0FH, (R2)=0C5H ANL A,R2 ;(A)=05H,(R2)=0C5H |
ANL A,@Ri ;где iÎ{0,1} |
0 1 0 1 0 1 1 i |
Результат размещается в A. Содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(A):=(A)Ù((Ri)), где iÎ{0,1} |
;(A)=0BCH, (R0)=35H, ;в РПД (35H)=47H ANL A,@R0 ;(A)=04H, ;в РПД (35H)=47H |
ANL A,direct |
0 1 0 1 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(A)Ù(direct) |
;(A)=0A3H, (PSW)=85H ANL A,PSW ;(A)=81H,(PSW)=85H |
ANL A,#data8 |
0 1 0 1 0 1 0 0 |
data8 |
Алгоритм |
Пример |
(A):=(A)Ùdata8 |
;(A)=36H ANL A,#0DDH ;(A)=14H |
ANL direct,A |
0 1 0 1 0 0 1 0 |
direct |
Алгоритм |
Пример |
(direct):=(direct)Ù(A) |
;(A)=55H, (P2)=0AAH ANL P2,A ;(A)=55H,(P2)=00H |
ANL direct,#data8 |
0 1 0 1 0 0 1 1 |
direct |
data8 |
Результат помещается соответственно в используемую ячейку или используемый регистр. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(direct):=(direct)Ùdata8 |
;(P1)=0FFH ANL P1,#73H ;(P1)=73H |
ANL C,bit |
1 0 0 0 0 0 1 0 |
bit |
Алгоритм |
Пример |
||||
(C):=(C)Ù(bit) |
;(C)=1, (P1[0])=0, ;в РПД (24H)=0FH ANL C,P1.0 ;(C)=0, (P1[0])=0 ANL C,20H ;(C)=0, (24H)=0FH |
||||
ANL C,/bit |
1 0 1 1 0 0 0 0 |
bit |
|||
Алгоритм |
Пример |
(C):=(C) Ù |
;(C)=1, (AC)=0 ANL C,/AC ;(C)=1, (AC)=0 |
CJNE A,direct,addr |
1 0 1 1 0 1 0 1 |
direct |
rel |
Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Флаг переноса C сбрасывается в "0", если содержимое A больше (равно) содержимого (содержимому) используемой ячейки или используемого регистра, в противном случае флаг устанавливается в "1". Команда не изменяет (A) и (direct) и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
если (direct)<(A), то (PC):=(PC)+3+rel и (C):=0 если (direct)>(A), то (PC):=(PC)+3+rel и (C):=1 если (direct)=(A), то (PC):=(PC)+3 и (C):=0 |
;(A)=97H, (P2)=0F0H, (C)=0, ;(PC)=3FFH, MT3 соответству- ;ет адресу 41FH, rel=1DH CJNE A,P2,MT3 ;(C)=1, ;(A)=97H, (P2)=0F0H, ;(PC)=41FH |
CJNE A,#data8,addr |
1 0 1 1 0 1 0 0 |
data8 |
rel |
Алгоритм |
Пример |
если data8<(A), то (PC):=(PC)+3+rel и (C):=0 если data8>(A), то (PC):=(PC)+3+rel и (C):=1 если data8=(A), то (PC):=(PC)+3 и (C):=0 |
;(A)=0FCH, (C)=1, (PC)=3FFH, ;MT4 соответствует адресу ;3F0H, rel=0EEH CJNE A,#0BFH,MT4 ;(C)=0, ;(A)=0FCH, (PC)=3F0H |
CJNE Rn,#data8,addr |
1 0 1 1 1 r r r |
data8 |
rel |
где n=0-7 |
где rrrB=000B-111B |
Процедура вычисления адреса перехода и время выполнения такие же, как у рассмотренной выше команды с аналогичной мнемоникой. Флаг переноса C сбрасывается в "0", если содержимое Rn больше (равно) data8, в противном случае флаг устанавливается в "1". Команда не влияет на (Rn).
Алгоритм |
Пример |
если data8<(Rn), то (PC):=(PC)+3+rel и (C):=0 если data8>(Rn), то (PC):=(PC)+3+rel и (C):=1 если data8=(Rn), то (PC):=(PC)+3 и (C):=0 |
;(R7)=80H, (C)=0, (PC)=300H, ;MT5 соответствует адресу ;30FH, rel=0CH CJNE R7,#81H,MT5 ;(C)=1, ;(R7)=80H, (PC)=30FH |
CJNE @Ri,#data8,addr |
1 0 1 1 0 1 1 i |
data8 |
rel |
где iÎ{0,1} |
Алгоритм |
Пример |
если data8<((Ri)), то (PC):=(PC)+3+rel и (C):=0 если data8>((Ri)), то (PC):=(PC)+3+rel и (C):=1 если data8=((Ri)), то (PC):=(PC)+3 и (C):=0 |
;(R0)=41H, (C)=1, (PC)=200H, ;в РПД (41H)=57H, ;MT6 соответствует адресу ;22AH, rel=27H CJNE @R0,#29H,MT6 ;(C)=0, ;(PC)=22AH, ;в РПД (41H)=57H |
CLR A |
1 1 1 0 0 1 0 0 |
|
Алгоритм |
Пример |
(A):=0 |
;(A)=6CH, (C)=0, (AC)=1 CLR A ;(A)=00H, (C)=0, (AC)=1 |
CLR C |
1 1 0 0 0 0 1 1 |
|
Команда "сброс флага переноса" сбрасывает (обнуляет) содержимое флага переноса C, на состояние других флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(C):=0 |
;(C)=1 CLR C ;(C)=0 |
CLR bit |
1 1 0 0 0 0 1 0 |
bit |
Алгоритм |
Пример |
(bit):=0 |
;(P1)=5EH=01011110B ;в РПД (28H)=31H CLR P1.3 ;(P1)=56H=01010110B CLR 40H ;(28H)=30H |
CPL A |
1 1 1 1 0 1 0 0 |
|
Алгоритм |
Пример |
(A):= |
;(A)=65H=01100101B CPL A ;(A)=9AH=10011010B |
CPL C |
1 0 1 1 0 0 1 1 |
|
Алгоритм |
Пример |
(C):= |
;(C)=1, (AC)=1, (OV)=0 CPL C ;(C)=0, (AC)=1, (OV)=0 |
CPL bit |
1 0 1 1 0 0 1 0 |
bit |
Алгоритм |
Пример |
(bit):= |
;(P1)=39H=00111001B CPL P1.1 CPL P1.3 ;(P1)=33H=00110011B |
DA A |
1 1 0 1 0 1 0 0 |
|
Для выполнения сложения может использоваться любая из типов команд ADD или ADDC. Если значение битов 3-0 аккумулятора превышает 9 (xxxx1010B-xxxx1111B) или, если содержимое флага AC установлено в "1", то к содержимому A прибавляется 06H, при этом получается соответствующая двоично-десятичная цифра в младшем полубайте A. Указанное сложение не изменяет содержимое флага AC, но устанавливает в "1" содержимое флага переноса C, если перенос из поля младших четырех бит распространяется через все старшие биты A, в противном случае - не изменяет (C). Далее, если содержимое флага C равно "1", или если значение битов 7-4 аккумулятора превышает 9 (1010xxxxB-1111xxxxB), то это значение увеличивается на 6, создавая соответствующую двоично-десятичную цифру в старшем полубайте A. При этом флаг C устанавливается (не изменяется), если имеется (отсутствует) перенос из бита 7 аккумулятора. Время выполнения команды 1 цикл.
Алгоритм |
Пример |
если (A[3-0])>9 или (AC)=1, то (A):=(A)+6 если (A[7-4])>9 или (C)=1, то (A[7-4]):=(A[7-4])+6 |
;(A)=30H, (R3)=99H ADD A,R3 ;(A)=0C9H, ;(AC)=0, (C)=0 DA A ;(C)=1, (A)=29H, (AC)=0 |
DEC A |
0 0 0 1 0 1 0 0 |
|
Алгоритм |
Пример |
(A):=(A)-1 |
;(A)=00H, (C)=1, (AC)=1 DEC A ;(A)=0FFH, (C)=1, (AC)=1 |
DEC Rn ;где n=0-7 |
0 0 0 1 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(Rn):=(Rn)-1, где n=0-7 |
;(R1)=35H, (C)=0, (AC)=1 DEC R1 ;(R1)=34H, (C)=0, (AC)=1 |
DEC direct |
0 0 0 1 0 1 0 1 |
direct |
Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(direct):=(direct)-1 |
;(SCON)=0A0H, (C)=1, (AC)=0 DEC SCON ;(SCON)=9FH, ;(C)=1, (AC)=0 |
DEC @Ri ;где iÎ{0,1} |
0 0 0 1 0 1 1 i |
|
Алгоритм |
Пример |
((Ri)):=((Ri))-1, где iÎ{0,1} |
;(R1)=7FH, в РПД (7FH)=40H DEC @R1 ;(R1)=7FH, ;в РПД (7FH)=3FH |
DIV AB |
1 0 0 0 0 1 0 0 |
|
Алгоритм |
Пример |
(A):=(A):(B), (B):=mod[(A):(B)], (C):=0 если (В)¹0, то (OV):=0 если (В)=0, то (OV):=1 |
;(A)=0FBH=251, (B)=12H=18, ;(C)=1, (OV)=1 DIV AB ;(C)=0, (OV)=0, ;(A)=0DH=13, (B)=11H=17 |
DJNZ Rn,addr ;где n=0-7 |
1 1 0 1 1 r r r |
rel |
где rrrB=000-111B |
Команда DJNZ Rn, addr на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(Rn):=(Rn)-1, где n=0-7 если (Rn)¹0, то (PC):=(PC)+2+rel если (Rn)=0, то (PC):=(PC)+2 |
;(R3)=0AH, rel=0FEH MT5: DJNZ R3,MT5 ;команда ;выполнится 10 раз |
DJNZ direct,addr |
1 1 0 1 0 1 0 1 |
direct |
rel |
Алгоритм |
Пример |
(direct):=(direct)-1 если (direct)¹0, то (PC):=(PC)+3+rel если (direct)=0, то (PC):=(PC)+3 |
;(P1)=0AH, rel=0FDH MT5: DJNZ P1,MT5 ;команда ;выполнится 10 раз |
INC A |
0 0 0 0 0 1 0 0 |
|
Алгоритм |
Пример |
(A):=(A)+1 |
;(A)=0FFH, (C)=1, (AC)=1 INC A ;(A)=00H, (C)=1, (AC)=1 |
INC Rn ;где n=0-7 |
0 0 0 0 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(Rn):=(Rn)+1, где n=0-7 |
;(R1)=35H, (C)=0, (AC)=1 INC R1 ;(R1)=36H, (C)=0, (AC)=1 |
INC direct |
0 0 0 0 0 1 0 1 |
direct |
Команда на флаги не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
||||
(direct):=(direct)+1 |
;(TMOD)=0A5H, (C)=1, (AC)=0 ;в РПД (23H)=0FFH INC TMOD ;(TMOD)=0A6H, ;(C)=1, (AC)=0 INC 23H ;в РПД (23H)=00H, ;(C)=1, (AC)=0 |
||||
INC @Ri ;где iÎ{0,1} |
0 0 0 0 0 1 1 i |
|
|||
Алгоритм |
Пример |
((Ri)):=((Ri))+1, где iÎ{0,1} |
;(R0)=44H, в РПД (44H)=55H INC @R0 ;(R0)=44H, ;в РПД (44H)=56H |
INC DPTR |
1 0 1 0 0 0 1 1 |
|
Алгоритм |
Пример |
(DPTR):=(DPTR)+1 |
;(DPH)=12H, (DPL)=0FFH, INC DPTR ;(DPH)=13H, ;(DPL)=00H |
JB bit,addr |
0 0 1 0 0 0 0 0 |
bit |
rel |
Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
|||||
если (bit)=1, то (PC):=(PC)+3+rel если (bit)=0, то (PC):=(PC)+3 |
;MT6 соответствует ;адресу 2FFH, ;(PC)=2F0H, rel=0CH, (A)=96H JB A.2,MT6 ;(PC)=2FFH, ;(A)=96H |
|||||
JBC bit,addr |
0 0 0 1 0 0 0 0 |
bit |
rel |
|||
Алгоритм |
Пример |
если (bit)=1, то (PC):=(PC)+3+rel и (bit):=0 если (bit)=0, то (PC):=(PC)+3 |
;MT8 соответствует адресу 400H, ;(PC)=3F1H, rel=0CH, (A)=78H JBС A.3,MT8 ;(PC)=400H, (A)=70H |
JC addr |
0 1 0 0 0 0 0 0 |
rel |
Алгоритм |
Пример |
если (С)=1, то (PC):=(PC)+2+rel если (C)=0, то (PC):=(PC)+2 |
;MT1 соответствует адресу 1F0H, ;(PC)=1FFH, rel=0EFH, (C)=1 JС MT1 ;(PC)=1F0H, (C)=1 |
JMP @A+DPTR |
0 1 1 1 0 0 1 1 |
|
Команда "косвенный переход" складывает 8-битовое содержимое аккумулятора A с 16- битовым содержимым указателя данных DPTR и загружает полученный результат в счетчик команд PC. Указанное сложение выполняется таким образом, что перенос из младших 8-ми бит распространяется на старшие биты результата. Содержимое A и DPTR не изменяется. Команда на флаги не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(PC):=(DPTR[15-0])+(A[7-0]) |
;(PC)=34EH, (DPTR)=329H, (A)=86H JMP @A+DPTR ;(PC)=3AFH |
JNB bit,addr |
0 0 1 1 0 0 0 0 |
bit |
rel |
Алгоритм |
Пример |
если (bit)=0, то (PC):=(PC)+3+rel если (bit)=1, то (PC):=(PC)+3 |
;MT2 соответствует адресу 2FFH, ;(PC)=2F0H, rel=0CH, (A)=96H JNB A.0,MT2 ;(PC)=2FFH, (A)=96H |
JNC addr
|
0 1 0 1 0 0 0 0 |
rel |
Алгоритм |
Пример |
если (С)=0, то (PC):=(PC)+2+rel если (C)=1, то (PC):=(PC)+2 |
;MT1 соответствует адресу 200H, ;(PC)=1F0H, rel=0EH, (C)=0 JNС MT1 ;(PC)=200H, (C)=0 |
JNZ addr
|
0 1 1 1 0 0 0 0 |
rel |
Адрес перехода addr определяется при помощи сложения 8-битового числа rel (со знаком), размещенного в младшем байте команды, с содержимым счетчика команд PC после увеличения его на 2. Таким образом, указанный переход возможен в пределах от -128 до +127 относительно начального адреса следующей команды, при этом отрицательное значение rel представляется двоичным числом в дополнительном коде. Команда на флаги и (A) не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
если (A)¹0, то (PC):=(PC)+2+rel если (A)=0, то (PC):=(PC)+2 |
;MT4 соответствует адресу 183H, ;(PC)=200H, rel=81H, (A)=01H JNZ MT4 ;(PC)=183H, (A)=01H |
JZ addr |
0 1 1 0 0 0 0 0 |
rel |
Алгоритм |
Пример |
если (A)=0, то (PC):=(PC)+2+rel если (A)¹0, то (PC):=(PC)+2 |
;MT4 соответствует адресу 231H, ;(PC)=200H, rel=2FH, (A)=00H JZ MT4 ;(PC)=231H, (A)=00H |
LCALL addr16 |
0 0 0 1 0 0 1 0 |
addr16[15-8] |
addr16[7-0] |
Алгоритм |
Пример |
(PC):=(PC)+3 (SP):=(SP)+1, ((SP)):=(PC[7-0]) (SP):=(SP)+1, ((SP)):=(PC[15-8]) (PC):=addr16[15-0] |
;(SP)=10H, (PC)=135H, ;MT соответствует адресу 300H LCALL MT ;(SP)=12H, (PC)=300H, ;в РПД (11H)=38H, (12H)=01H |
LJMP addr16 |
0 0 0 0 0 0 1 0 |
addr16[15-8] |
addr16[7-0] |
Алгоритм |
Пример |
(PC):=addr16[15-0] |
;(PC)=234H LJMP 12CH ;(PC)=12CH |
MOV A,Rn
;где n=0-7 |
1 1 1 0 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(A):=(Rn), где n=0-7 |
;(A)=0FAH, (R6)=93H MOV A,R6 ;(A)=93H, (R6)=93H |
MOV A,@Ri ;где iÎ{0,1} |
1 1 1 0 0 1 1 i |
|
Алгоритм |
Пример |
(A):=((Ri)), где iÎ{0,1} |
;(A)=0FDH, (R1)=30H, ;в РПД (30H)=17H MOV A,@R1 ;(A)=17H, (R1)=30H, ;в РПД (30H)=17H |
MOV A,direct |
1 1 1 0 0 1 0 1 |
direct |
При этом содержимое используемой ячейки не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(A):=(direct) |
;(A)=24H, (DPL)=3DH MOV A,DPL ;(A)=3DH,(DPL)=3DH |
MOV A,#data8 |
0 1 1 1 0 1 0 0 |
data8 |
Алгоритм |
Пример |
(A):=data8 |
;(A)=81H MOV A,#0FFH ;(A)=0FFH |
MOV Rn,A
;где n=0-7 |
1 1 1 1 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(Rn):=(A), где n=0-7 |
;(A)=55H, (R6)=93H MOV R6,A ;(A)=55H, (R6)=55H |
MOV Rn,direct ;где n=0-7 |
1 0 1 0 1 r r r |
direct |
где rrrB=000-111B |
Алгоритм |
Пример |
(Rn):=(direct), где n=0-7 |
;(R5)=81H, в РПД (16H)=22H MOV R5,16H ;(R5)=22H, ;в РПД (16H)=22H |
MOV Rn,#data8 ;где n=0-7 |
0 1 1 1 1 r r r |
data8 |
где rrrB=000-111B |
Алгоритм |
Пример |
(Rn):=data8, где n=0-7 |
;(R2)=5DH MOV R2,#0FCH ;(R2)=0FCH |
MOV direct,A |
1 1 1 1 0 1 0 1 |
direct |
Команда " переслать байт" пересылает содержимое аккумулятора A в ячейку, адрес которой определяется символическим именем direct в области резидентной памяти данных или в среде регистров специальных функций. При этом содержимое A не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(direct):=(A) |
;(A)=3CH, (B)=4DH MOV B,A ;(A)=3CH,(B)=3CH |
MOV direct,Rn ;где n=0-7 |
1 0 0 0 1 r r r |
direct |
где rrrB=000-111B |
Алгоритм |
Пример |
(direct):=(Rn), где n=0-7 |
;(R7)=5EH, (P1)=0FFH MOV P1,R7 ;(R7)=5EH, (P1)=5EH |
MOV direct,direct |
1 0 0 0 0 1 0 1 |
direct |
direct |
Алгоритм |
Пример |
(direct):=(direct) |
;в РПД (4CH)=7AH, (B)=0F4H MOV 4CH,B ;(B)=0F4H, ;в РПД (4CH)=0F4H |
MOV direct,@Ri ;где iÎ{0,1} |
1 0 0 0 0 1 1 i |
direct |
Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(direct):=((Ri)), где iÎ{0,1} |
;в РПД (6FH)=57H, ;(R0)=6FH, (PSW)=0C2H MOV PSW,@R0 ;(PSW)=57H, ;(R0)=6FH, в РПД (6FH)=57H |
MOV direct,#data8 |
0 1 1 1 0 1 0 1 |
direct |
data8 |
Алгоритм |
Пример |
(direct):=data8 |
;(P2)=0FFH MOV P2,#33H ;(P2)=33H |
MOV @Ri,A ;где iÎ{0,1} |
1 1 1 1 0 1 1 i |
|
Алгоритм |
Пример |
((Ri)):=(A), где iÎ{0,1} |
;(A)=11H, (R1)=25H, ;в РПД (25H)=48H MOV @R1,A ;(A)=11H, (R1)=25H, ;в РПД (25H)=11H |
MOV @Ri, direct ;где iÎ{0,1} |
1 0 1 0 0 1 1 i |
direct |
Алгоритм |
Пример |
((Ri)):=(direct), где iÎ{0,1} |
;в РПД (55H)=31H, ;(R0)=55H, (TH1)=0CDH MOV @R0,TH1 ;(TH1)=0CDH, ;(R0)=55H, в РПД (55H)=0CDH |
MOV @Ri,#data8 ;где iÎ{0,1} |
0 1 1 1 0 1 1 i |
data8 |
Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
((Ri)):=data8, где iÎ{0,1} |
;(R1)=53H, в РПД (53H)=86H MOV @R1,#77H ;(R1)=53H, ;в РПД (53H)=77H |
MOV C,bit |
1 0 1 0 0 0 1 0 |
bit |
Алгоритм |
Пример |
(C):=(bit) |
;(C)=0, (P1[4])=1 MOV C,P1.4 ;(C)=1, ;(P1[4])=1 |
MOV bit,C |
1 0 0 1 0 0 1 0 |
bit |
Алгоритм |
Пример |
(bit):=(C) |
;в РПД (22H)=0D0H, (C)=1 MOV 10H,C ;(C)=1, ;в РПД (22H)=0D1H |
MOV DPTR,#data16 |
1 0 0 1 0 0 0 0 |
data16[15-8] |
data16[7-0] |
Алгоритм |
Пример |
(DPTR):=data16 |
;(DPH)=23H, (DPL)=0DFH MOV DPTR,#1234H ;(DPH)=12H, (DPL)=34H |
MOVC A,@A+DPTR |
1 0 0 1 0 0 1 1 |
|
Таким образом, в указанной пересылке может участвовать любая ячейка из памяти программ объемом до 64 Кбайт. Содержимое DPTR не изменяется. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(A):=((A)+(DPTR)) |
;(A)=01H, (DPTR)=30FFH, ;в ПП (3100H)=22H MOVC A,@A+DPTR ;(A)=22H, ;(DPTR)=30FFH |
MOVC A,@A+PC |
1 0 0 0 0 0 1 1 |
|
Алгоритм |
Пример |
(A):=((A)+(PC)+1) |
;(A)=11H, (PC)=2300H, ;в ПП (2312H)=44H MOVC A,@A+PC ;(A)=44H, ;(PC)=2301H |
MOVX A,@Ri ;где iÎ{0,1} |
1 1 1 0 0 0 1 i |
|
Алгоритм |
Пример |
(A):=((Ri)), где iÎ{0,1} |
;(A)=0CCH, (R0)=44H, ;в ВПД (44H)=3EH MOVX A,@R0 ;(A)=3EH, (R0)=44H, ;в ВПД (44H)=3EH |
MOVX A,@DPTR |
1 1 1 0 0 0 0 0 |
|
Алгоритм |
Пример |
(A):=((DPTR)) |
;(A)=76H, (DPTR)=6D44H, ;в ВПД (6D44H)=88H MOVX A,@DPTR ;(DPTR)=6D44H, ;(A)=88H, в ВПД (6D44H)=88H |
MOVX @Ri,A ;где iÎ{0,1} |
1 1 1 1 0 0 1 i |
|
Алгоритм |
Пример |
((Ri)):=(A), где iÎ{0,1} |
;(A)=0C6H, (R1)=22H, ;в ВПД (22H)=33H MOVX @R1,A ;(A)=0C6H, (R1)=22H, ;в ВПД (22H)=0C6H |
MOVX @DPTR,A |
1 1 1 1 0 0 0 0 |
|
Алгоритм |
Пример |
((DPTR)):=(A) |
;(A)=55H, (DPTR)=1234H, ;в ВПД (1234H)=11H MOVX @DPTR,A ;(DPTR)=1234H, ;(A)=55H, ;в ВПД (1234H)=55H |
MUL AB |
1 0 1 0 0 1 0 0 |
|
Алгоритм |
Пример |
(A)×(B)=data16 (A):=data16[7-0], (B):=data16[15-8] (C):=0 если data16 £ 0FFH, то (OV):=0 если data16 > 0FFH, то (OV):=1 |
;(A)=50H=80, (B)=0A0H=160, ;(C)=1, (OV)=0 MUL AB ;(C)=0, (OV)=1, ;(A)=00H, (B)=32H |
NOP |
0 0 0 0 0 0 0 0 |
|
Алгоритм |
Пример |
(PC):=(PC)+1 |
;(PC)=1FFH NOP NOP ;(PC)=201H |
ORL A,Rn
;где n=0-7 |
0 1 0 0 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(A):=(A)Ú(Rn), где n=0-7 |
;(A)=0FH, (R4)=0F3H ORL A,R4 ;(A)=0FFH, ;(R4)=0F3H |
ORL A,@Ri ;где iÎ{0,1} |
0 1 0 0 0 1 1 i |
|
Алгоритм |
Пример |
(A):=(A)Ú((Ri)), где iÎ{0,1} |
;(A)=22H, (R0)=55H, ;в РПД (55H)=11H ORL A,@R0 ;(A)=33H, (R0)=55H, ;в РПД (55H)=11H |
ORL A,direct |
0 1 0 0 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(A)Ú(direct) |
;(A)=23H, (PSW)=14H ORL A,PSW ;(A)=37H, ;(PSW)=14H |
ORL A,#data8 |
0 1 0 0 0 1 0 0 |
data8 |
Алгоритм |
Пример |
(A):=(A)Údata8 |
;(A)=36H ORL A,#41H ;(A)=77H |
ORL direct,A |
0 1 0 0 0 0 1 0 |
direct |
Алгоритм |
Пример |
(direct):=(A)Ú(direct) |
;(A)=55H, (P2)=0AAH ORL P2,A ;(A)=55H, ;(P2)=0FFH |
ORL direct,#data8 |
0 1 0 0 0 0 1 1 |
direct |
data8 |
Алгоритм |
Пример |
(direct):=(direct)Údata8 |
;(P1)=0FFH ORL P1,#73H ;(P1)=0FFH |
ORL C,bit |
0 1 1 1 0 0 1 0 |
bit |
Алгоритм |
Пример |
(C):=(C)Ú(bit) |
;(C)=0, (P1[2])=1, ;в РПД (2EH)=12H ORL C,P1.2 ;(C)=1, (P1[2])=1 ORL C,70H ;(C)=1, ;в РПД (2EH)=12H |
ORL C,/bit |
1 0 1 0 0 0 0 0 |
bit |
Результат помещается в С. Команда на состояние других флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
(C):=(C)Ú |
;(C)=0, (AC)=0 ORL C,/AC ;(C)=1, (AC)=0 |
POP direct |
1 1 0 1 0 0 0 0 |
direct |
Алгоритм |
Пример |
(direct):=((SP)) (SP):=(SP)-1 |
;(SP)=32H, (DPH)=0AAH, ;в РПД (32H)=55H POP DPH ;(SP)=31H,(DPH)=55H |
PUSH direct |
1 1 0 0 0 0 0 0 |
direct |
Алгоритм |
Пример |
(SP):=(SP)+1 ((SP)):=(direct) |
;(SP)=44H, (DPL)=33H, ;в РПД (45H)=0CEH PUSH DPL ;(SP)=45H, в РПД (45H)=33H |
RET |
0 0 1 0 0 0 1 0 |
|
Алгоритм |
Пример |
(PC[15-8]):=((SP)) (SP):=(SP)-1 (PC[7-0]):=((SP)) (SP):=(SP)-1 |
;(SP)=32H, (PC)=3DFH, ;в РПД (31H)=23H, (32H)=01H RET ;(SP)=30H, (PC)=123H, ;в РПД (31H)=23H, (32H)=01H |
RETI |
0 0 1 1 0 0 1 0 |
|
При этом содержимое SP уменьшается на два. Команда на состояние флагов не влияет и имеет время выполнения 2 цикла.
Алгоритм |
Пример |
||||
(PC[15-8]):=((SP)) (SP):=(SP)-1 (PC[7-0]):=((SP)) (SP):=(SP)-1 |
;(SP)=23H, (PC)=0D3FH, ;в РПД (22H)=34H, (23H)=02H RETI ;(SP)=21H, (PC)=234H, ;в РПД (22H)=34H, (23H)=02H |
||||
RL A |
0 0 1 0 0 0 1 1 |
|
|||
Алгоритм |
Пример |
(A[M+1]):=(A[M]), где M=0-6 (A[0]):=(A[7]) |
;(A)=85H, (C)=0 RL A RL A ;(A)=16H, (C)=0 |
RLC A |
0 0 1 1 0 0 1 1 |
|
Алгоритм |
Пример |
(A[M+1]):=(A[M]), где M=0-6 (A[0]):=(С), (С):=(A[7]) |
;(A)=85H, (C)=0 RLC A ;(A)=0AH, (C)=1 |
RR A |
0 0 0 0 0 0 1 1 |
|
Алгоритм |
Пример |
(A[M]):=(A[M+1]), где M=0-6 (A[7]):=(A[0]) |
;(A)=85H, (C)=1 RR A RR A ;(A)=61H, (C)=1 |
RRC A |
0 0 0 1 0 0 1 1 |
|
Алгоритм |
Пример |
(A[M]):=(A[M+1]), где M=0-6 (A[7]):=(С), (С):=(A[0]) |
;(A)=85H, (C)=0 RRC A ;(A)=42H, (C)=1 |
SETB C |
1 1 0 1 0 0 1 1 |
|
Алгоритм |
Пример |
(C):=1 |
;(C)=0 SETB C ;(C)=1 |
SETB bit
|
1 1 0 1 0 0 1 0 |
bit |
Алгоритм |
Пример |
(bit):=1 |
;(P2)=38H SETB P2.0 ;(P2)=39H |
SJMP addr |
1 0 0 0 0 0 0 0 |
rel |
Алгоритм |
Пример |
(PC):=(PC)+2+rel |
;MT4 соответствует адресу 104H, ;(PC)=165H, rel=9DH SJMP MT4 ;(PC)=104H |
SUBB A,Rn ;где n=0-7 |
1 0 0 1 1 r r r |
где rrrB=000B-111B |
Время выполнения команды 1 цикл.
Алгоритм |
Пример |
(A):=(A)-(C)-(Rn), где n=0-7 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=0C9H, (R2)=54H, (C)=1 SUBB A,R2 ;(A)=74H,(R2)=54H, ;(AC)=0, (C)=0, (OV)=1 |
SUBB A,@Ri ;где iÎ{0,1} |
1 0 0 1 0 1 1 i |
Алгоритм |
Пример |
(A):=(A)-(C)-((Ri)), где iÎ{0,1} (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=49H, (R0)=3AH, ;в РПД (3AH)=68H, (C)=1 SUBB A,@R0 ;(A)=0E0H, ;(AC)=0, (C)=1, (OV)=0 |
SUBB A,direct |
1 0 0 1 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(A)-(C)-(direct) (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=97H, (C)=0, (B)=25H SUBB A,B ;(A)=72H, (B)=25H, ;(AC)=0, (C)=0, (OV)=1 |
SUBB A,#data8 |
1 0 0 1 0 1 0 0 |
data8 |
Алгоритм |
Пример |
(A):=(A)-(C)-data8 (С):=x, (OV):=x, (AC):=x, где xÎ{0,1} |
;(A)=0BEH, (C)=0 SUBB A,#3FH ;(A)=7FH, ;(AC)=1, (C)=0, (OV)=1 |
SWAP A |
1 1 0 0 0 1 0 0 |
Алгоритм |
Пример |
(A[3-0]):=(A[7-4]) (A[7-4]):=(A[3-0]) |
;(A)=49H SWAP A ;(A)=94H |
XCH A,Rn
;где n=0-7 |
1 1 0 0 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(A):=(Rn), где n=0-7 (Rn):=(A) |
;(A)=0FAH, (R6)=93H XCH A,R6 ;(A)=93H, (R6)=0FAH |
XCH A,@Ri ;где iÎ{0,1} |
1 1 0 0 0 1 1 i |
|
Алгоритм |
Пример |
(A):=((Ri)), где iÎ{0,1} ((Ri)):=(A) |
;(A)=0FDH, (R1)=30H, ;в РПД (30H)=17H XCH A,@R1 ;(A)=17H, (R1)=30H, ;в РПД (30H)=0FDH |
XCH A,direct |
1 1 0 0 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(direct) (direct):=(A) |
;(A)=24H, (DPL)=3DH XCH A,DPL ;(A)=3DH, ;(DPL)=24H |
XCHD A,@Ri ;где iÎ{0,1} |
1 1 0 1 0 1 1 i |
|
Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(A[3-0]):=((Ri))[3-0], где iÎ{0,1} ((Ri))[3-0]:=(A[3-0]) |
;(A)=0FDH, (R1)=30H, ;в РПД (30H)=17H XCHD A,@R1 ;в РПД (30H)=1DH, ;(A)=0F7H, (R1)=30H |
XRL A,Rn
;где n=0-7 |
0 1 1 0 1 r r r |
где rrrB=000B-111B |
Алгоритм |
Пример |
(A):=(A)Å(Rn), где n=0-7 |
;(A)=0FH, (R4)=0F3H XRL A,R4 ;(A)=0FCH, (R4)=0F3H |
XRL A,@Ri ;где iÎ{0,1} |
0 1 1 0 0 1 1 i |
|
Алгоритм |
Пример |
(A):=(A)Å((Ri)), где iÎ{0,1} |
;(A)=22H, (R0)=55H, ;в РПД (55H)=33H XRL A,@R0 ;(A)=11H, ;(R0)=55H, в РПД (55H)=33H |
XRL A,direct |
0 1 1 0 0 1 0 1 |
direct |
Алгоритм |
Пример |
(A):=(A)Å(direct) |
;(A)=23H, (PSW)=34H XRL A,PSW ;(A)=17H, (PSW)=34H |
XRL A,#data8 |
0 1 1 0 0 1 0 0 |
data8 |
Команда " логическое ИСКЛЮЧАЮЩЕЕ ИЛИ" выполняет поразрядное сложение по модулю 2 содержимого аккумулятора A с байтом данных data8, непосредственно указанным в команде. Результат размещается в A. Команда на состояние флагов не влияет и имеет время выполнения 1 цикл.
Алгоритм |
Пример |
(A):=(A)Ådata8 |
;(A)=36H XRL A,#22H ;(A)=14H |
XRL direct,A |
0 1 1 0 0 0 1 0 |
direct |
Алгоритм |
Пример |
(direct):=(A)Å(direct) |
;(A)=55H, (P2)=63H XRL P2,A ;(A)=55H, (P2)=36H |
XRL direct,#data8 |
0 1 1 0 0 0 1 1 |
direct |
data8 |
Алгоритм |
Пример |
(direct):=(direct)Ådata8 |
;(P1)=0FFH XRL P1,#11H ;(P1)=0EEH |
Директивы в отличие от команд ассемблерного языка не преобразуются в объектный код и применяются для управления процессом трансляции исходной МК-программы.
Рассмотрим основные директивы языка АСМ51.
ASCII <операнды>
Директива последовательно размещает в ячейках памяти программ (ПП) коды ASCII символов строки, указанной в поле <операнды> и заканчивающейся возвратом каретки. |
Пример |
;MT1 соответствует адресу ;20FH в ПП MT1 ASCII PEN ;в ПП (20FH)=50H, ;(210H)=45H, (211H)=4EH |
DB <операнды>
Директива последовательно размещает в ячейках памяти программ (ПП) байтовые константы, перечисленные через запятую в поле <операнды>. Если указанное поле отсутствует, то используется одна ячейка ПП, в которую заносится "0". |
Пример |
;MT1 соответствует адресу ;1FFH в ПП MT1 DB 12H,<.NOT.11H+1 DB 10100101B,32 ;в ПП (1FFH)=12H, ;(200H)=0EFH, ;(201H)=0A5H, (202H)=20H |
Директива резервирует ячейки памяти программ (ПП), причем количество этих ячеек определяется значением, указанным в поле <операнды>. |
Пример |
;MT2 соответствует адресу ;200H в ПП MT2 DS 12H ;(PC)=212H |
Директива последовательно размещает в ячейках памяти программ (ПП) 2-байтовые константы, перечисленные через запятую в поле <операнды>. Если указанное поле отсутствует, то используются две ячейки ПП, в которые заносится "0". |
Пример |
;MT1=20FH MT1 DW 3212H DW ;в ПП (20FH)=32H, ;(210H)=12H, ;(211H)=(212H)=00H |
Директива определяет конец МК-программы.
ENDM
Директива определяет конец макроопределения.
<метка> EQU <операнды>
Директива присваивает символическому имени, размещенному в поле <метка>, байтовое или 2-байтовое значение, указанное в поле <операнды>. Это имя не может быть переопределено. |
Пример |
SS EQU 25H ZZ EQU SS+2 PP EQU ZZ-1 MOV A,#PP ;(A)=26H |
Директива объявляет символические имена, указанные через запятую в поле <операнды>, как внешние, то есть определяемые в другой (других) МК-программе (МК-программах).
INCLUDE <операнды>
Директива включает в трансляцию файл, имя которого вместе с расширением указаны в поле <операнды>. Включения не могут подвергаться вложению.
LIST
Директива разрешает вывод листинга следующего за ней текста МК-программы. По умолчанию выполняется директива NLIST.
LONG <операнды>
Директива последовательно размещает в ячейках памяти программ (ПП) 4-байтовые константы, перечисленные через запятую в поле <операнды>. Если указанное поле отсутствует, то используются четыре ячейки ПП, в которые заносится "0". |
Пример |
;MT1 соответствует адресу ;4EEH в ПП MT1 LONG 11223344H ;в ПП (4EEH)=11H, ;(4EFH)=22H, (4F0H)=33H, ;(4F1H)=44H |
<метка> MACRO <операнды>
Директива начинает макроопределение, которое составляется из операторов языка АСМ51 (строк исходного текста МК-программы) и должно заканчиваться директивой ENDM. Любое поле включенных в макроопределение операторов (кроме поля <комментарий>) может быть представлено формальным параметром, которые перечисляются через запятую в поле <операнды>. В поле <метка> указывается символическое имя макрокоманды, которая будет определяться данным макроопределением. Макрокоманда может использоваться в МК-программе произвольное число раз и при трансляции заменяется на тело своего макроопределения, причем фактические параметры, перечисленные через запятую в поле <операнды> макрокоманды подставляются вместо соответствующих формальных параметров макроопределения.
До трансляции |
После трансляции |
TC MACRO x,y,z MOV A,#z x A,#y ENDM MOV R0,#25 TC ORL,15H,10 MOVX @R0,A END |
1 TC MACRO x,y,z 2 MOV A,#z 3 x A,#y 4 ENDM 5 0000 7819 MOV R0,#25 6 0002 TC ORL,15H,10 7 0002 740A MOV A,#10 8 0004 4415 ORL A,#15H 9 0006 ENDM 10 0006 F2 MOVX @R0,A 11 0007 END |
Директива запрещает вывод листинга следующего за ней текста МК-программы, если ранее выполнялась директива LIST.
ORG <операнды>
Директива устанавливает значение программного счетчика PC, причем указанное значение определяется содержимым поля <операнды>. При отсутствии директивы исходное значение PC принимается равным нулю. |
Пример |
;(PC)=1234H ORG 12H ;(PC)=0012H |
Директива объявляет символические имена, указанные через запятую в поле <операнды>, как глобальные (общие), то есть такие, к которым можно осуществлять ссылку из других МК-программ.
<метка> REG <операнды>
Директива присваивает символическому имени, размещенному в поле <метка>, байтовое или битовое значение, указанное в поле <операнды>, причем указанное значение может быть задано не только числом, другим символическим именем или выражением, но и именем программно доступного элемента микроконтроллера. Символическое имя, размещенное в поле <метка>, не может быть переопределено. |
Пример |
X REG R4 ;X определя- ;ется как регистр R4 Y REG P3 ;Y определя- ;ется как порт P3 Z REG Y ;Z определяет- ;ся как порт P3 B.0 REG C ;B.0 определя- ;ется как флаг C B.1 REG X.1 ;B.1 опреде- ;ляется как первый бит ;регистра R4 |
RECSIZE <операнды>
Директива используется для управления редактором связей. В частности, от содержимого поля <операнды> этой директивы зависит максимальный размер записей в загрузочном модуле МК-программы (см. подраздел 3.3).
SYMBOLS
Директива используется для управления редактором связей. В частности, разрешает формирование специального файла, содержащего символические имена, в формате MICROTEK или ZAK (см. подраздел 3.3).
<метка> VAR <операнды>
Директива присваивает символическому имени, размещенному в поле <метка>, байтовое или 2-байтовое значение, указанное в поле <операнды>. Это имя может быть переопределено. |
Пример |
SS VAR 25H MOV A,#SS ;(A)=25H SS VAR 13H MOV A,#SS ;(A)=13H |
1. Однокристальные микроЭВМ. М.: МИКАП, 1994.
2. Сташин В.В. и др. Проектирование цифровых устройств на однокристальных микроконтроллерах/ В.В.Сташин, А.В.Урусов, О.Ф.Мологонцева. М.: Энергоатомиздат, 1990.
3. Щелкунов Н.Н., Дианов А.П. Микропроцессорные средства и системы. М.: Радио и связь, 1989.
4. ОСТ 110342.2-87. Язык ассемблера АСМ51. М., 1987.
|