Память программ
В зависимости от модификации, различные типы БИС МК-51 имеют разное распределение внутренней и внешней памяти программ (см.табл. 14.1)), оставляя неизменной максимально допустимую общую емкость в 64 Кбайт. Память программ адресуется с помощью 16-разрядной адресной шины с использованием счетчика команд (program counter -PC), который вырабатывает 16-разрядные адреса. Она имеет байтовую организацию и доступна только для чтения.
Обращение к внутренней или внешней памяти программ происходит автоматически с применением аппаратных средств МК. При этом в зависимости от состояния управляющего входа DEMA микроконтроллера вся память трактуется либо как только внешняя (при DEMA = 0), либо как внутренняя, занимающая младшие адреса адресного пространства, и внешняя, занимающая адреса от старшего адреса внутренней памяти 8000h до максимально допустимого FFFFh. С точки зрения программиста имеется только один массив памяти программ емкостью 64 Кбайт.
По сигналу сброса, поступающему на вход Reset, в микроконтроллере выполняются следующие действия:
-
Устанавливаются в ноль программный счетчик PC и все регистры специальных функций, кроме защелок портов P0-P3, указателя стека SP и регистра SBuf последовательного порта, что приводит к:
- запрету всех прерываний;
- остановке работы таймеров-счетчиков и последовательного порта;
- выбору Банка 0 регистров;
- началу работы любой программы с адреса 0 (программный счетчик РС = 0).
-
Указатель стека (SP) устанавливается в состояние SP = 07. SP указывает на верхнюю занятую ячейку стека. При обращении к стеку на запись сначала значение SP увеличивается на 1, а затем производится запись во внутреннюю память данных по адресу, хранящемуся в SP. Считывание из стека производится по адресу, хранящемуся в SP, после чего значение SP уменьшается на 1. Таким образом, стек располагается в начальный момент начиная с адреса 8. Его положение в памяти можно переопределить, записав в SP другое число.
- Защелки всех линий портов P0-P3 устанавливаются в 1, настраивая их на ввод информации.
- В регистр SBuf последовательного порта и в ОЗУ записываются случайные значения.
Система команд
Микроконтроллер имеет достаточно простую систему из 111 команд, допускающую только следующие режимы адресации:
- прямая к памяти данных (память данных или регистры специальных функций);
- косвенная к памяти данных (допустима только с использованием регистров R0 и R1 рабочего банка регистров);
- прямая к регистрам;
- непосредственная;
- прямая к битам (в битовой памяти или в регистрах специальных функций, адреса которых кратны восьми, то есть заканчиваются на 000b).
Система команд микроконтроллера МК-51 приведена в табл. 14.3.
Спецификой данной системы команд является отсутствие ортогональности, иными словами, операции, которые можно проводить с некоторыми регистрами и режимами адресации, не всегда допустимы с другими регистрами и режимами адресации. Наглядным примером этому служит то, что косвенная адресация возможна с использованием только регистров R0 и R1. Также часть команд можно выполнять только через специальный регистр-аккумулятор. Поэтому при программировании следует обращать особое внимание на то, с какими регистрами и режимами адресации может работать та или иная команда.
Таблица
14.3.
Система команд микроконтроллера МК-51
Мнемоника |
Режимы адресации |
Время выполнения,такт |
Действие |
Арифметические инструкции |
ADD,A,byte |
Dir,Ind,Reg,Imm |
1 |
A=A+byte |
ADDC A,byte |
Dir,Ind,Reg,Imm |
1 |
A=A+byte+C |
DA A |
Аккумулятор |
1 |
Десятичная коррекция |
DEC A |
Аккумулятор |
1 |
A=A-1 |
DEC byte |
Dir,Ind,Reg |
1 |
byte=byte-1 |
DIV AB |
Аккумулятор и B |
4 |
A=[A/B],B=mod(A/B) |
INC A |
Аккумулятор |
1 |
A=A+1 |
INC byte |
Dir,Ind,Reg |
1 |
byte=byte+1 |
INC DPTR |
DPTR |
2 |
DPTR=DPTR+! |
MUL AB |
Аккумулятор и B |
4 |
B,A=B*A |
SUBC A,byte |
Dir,Ind,Reg,Imm |
1 |
A=A-byte-C |
Логические инструкции |
ANL A,byte |
Dir,Ind,Reg,Imm |
1 |
A=A&byte |
ANL byte,A |
Dir |
1 |
byte= byte&A |
ANL byte,#data |
Dir |
2 |
byte= byte&#data |
CLR A |
Аккумулятор |
1 |
A=00h |
CPL A |
Аккумулятор |
1 |
A=^(A) |
ORL A,byte |
Dir,Ind,Reg,Imm |
1 |
A=A v byte |
ORL byte,A |
Dir |
1 |
byte=byte v A |
ORL byte,#data |
Dir |
2 |
byte=byte v # data |
RL A |
Аккумулятор |
1 |
A=(A)ЦСЛ на 1бит |
RLC A |
Аккумулятор |
1 |
A=(A)ЦСЛ на 1бит через С |
RR A |
Аккумулятор |
1 |
A=(A)ЦСП на 1бит |
RRC A |
Аккумулятор |
1 |
A=(A)ЦСП на 1бит через С |
A=(A)ЦСП на 1бит
через С |
Аккумулятор |
1 |
A(7...4) <=> A(3...0) |
XRL A,byte |
Dir,Ind,Reg,Imm |
1 |
\[
A=A\approx byte
\]
|
XRL byte,A |
Dir |
1 |
\[
byte= byte\approx A
\]
|
XRL byte,#data |
Dir |
2 |
\[
byte= byte\approx \#data
\]
|
Инструкции передачи данных во внутренней памяти данных |
MOV A,src |
Dir,Ind,Reg,Imm |
1 |
A=src |
MOV dest, A |
Dir,Ind,Reg |
1 |
dest=A |
MOV dest, src |
Dir,Ind,Reg,Imm |
1 |
dest=src |
MOV DPTR,#data |
Imm |
2 |
DPTR=data |
PUSH src |
Dir |
2 |
SP=SP+1; @SP=src |
POP dest |
Dir |
2 |
dest=@SP; SP=SP-1 |
XCH A,byte |
Dir,Ind,Reg |
1 |
A <=> byte |
XCHD A,@Ri |
Ind |
1 |
A <=> @Ri |
Инструкции передачи данных,использующие внешнюю память данных |
MOVX A,@Ri |
|
2 |
A=@Ri |
MOVX @Ri,A |
|
2 |
@Ri=A |
MOVX A,@DPTR |
|
2 |
A=@DPTR |
MOVX @DPTR,A |
|
2 |
@DPTR=A |
Инструкции передачи данных, использующие память программ
|
MOVC A,@A+DPTR |
|
2 |
A=@(A+DPTR) |
MOVC A,@A+PC |
|
2 |
A=@(A+PC) |
Булевы инструкции |
ANL C,bit |
bit |
2 |
C=C & bit |
ANL C,/bit |
bit |
2 |
C=C & ^bit |
CLR C |
Битовый aккумулятор |
1 |
C=0 |
CLR bit |
bit |
1 |
bit=0 |
CPL C |
Битовый aккумулятор |
1 |
C=^C |
CPR bit |
bit |
1 |
bit=^bit |
JC rel |
|
2 |
Переход,если С=1
|
JNC rel |
|
2 |
Переход,если С=0
|
JB bit,rel |
bit |
2 |
Переход,если bit=1
|
Примечания
- Режимы адресации:
-
Dir - прямая (регистры специальных функций или память данных);
-
INd - косвенная (допустима только относительно регистров R0 и R1 ; в символической записи команды обозначается @R0 или @R1 соответственно);
-
Reg - прямая к регистрам;
-
Imm - непосредственная (в символической записи команды начинается с # );
-
bit - прямоадресуемый бит (в битовой памяти или регистрах специальных функций);
-
C - битовый аккумулятор (бит CY в регистре состояния PSW );
- запись "byte" в графе "Мнемоника" означает, что операнд в этом поле может адресоваться с помощью любого режима адресации из указанных в графе "Режимы адресации";
- командах, допускающих прямую, но не регистровую адресацию, может указываться регистр общего назначения, однако при трансляции команды в машинное представление его номер будет в этом случае представлен не трех-, а 8-разрядным двоичным кодом, соответствующим прямому адресу этого регистра в памяти данных; некоторые Ассемблеры требуют для таких команд указания в явном виде номера регистра в виде прямого адреса ячейки памяти данных.
- Действия:
- инструкции MUL AB производится перемножение содержимого аккумулятора A и дополнительного аккумулятора B. Старшие разряды произведения помещаются в аккумулятор A, а младшие - в регистр B.
- инструкции DIV AB содержимое аккумулятора A нацело делится на содержимое регистра B. Частное помещается в аккумулятор A, а остаток - в регистр B. Операнды рассматриваются как целые числа без знака.
- & - конъюнкция.
- v- дизъюнкция.
-
\[
\oplus
\]
"исключающее ИЛИ".
-
\[
\wedge
\]
- логическое "НЕ".
- ЦСЛ - циклический сдвиг влево.
- ЦСП - циклический сдвиг вправо.
-
операциях сдвига через С участвует 9-разрядный регистр (8разрядный аккумулятор и бит переноса С).
- <=> - обмен местами операндов.
- инструкции XCHD A,@Ri осуществляется обмен только младших тетрад операндов.
- инструкциях переходов:
-
безусловных переходов adr показывает, что в команде кодируется абсолютный адрес памяти программ, по которо му осуществляется переход;
- для условных переходов rel показывает, что в команде кодируется относительный адрес памяти программ, по которому осуществляется переход при выполнении указанного условия;
- всех командах перехода при записи программы на ассемблере адрес перехода может быть задан меткой целевой команды.
- Некоторые Ассемблеры для инструкции вызова подпрограммы и инструкции безусловного перехода требуют от программиста явного указания длины генерируемого адреса перехода, то есть записи в программе инструкций ACALL, LCALL, AJMP, LJMP, SJMP, и не воспринимают инструкции CALL, JMP. Другие Ассемблеры самостоятельно генерируют инструкции, имеющие необходимую длину поля адреса в зависимости от места расположения адреса перехода, и поэтому допускают использование инструкций CALLи JMP.