Система команд ОМЭВМ предоставляет большие возможности обработки данных, обеспечивает реализацию логических, арифметических операций, а также управление в режиме реалиного времени. Реализована побитовая, потетрадная (4 бита), побайтовая (8 бит) и 16-разрядная обработка данных.
БИС семейства MCS-51 - 8-разрядная ОМЭВМ: ПЗУ, ОЗУ, регистры специального назначения, АЛУ и внешние шины имеют байтовую организацию. Двухбайтовые данные используются только регистром-указателем (DPTR) и счетчиком команд (РС). Следует отметить, что регистр-указатель данных может быть использован как двухбайтовый регистр DPTR или как два однобайтовых регистра специального назначения DPH и DPL. Счетчик команд всегда используется как двухбайтовый регистр.
Набор команд ОМЭВМ имеет 42 мнемонических обозначения команд для конкретизации 33 функций этой системы.
Синтаксис большинства команд ассемблерного языка состоит из мнемонического обозначения функции, всед за которым идут операнды, указывающие методы адресации и типы данных. Различные типы данных или режимы адресации определяются установленными операндами, а не изменениями мнемонических обозначений.
Систему команд условно можно разбить на пять групп:
Арифметические команды;
Логические команды;
Команды передачи данных;
Команды битового процессора;
Команды ветвления и передачи управления.
Существуют следующие типы адресации операндов-источников:
Регистровая адресация
Прямая адресация
Косвенно-регистровая адресация
Непосредственная адресация
Косвенно-регистровая адресация по сумме базового и индексного регистров
Арифметические команды
В наборе команд имеются следующие арифметические операции: сложение, сложение с учетом флага переноса, вычитание с заемом, инкременирование, декременирование, сравнение, десятичная коррекция, умножение и деление.
В АЛУ производятся действия над целыми числами без знака. В двухоперандных операциях: сложение (ADD), сложение с переносом (ADDC) и вычитание с заемом (SUBB) аккумулятор является первым операндом и принимает результат операции. Вторым операндом может быть рабочий регистр выбранного банка рабочих регистров, регистр внутренней памяти данных с косвенно-регистровой и прямой адресацией или байт непосредственных данных. Указанные операции влияют на флаги: пеполнения, переноса, промежуточного переноса и флаг четности в слове состояния процессора (PSW).
Использование разряда переноса позволяет многократно повысить точность при операциях сложения (ADDC) и вычитания (SUBB).
Выполнение операций сложения и вычитания с учетом знака может быть осуществлено с помощью программного управления флагом переполнения (OV) регистра PSW. Флаг промежуточного переноса (АС) обеспечивает выполнение арифметических операций в двоично-десятичном коде.
Операции инкременирования и декременирования на флаги не влияют.
Операции сравнения не влияют ни на операнд назначения, ни на операнд источника, но они влияют на флаги переноса.
Существуют три арифметические операции, которые выполняются только на аккумуляторе: две команды проверки содержимого аккумулятора А (JZ, JNZ), и команда десятичной коррекции при сложении двоично-десятичных кодов.
При операции умножения содержимое аккумулятора А умножается на содержимое регистра В и результат размещается следующим образом: младший байт в регистре В, старший - в регистре А.
В случае выполнения операции деления целое от деления помещается в аккумулятор А, остаток от деления - в регистр В.
Логические команды с байтовыми переменными
Система команд позволяет реализовать логические операции: "И", "ИЛИ", "ИСКЛЮЧАЮЩЕЕ ИЛИ" на регистре-аккумуляторе (А) и байте-источнике. Вторым операндом (байтом-источником) при этом может быть рабочий регистр в выбранном банке рабочих регистров; регистр внутреннего ОЗУ, адресуемый с помощью косвенно-регистровой адресации; прямоадресуемые ячейки внутреннего ОЗУ и регистры специального назначения; непосредственная величина.
Указанные логические операции могут быть реализованы на любом прямоадресуемом регистре внутреннего ОЗУ или регистре специального назначения с использованием в качестве второго операнда содержимого аккумлятора А или непосредственных данных.
Существуют логические операции, которые выполняются только на аккумуляторе: сброс и инвертирование всех восьми разрядов А; циклический сдвиг влево и впрво; циклический сдвиг влево и вправо с учетом флага переноса; обмен местами старшей и младшей тетрад (ниблов) внутри аккумулятора.
Команды передачи данных
Таблицы символов (кодов), зашитые в ПЗУ программы могут быть выбраны с помощью команд передачи данных с использованием косвенной адресации. Байт константы может быть передан в аккумулятор из ячейки памяти программ, адресуемой суммой базового регистра (PC или DPTR) и индексного регистра (содержимого А). Это обеспечивает, например, удобное средство реализации алгоритма преобразования кода ASCII в семисегментный код.
Любая ячейка 256-байтового блока внешнего ОЗУ данных может быть выбрана с использованием косвенно-регистровой адресации через регистры указатели R0 или R1 (выбранного банка рабочих регистров).
Ячейка внутри адресного пространства 64 Кбайт внешнего ОЗУ также может быть выбрана с использованием косвенно-регистровой адресации через регистр-указатель данных DPTR.
Команды передачи между прямоадресуемыми регистрами позволяют заносить величину из порта в ячейку внутреннего ОЗУ без использования рабочих регистров или аккумулятора.
В логическом процессоре любой прямоадресуемый бит может быть помещен в бит переноса и наоборот.
Содержимое аккумулятора может быть обменено с содержимым рабочих регистров (выбранного банка) и с содержимым адресуемых с помощью косвенно-регистровой адресации ячеек внутреннего ОЗУ, а также с содержимым прямо-адресуемых ячеек внутреннего ОЗУ и с содержимым регистров специального назначения.
Младший нибл (разряды 3-0) содержимого аккумулятора, может быть обменен с младшим ниблом содержимого ячеек внутреннего ОЗУ, выбираемых с помощью косвенно-регистровой адресации.
Команды битового процессора
Битовый процессор является частью архитектуры МК семейства MCS51 и его можно рассматривать как независимый процессор побитовой обработки. Битовый процессор выполняет набор команд, имеет свое побитово-адресуемое ОЗУ и свой ввод-вывод.
Команды, оперирующие с битами, обеспечивают прямую адресацию 128 битов (0-127) в шестнадцати ячейках внутреннего ОЗУ (ячейки с адресами 20Н-2FH) и прямую побитовую адресацию регистров специального назначения, адреса которых кратны восьми.
Каждый из отдельно адресуемых битов может быть установлен в "1", сброшен в "0", инвертирован, проверен. Могут быть реализованы переходы: если бит установлен; если бит не установлен; переход, если бит установлен, со сбросом этого бита; бит может быть перезаписан в (из) разряда переноса. Между любым прямоадресуемым битом и флагом переноса могут быть произведены логические операции "И", "ИЛИ", где результат заносится в разряд флага переноса. Команды побитовой обработки обеспечивают реализацию сложных функций комбинаторной логики и оптимизацию программ пользователя.
Команды ветвления и передачи управления
Адресное пространство памяти программ не имеет страничной организации, что позволяет свободно перемщать фрагменты программы внутри адресного пространства, при этом не требуется перезасылка (изменение) номера страницы.
Перемещение отдельных фрагментов программы обеспечивает возможность использования перемещаемых программных модулей различными программами.
Команды 16-разрядных переходов и вызовов подпрограмм позволяют осуществлять переход в любую точку адресного пространства памяти программ объемом 64 Кбайт.
Команды 11-разрядных переходов и вызовов подпрограмм обеспечивают переходы внутри программного модуля емкостью 2 Кбайт. В системе команд имеются команды условных и безусловных переходов относительно начального адреса слеующей программы в пределах от (РС)-128 до (ЗС)+127. Команды проверки отдельных разрядов позволяют осуществлять условные переходы по состоянию "0" или "1" прямоадресуемых битов. Команды проверки содержимого аккумулятора (на ноль/не ноль) позволяют осуществлять условные переходы по содержимому А.
Косвенно-регистровые переходы в системе команд обеспечивают ветвление относительно базового регистра (содержимого DPTR или РС) со смещением, находящимся в аккумуляторе А.
Регистровая адресация
Регистровая адресация используется для обращения к восьми рабочим регистрам выбранного банка рабочих регистров (эти же регистры могут быть выбраны с помощью прямой адресации и косвенно-регистровой адресации как обычные ячейки внутреннего ОЗУ данных).
Регистровая адресация используется для обращения к регистрам А, В, АВ (сдвоенному регистру), DPTR и к флагу переноса С. Использование регистровой адресации позволяет получать двухбайтовый эквивалент трехбайтовых команд прямой адресации.
Прямая адресация
Прямая байтовая адресация используется для обращения к ячейкам внутренней памяти (ОЗУ) данных (0-127) и к регистрам специального назначения.
Прямая побитовая адресация используется для обращения к отдельно адресуемым 128 битам, расположенным в ячейках с адресами 20H-2FH и к отдельно адресуемым битам регистров специального назначения.
Старший бит байта кода прямого адрема выбирает одну из двух групп отдельно адремуемых битов, расположенных в ОЗУ или регистрах специального назначения. Прямо адресуемые биты с адресами 0-127 (00H-7FH) расположены в блоке из 16 ячеек внутреннего ОЗУ, имеющих адреса 20H-2FH. Указанные ячейки последовательно пронумерованы от младшего бита младшего байта до старшего бита старшего байта. Отдельно адресуемые биты в регистрах специального назначения пронумерованы следующим образом: пять старших разрядов адреса совпадают с пятью старшими разрядами адреса самого регистра, а три младших - определяют местоположение отдельного ибта внутри регистра.
Косвенно-регистровая адресация
Косвенно-регистровая адресация используется для обращения к ячейкам внутренннего ОЗУ данных. В качестве регистров-указателей используется регистры R10, R1 выбранного банка регистров.
В командах PUSH и POP используется содержимое указателя стека (SP).
Косвенно-регистровая адресация используется также для обращения к внешней памяти данных. В этом случае с помощью регистров-указателей R0 и R1 (выбранного банка рабочих регистров) выбирается ячейка из блока в 256 байт внешней памяти данных. Номер блока предварительно задается содержимым порта Р2.
16-разрядный указатель данных (DPTR) может быть использован для обращения к любой ячейке адресного пространства внешней памяти данных объемом до 64 Кбайт.
Непосредственная адресация
Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде.
Косвенно-регистровая адресация по сумме базового и индексного регистров
Косвенно-регистровая адресация по сумме: базовый регистр плюс индексный регистр (содержимое аккумулятора А) упрощает просмотр таблиц, зашитых в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или РС и содержимого А.
Таблица обозначений и символов, используемых в системе команд
Обозначение, символ
Назначение
А
Аккумулятор
Rn
Регистры текущего выбранного банка регистров
r
Номер загружаемого регистра, указанног
в команде
direct
Прямо адресуемый 8-битовый внутренний адрес ячейка данных, который может быть ячейкой внутреннего ОЗУ данных (0-127) или SFR (128-255)
@Rr
Косвенно адресуемая 8-битовая ячейка внутреннего ОЗУ данных
data8
8-битовое непосредственное да
ное,
ходящее в КОП
dataH
Старшие биты (15-8) непосредственных 16-битовых данных
dataL
Младшие биты (7-0) непосредственных 16-битовых данных
addr11
11-битовый адрес назначения
addrL
Младшие биты адреса назначения
disp8
8-битовый байт смещения со знак
м
bit
Бит с прямой адресацией, адрес которого содержит КОП, находящийся во внутреннем ОЗУ данных или SFR
Мнемонические обозначения функций однозначно связаны с конкретными комбинациями способов адресации и типами данных. Всего в системе команд возможно 111 таких сочетаний. В таблице приведен перечень команд, упорядоченных по алфавиту.
Мнемоника
Функция
Флаги
Команда ACALL <addr 11>
Абсолютный вызов подпрограммы
Команда ADD A, <байт-источник>
Сложение
AC, C, OV
Команда ADDC A, <байт-источник>
Сложение с переносом
AC, C, OV
Команда AJMP <addr 11>
Абсолютный переход
Команда ANL <байт-назначения>, <байт-источникa>
Логическое "И"
Команда ANL C, <байт-источникa>
Логическое "И" для переменных-битов
Команда CJNE <байт-назначения>, <байт-источник>, <смещение>
Сравнение и переход, если не равно
C
Команда CLR A
Сброс аккумулятора
Команда CLR <bit>
Сброс бита
C, bit
Команда CPL A
Инверсия ак
умуля
ора
Команда CPL <bit>
Инверсия бита
C, bit
Команда DA A
Десятичная коррекция аккумулятора для
ложения
AC, C
Команда DEC <байт>
Декремент
Команда DIV AB
Деление
C, OV
Команда DJNZ <байт>, <смещение>
Декремент и переход, если не равно нулю
Команда INC <байт>
Инкремент
Команда INC DPTR
Инкремент указателя данных
Команда JB <bit>, <re18>
Переход, если бит установлен
Команда JBC <bit>, <re18>
Переход, если бит установлен и сброс этого бита
Команда JC <re18>
Переход, если перенос установлен
Команда JMP @A+DPTR
Косвенный переход
Команда JNB <bit>, <re18>
Переход, если бит не установлен
Команда JNC <re18>
Переход, если перенос не установлен
Команда JNZ <re18>
Переход, если содержимое аккумулятора не равно нулю
Команда JZ <re18>
Переход, если содержимое аккумулятора равно 0
Команда LCALL <addr16>
Длинный вызов
Команда LJMP <addr16>
Длинный переход
Команда MOV <байт-назначения>, <байт-источника>
Переслать переменную-байт
Команда MOV <бит-назначения>, <бит-источника>
Переслать бит данных
C
Команда MOV DPTR,#data16
Загрузить указатель данных 16-битовой константой
Команда MOVC A,@A+(<R16>)
Переслать байт из памяти программ
Команда MOVX <байт приемника>, <байт источника>
Переслать во внешнюю память (из внешней памяти) данных
Команда MUL AB
Умножение
C, OV
Команда NOP
Нет операции
PC
Команда ORL <байт-назначения>, <байт-источникa>
Логическое "ИЛИ" для перемнных-байтов
Команда ORL C, <бит источникa>
Логическое "ИЛИ" для переменных-битов
C
Команда POP <direct>
Чтение из стека
Команда PUSH <direct>
Запись в стек
Команда RET
Возврат из подпрограммы
Команда RETI
Возврат из прерывания
Команда RL A
Сдвиг содержимого аккумулятора влево
Команда RLC A
Сдвиг содержимого аккумулятора влево через флаг переноса
Команда RR A
Сдвиг содержимого аккумулятора вправо
Команда RRC A
Сдвиг содержимого аккумулятора вправо через флаг переноса
C
Команда SETB <bit>
Установить бит
C
Команда SJMP <метка>
Короткий переход
Команда SUBB A, <байт источника>
Вычитание с заемом
AC, C, OV
Команда SWAP A
Обмен тетрадами внутри аккумулятора
Команда XCH A, <байт>
Обмен содержимого аккумулятора с переменной-байтом
Команда XCHD A,@R1
Обмен
тетрадой
Команда XRL <байт-назначения>, <байт-источникa>
Логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ" для перемнных-байтов
Команда ACALL <addr 11>
Команда "абсолютный вызов подпрограммы" вызывает безусловно подпрограмму, размещенную по указанному адресу. При этом счетчик команд увеличивается на 2 для получения адреса следующей команды, после чего полученное 16-битовое значение РС помещается в стек (сначала следует младший байт), и содержимое указателя стека также увеличивается на два. Адрес перехода получается с помощью конкатенации старших бит увеличенного содержимого счетчика команд, битов старшего байта команды и младшего байта команды.
;ДО ВЫПОЛНЕНИЯ КОМАНДЫ ACALL
;(SP)=07H
;метка МТ1 соответствует адресу: 0345Н,
;т.е. (РС)=0345Н
ACALL MT1 ;расположена по адресу 028DH, т.е.
;(ЗС)=028DH
;ПОСЛЕ ВЫПОЛНЕНИЯ КОМАНДЫ
;(SP)=09H, (PC)=0345H,
;ОЗУ [08]=8FH, ОЗУ [09]=0
H.
Команда ADD A, <байт-источник>
Эта команда ("сложение") складывает содержимое аккумулятора Ф с содержимым байта-источника, оставляя результат в аккумуляторе. При появлении переносов из разрядов 7 и 3, устанавливаются флаги переноса (С) и дополнительного переноса (АС) соответственно, в противном случае эти флаги сбрасываются. При сложении целых чисел без знака флаг переноса "С" указывает на появление переполнения. Флаг переполнения (OV) устанавливается, если есть перенос из бита 6 и нет переноса из бита 7, или есть перенос из бита 7 и нет - из бита 6, в противном случае флаг OV сбрасывается. При сложении целых чисел со знаком лаг OV указывает на отрицательную величину, полученную при суммировании операндов или на положительную сумму для двух отрицательных операндов.
Для команды сложения разрешены следующие режимы адресации байта-источника:
регистровый
косвенно-регистровый
прямой
непосредственный
Рассмотрим их.
Ассемблер:
ADD A,Rn ; где n=0-7
Код:
0 0 1 0 1 rrr
, где rrr=000-111
Время:
1 цикл
Алгоритм:
(A) : = (A) + (Rn), где n=0-7 C : = X, OV : =X, AC : =X, где Х=(0 или 1)
Эта команда ("сложение с переносом") одновременно складывает содержимое байта-источника, флаг переноса и содержимое аккумулятора А, оставляя результат в аккумуляторе. При этом флаги переноса и дополнительного переноса устанавливаются, если есть перенос из бита 7 или бита 3, и сбрасываются в противном случае. При сложении целых чисел без знака флаг переноса указывает на переполнение. Флаг переполнения (OV) устанавливается, если имеется перенос бита 6 и нет переноса из бита 7 или есть перенос из бита 7 и нет - из бита 6, в противном случае OV сбрасывается. При сложении целых чисел со знаком OV указывает на отрицательную величину, полученную при суммировании двух положительных операндов или на положительную сумму от двух отрицательных операндов.
Для этой команды разрешены следующие режимы адресации байта-источника:
Команда "абсолютный переход", передает управление по указанному адресу, который получается при кокатенации пяти старших бит счетчика команд РС (после увеличения его на два), 7-5 битов кода операции и второго байта команлы. Адрес перехода должен находиться внутри одной страницы объемом 2 Кбайт памяти программы, определяемой пятью старшими битами счетчика команд.
;(PC)=028FH
;Метке МТ2 соответствует адрес 034AH
AJMP MT2 ;(PC)=034AH
Команда ANL <байт-назначения>, <байт-источникa>
Команда "логическое "И" для переменных-байтов" выполняет операцию логического "И" над битами указанных перемнных и помещает результат в байт-назначения. Эта операция не влияет на состояние флагов.
Для операнда обеспечивают следующие комбинации шести режимов адресации:
Команда ANL C, <байт-источникa>
Команда "логическое "И" для переменных-битов", выполняет операцию логического "И" над указанными битами. Если бит-источник равен "0", то происходит сброс флага переноса, в противном случае флаг переноса не изменяет текущего значения. "/" перед операндом в языке ассемблера указывает на то, что в качестве значения используется логическое отрицание адресуемого бита, однако сам бит источника при этом не изменяется. На другие флаги эта команда не влияет.
Для операнда-источника разрешена только прямая адресация к битам.
Ассемблер:
ANL C, <bit>
Код:
1 0 0 0 0 0 1 0
bit address
Время:
2 циклa
Алгоритм:
(C) : = (C) AND (bit)
Пример:
;(C)=1, P1[0]=0
ANL C,P1.0 ;(C)=0, P1[0]=0
Ассемблер:
ANL C,</bit>
Код:
1 0 1 1 0 0 0 0
bit address
Время:
2 циклa
Алгоритм:
(C) : =(C) AND (/bit)
Пример:
;(C)=1, (AC)=O
ANL C,/AC ;(C)=1, (AC)=0
Команда CJNE <байт-назначения>, <байт-источник>, <смещение>
Команда "сравнение и переход, если не равно" сравнивает значения первых двх операндов и выполняет ветвление, если операнды не равны. Адрес перехода (ветвления) вычисляетчя при помощи сложения значения (со знаком), указанного в последнем байте команды, с содержимым счетчика команд после увеличения его на три.
Флаг переноса "С" устанавливается в "1", если значение целого без знака <байта назначения> меньше, чем значение целого без знака <байта источника>, в противном случае перенос сбрасывается (если значения операндов равны, флаг переноса сбрасывается). Эта команда не оказывает влияния на операнды.
Операнды, стоящие в команде, обеспечивают комбинации четырех режимов адресации:
если байтом-назначения является аккумулятор:
прямой
непосредственный
если байтом-назначения является любая ячейка ОЗУ с косвенно-регистровой или регистровой адресацией:
непосредственный к регистровому
непосредственный к косвенно-регистровому
Рассмотрим их.
Ассемблер:
CJNE A, <direct>, <метка>
Код:
1 0 1 1 0 1 0 1
direct address
rel8
Время:
2 цикл
Алгоритм:
(PC) : =(PC)+3 если (direct) < (A) то (PC) :=(PC)+<rel8>, C:=0 если (direct) > (A) то (PC) :=(PC)+<rel8>, C:=1
Пример:
;(A)=97H, (P2)=F0H, (C)=0
CJNE A,P2,MT3
...
MT3: CLR A ;(A)=97H, (P2)=F0H, (C)=1
;Адрес, соответствющий метке
;МТ3 вычисляется, как
;(PC):=(PC)+3+(rel8)
Ассемблер:
CJNE A, #data, <метка>
Код:
1 0 1 1 0 1 0 0
#data8
rel8
Время:
2 циклa
Алгоритм:
(PC) :=(PC)+3, если #data< (A), то (PC)+<rel8>, C:=0 если #data8>(A), то (PC) :=(PC)+<rel8>, C:=1