Центральный процессор МК семейства MCS-51 (далее CPU MCS-51) выполняет действия над 8-разрядными операндами. Программная модель CPU MCS-51 (рис. 4.35) содержит шесть регистров. Все регистры, кроме счетчика команд PC, являются частью объединенного адресного пространства ОЗУ данных. Следовательно, для обращения к ним могут быть использованы как символьные имена этих регистров - АСС, В, PSW, SP, DPH, DPL, так и их абсолютные адреса - 0E0h, 0F0h, 0D0h, 81 h, 82h, 83h соответственно.
Аккумулятор АСС - 8-разрядный регистр, в котором хранятся операнды, результаты арифметических и логических операций. Сброс устанавливает все разряды АСС в «0».
Регистр В -дополнительный 8-разрядный регистр. Используется в операциях умножения и деления. В других командах может интерпретироваться как регистр общего назначения, его абсолютный адрес указывается во втором байте команды. Сброс устанавливает все разряды В в «О».
Регистр-указатель данных DPTR - 16-разрядный регистр (DPH - старший байт, DPL - младший байт). Основное назначение регистра DPTR - участие в формировании адреса при чтении данных (не команд) из области памяти программ, а также при обмене с внешним ОЗУ данных. Система команд предусматривает возможность обращения к отдельным байтам (DPH или DPL) регистра DPTR, что позволяет использовать эти регистры для хранения промежуточных результатов вычислений или как источник одного из операндов, указывая во втором байте команды абсолютный адрес DPH или DPL. Сброс устанавливает все разряды DPTR в 0.
Программный счетчик PC- 16-разрядный регистр, содержит адрес текущей команды либо адрес операнда, используемого в текущей команде. После сброса МК программный счетчик автоматически устанавливается в «0». Поэтому в МК с процессорным ядром MCS-51 любая программа пользователя должна начинаться с адреса 0000h.
Указатель стека SP- 8-разрядный регистр, содержит адрес верхушки стека. Архитектура процессорного ядра MCS-51 предполагает размещение области стековой памяти только в области внутреннего ОЗУ данных. Поэтому глубина стека ограничена объемом резидентного ОЗУ. Вызов подпрограммы использует 2 ячейки стека, прерывание-4 ячейки. При сбросе МК указатель стека устанавливается в состояние 07h, назначая область стека в первый банк регистров (регистр R7 нулевого банка имеет адрес 07h, при загрузке в стек содержимое указателя SP увеличивается на 1).
Регистр признаков PSW- 8-разрядный регистр, содержит 7 флагов условий: переноса С, дополнительного переноса АС, переполнения OV, четности Р, два флага RS1:RSO для выбора текущего банка регистров, свободно программируемый пользователем флаг FO. Обратите внимание: в регистре признаков отсутствуют флаги нулевого результата Z и отрицательного результата N. Однако, если флаг N в архитектуре MCS-51 действительно отсутствует, то признак нулевого состояния аккумулятора (и только аккумулятора!) формируется, но не запоминается и в регистре признаков не отображается. Поэтому при составлении прикладной программы пользователя команды условного перехода по признаку Z (JZ и JNZ) должны быть выполнены сразу после команды действия над операндами, этот признак формирующей. Краткое описание логики установки «незнакомых» флагов:
Р-флаг четности. Устанавливается в «1», если число единиц в аккумуляторе нечетное. При четном числе единиц в АСС сбрасывается. Все попытки принудительно установить флаг Р в состояние, которое не соответствует текущему состоянию аккумулятора АСС, будут безуспешными.
RS1:RSO-биты выбора банка регистров. Во избежание нежелательного изменения других битов регистра признаков рекомендуется производить модификацию номера банка с использованием команд битового процессора. Распределение регистров общего назначения приведено в табл. 4.5.
Таблица 4.5
FO - флаг пользователя. Назначается пользователем по желанию. Изменение состояния FO и ветвление по значению флага выполняются командами битового процессора.
Процессорное ядро MCS-51 может оперировать с тремя основными типами операндов: булевыми (1 бит), байтовыми (8 бит) и двухбайтовыми (16 бит). В операциях обмена тетрадами используется дополнительное представление информации полубайтами (4 бита). В МК с ядром MCS-51 используются следующие способы адресации:
• неявная (INH - Inherent);
• регистровая (REG - Register);
• непосредственная (IMM - Immediate);
• прямая (DIR - Direct);
• косвенная (IDIR - Indirect);
• относительная (REL - Relative).
К инструкциям с неявной адресацией относятся команды, которые не требуют для своего выполнения каких-либо операндов: RTI, NOP. Неявную адресацию имеют инструкции, которые содержат адрес операнда в коде команды, например, команда установки бита переноса SETB С или команды инкремента аккумулятора INC А и регистров INC Rn. Все команды с неявной адресацией имеют длину в 1 байт и состоят только из кода операции. Обратите внимание: мнемоника команды содержит имя регистра в поле операнда (А, Rn). Но при кодировании команды это имя будет помещено в байт кода операции.
Код операции команды с непосредственной адресацией размещается в первом байте. Сразу же за кодом операции следует 1 байт данных. Эти данные не могут быть изменены в ходе выполнения программы, так как они расположены непосредственно в памяти программ, т. е. в ПЗУ. Большинство команд с непосредственной адресацией имеют длину в 2 байта. Условное обозначение операнда в мнемонике команды - #d8:
Примеры.
ADD A,#d8; Запись команды сложения ADD с непосредственной адресацией в общем виде.
ADD А,#3; Сложить содержимое аккумулятора АСС с числом 3,
; результат записать в АСС.
ORLA,#Oah;Выполнить операцию поразрядного ИЛИ над содержимым АСС и
; шестнадцатеричным числом OAh. Результат записать в АСС.
Всего одна команда с непосредственной адресацией MOV DPTR,#d16 имеет трехбайтовый формат, поскольку выполняет загрузку данных в двухбайтовый регистр DPTR.
MOV DPTR,#3400h; Загрузить в регистр-указатель число 3400h
В командах с регистровой адресацией один из операндов находится в одном из регистров общего назначения Rn = RO - R7 банка, номер которого определяется разрядами RSV.RSO регистра признаков PSW. Если команда производит действие над одним операндом, то формат команды однобайтовый. Номер регистра Rn определяется тремя младшими битами байта кода операции.
Примеры.
MOV A,Rn; Запись команды загрузки аккумулятора АСС из регистра Rn в общем виде.
MOV A.R5; Загрузить аккумулятор АСС операндом из регистра R5.
Двухадресные команды, которые используют регистровую адресацию вместе с непосредственной или прямой адресацией, имеют двухбайтовый срормат команды.
Примеры.
MOV ad.Rn; Запись команды загрузки ячейки памяти с адресом ad из регистра Rn в общем
; виде.
MOV30h,R5; Загрузить ячейку памяти с адресом З0h операндом из регистра R5.
MOV R7,#06; Загрузить в регистр R7 число 6.
Команды с прямой адресацией имеют длину 2 байта. Первый байт предназначен для кода команды, второй байт содержит адрес ячейки резидентной памяти данных, где хранится операнд. Так как МК с ядром MCS-51 имеют адресное пространство внутренней памяти данных 00h - 0FFh, то в использовании двухбайтового формата адреса нет необходимости. Условное обозначение адреса в мнемонике команды - ad.
Примеры.
ADD A,ad; Запись команды ADD с прямой адресацией в общем виде.
ADD A,31 h; Сложить содержимое аккумулятора АСС с содержимым ячейки
; резидентной памяти с адресом 31п. Результат поместить в АСС.
MOV add,ads; Переслать содержимое ячейки памяти с адресом ads в ячейку
; памяти с адресом add. Например: MOV 10h,21 h.
Команды с косвенной адресацией имеют длину 1 байт. В этом байте расположен код операции. Адрес операнда находится в регистре Ro или R1 текущего банка, если обмен или операция производится с внутренним ОЗУ данных. Обратите внимание, в качестве источника адреса операнда могут использоваться только регистры Ro и R1 (общее обозначение Ri), но не могут использоваться регистры R2 - R7.
Примеры.
ADD A, @RO;Сложить содержимое аккумулятора АСС с содержимым ячейки памяти,
; адрес которой находится в регистре RO.
DEC @R1;Уменьшить на 1 содержимое ячейки памяти, адрес которой находится
; в регистре R1.
Косвенная адресация используется также для обращения к внешней памяти данных. Однако адрес ячейки внешней памяти должен быть двухбайтовым (см. рис. 4.3). Поэтому при использовании в качестве регистра-указателя RO или R1 старший байт адреса должен быть предварительно загружен в порт Р2. При обращении к внешней памяти данных в качестве регистра-указателя может быть также использован двухбайтовый регистр DPTR. Тогда предварительное формирование старшего байта адреса в Р2 не требуется..
Примеры.
MQVX A, @RO; Переслать в АСС содержимое ячейки внешней памяти данных,
; старший байт адреса которой находится в Р2, младший байт-
; врегистре RO текущего регистрового банка.
MOVXA,@DPTR; Переслать в АСС содержимое ячейки внешней памяти данных,
; старший и младший байты адреса которой находятся в двух-
; байтовом регистре DPTR.
Косвенная адресация используется также для чтения данных из памяти программ, в
том числе для выборки элемента с порядковым номером из таблицы.
Примеры.
MOVC A, ©A+DPTR; Переслать в АСС содержимое ячейки памяти программ, адрес
;которой вычисляется сложением двухбайтового значения
;регистра-указателя DPTR с однобайтовым беззнаковым
;операндом из аккумулятора. Эту же операцию можно,
;интерпретировать, как чтение элемента с номером i, который
;задан в аккумуляторе, из таблицы с начальным адресом, который
; хранится в DPTR.
MOVCA,@A+PC; Переслать в АСС содержимое ячейки из области памяти
; программ, адрес которой равен текущему значению счетчика
; команд PC плюс значение операнда в аккумуляторе.
Относительная адресация используется только в командах условных переходов, которые используются для организации ветвления программ. Команды условных переходов имеют двухбайтовый формат или трехбайтовый формат. В командах типа «перейти по флагу» первый байт содержит код операции, а второй - смещение адреса следующей команды относительно адреса текущей команды в целочисленном формате со знаком. Диапазон возможных кодов смещения: от -128 до +127. В командах типа «выполнить действие и перейти по его результату» первый байт содержит код операции, второй байт -операнд для выполнения действия, третий байт - смещение адреса.
Если условие, заданное типом используемой команды условного перехода, выполняется, то адрес следующей команды центральный процессор вычисляет путем сложения текущего адреса с кодом смещения. Если условие не выполняется, то МК переходит к выполнению следующей команды.
При написании программ нет необходимости вычислять абсолютные коды смещения
для команд условного перехода. Достаточно указать лишь метку, численное значение
кода смещения вычислит программа Ассемблер.
Примеры.
JZ rel; Перейти по метке rel, если значение аккумулятора АСС равно 0.
DJNZ ad,rel; Вычесть 1 из содержимого ячейки памяти с адресом ad и перейти
; по метке, если в ячейке не 0.