Команды пересылки данных
Эта группа представлена 28 командами, их краткое описание приведено в табл. 19, где также указаны тип команды (Т) в соответствии с таблицей, ее длина в байтах (Б) и время выполнения в машинных циклах (Ц). Основная команда группы MOV (Mov e – перемещение) осуществляет пересылку данных в пределах адресного пространства РПД и РСФ, с различными способами адресации, и команды MOVX (чтение/запись байта из внешней памяти данных) и MOVC (чтение байт из памяти программ). На рис.52 показаны варианты пересылки данных между различными сегментами адресного пространства МК51 с учетом всех способов адресации, которые отражены в табл. 19 [5].
Рис. 52 Граф перемещения данных в пределах адресного пространства МК51
Как видно, центральное место занимает аккумулятор А, на который замыкается большинство пересылок данных, хотя некоторые из пересылок осуществляются и без участия аккумулятора. Большинство пересылок двухсторонние, т.е. в поле операнда можно менять местами операнд приемник и операнд источник данных. Исключение составляют пересылка непосредственного операнда и чтение данных из памяти программ. Команда XCH (E xch ange - обмен) используется для обмена операндами между аккумулятором и ячейкой РПД с различными вариантами адресации, а команда XCHD – обмен младшими тетрадами (биты 0 – 3) с косвенной адресацией.
Таблица 19
Продолжение табл.19
Команды PUSH и РОР предназначены соответственно для записи данных в стек и их чтения из стека. Группа команд - пересылок микроконтроллера имеет следующую особенность - в ней нет специальных команд для работы со специальными регистрами: PSW, таймером, портами ввода-вывода. Доступ к ним, как и к другим регистрам специальных функций, осуществляется заданием соответствующего прямого адреса, т.е. это команды обычных пересылок, в которых вместо адреса можно ставить название соответствующего регистра. Например, чтение PSW в аккумулятор может быть выполнено командой MOV A, PSW, которая преобразуется ассемблером к виду MOV А, 0D0h (E5 D0),где Е5 – код операции, а D0 – операнд (адрес PSW). Кроме того, следует отметить, что в микроЭВМ аккумулятор имеет два различных имени в зависимости от способа адресации: А – при неявной адресации (например, MOV A, R0) и АСС – при использовании прямого адреса. Первый способ предпочтительнее, однако, не всегда применим. 4.2.4.2. Команды арифметических операций
В данную группу входят 24 команды, краткое описание которых приведено в табл. 20. Из нее следует, что микро-ЭВМ выполняет достаточно широкий набор команд для организации обработки целочисленных данных, включая команды умножения и деления. В таблице также указаны тип команды (Т) в соответствии с таблицей, ее длина в байтах (Б) и время выполнения в машинных циклах (Ц).
Таблица 20
Продолжение табл.20
Команда ADD (Add ition - добавление) выполняет сложение двух операндов (один из операндов находится в аккумуляторе, а второй адресуется разными способами) без учета бита переноса С в предыдущей операции, команда ADDC (Add ition with C arry) – с учетом бита переноса С. Команда SUBB (Sub straction with B orrow – вычитание c займом) осуществляет вычитание из операнда в аккумуляторе второго операнда с разными способами адресации, с учетом займа. Результат операций сложения и вычитания остается в аккумуляторе. Команда INC (Inc rement – увеличение на единицу) осуществляет операцию инкремента операнда, представленного различными вариантами адресации. Команда DEC (Dec rement – уменьшение на единицу) осуществляет операцию декремента операнда, представленного различными вариантами адресации. Операции INC и DEC применимы к аккумулятору, прямоадресуемому регистру, прямо- или косвенно адресуемой ячейке памяти. Кроме того, операция INC применима к содержимому 16- разрядного регистра указателя DPTR. Команда MUL (Mul tiply - умножение) осуществляет операцию умножения двух операндов, один из которых находится в аккумуляторе А, а второй - в регистре В. Результат перемножения представляет двухбайтовый операнд, старший байт которого находится в регистре В, младший – в регистре А: (B)(A) (A)×(В). Команда DIV (Div ide - деление) осуществляет операцию умножения двух операндов, один из которых находится в аккумуляторе А, а второй в регистре В. Результат перемножения представляет двухбайтовый операнд, старший байт которого находится в регистре А, младший – в регистре В: (B)(A) (A)/(В). Команда DA (D ecimal correction of the A ccumulator) – десятичная коррекция аккумулятора осуществляет десятичную коррекцию операнда в аккумуляторе, при преобразовании двоичных данных в двоично-десятичные.
4.2.4.3. Команды логических операций
В группе 25 команд, их краткое описание приведено в табл. 21. Данные команды позволяют выполнить операции над операндами: логическое И (/\), логическое ИЛИ (\/), исключающее ИЛИ ((+)), инверсию (NOT), сброс в нулевое значение и сдвиг. В таблице также указаны тип команды (Т) в соответствии с таблицей, ее длина в байтах (Б) и время выполнения в машинных циклах (Ц). Таблица 21
Продолжение табл.21
Команда ANL (AN D L ogic – логическое И) выполняет операцию логического умножения двух операндов, один из которых находится в аккумуляторе, второй представлен различными вариантами адресации. Команда ORL (OR L ogic – логическое ИЛИ) выполняет операцию логического сложения двух операндов, один из которых находится в аккумуляторе, второй представлен различными вариантами адресации. Команда XRL (Е x clusive O R L ogic – исключительное ИЛИ) выполняет операцию логического сложения по модулю два (исключающее ИЛИ) двух операндов, один из которых находится в аккумуляторе, второй представлен различными вариантами адресации. Операции ANL, ORL, XRL выполняются побитно, т.е.над двумя битами с одинаковыми индексами двух операндов, например: Результат этих операций остается в аккумуляторе либо по прямому адресу первого операнда. Команда RR (R otate to R ight - сдвиг вправо) - осуществляет сдвиг содержимого аккумулятора на один разряд вправо, при этом сдвигаемый младший бит D0 занимает место старшего бита D7 (рис.53, а). Команда RL (R otate to L eft - сдвиг влево) - осуществляет сдвиг содержимого аккумулятора на один разряд влево, при этом сдвигаемый старший бит D7 занимает место младшего бита D0 (рис.53, б). Рис.53. Сдвиг содержимого аккумулятора вправо (а) и влево (б)
Команда RRC (R otate to R ight through C arry – сдвиг вправо через перенос) - осуществляет сдвиг содержимого аккумулятора на один разряд вправо через перенос, при этом сдвигаемый младший бит D0 занимает место бита переноса СY, а бит переноса СY занимает место старшего бита D7 (рис.54, а). Команда RLC (R otate to L eft through C arry – сдвиг влево через перенос) - осуществляет сдвиг содержимого аккумулятора на один разряд влево через перенос, при этом сдвигаемый старший бит D7 занимает место бита переноса СY, а бит переноса СY занимает место младшего бита D0 (рис.54, б).
Рис.54. Сдвиг содержимого аккумулятора через перенос вправо (а) и влево (б)
Команда CLR (Cl ea r ing - очистка) – очистка аккумулятора (сброс битов аккумулятора в ноль). Команда CPL (C om pl ement - дополнение) - выполняет инверсию битов аккумулятора (дополнение к предыдущему значению). Команда SWAP (SWAP - обменивать) - меняет местами старшую и младшую тетрады байта в аккумуляторе, эта команда может интерпретироваться как циклический сдвиг байта на четыре разряда.
4.2.4.4. Команды операций над битами
Группа состоит из 12 команд, краткое описание которых приведено в табл. 22. Эти команды позволяют выполнять операции над отдельными битами: сброс, установку, инверсию бита, а также логические И (/\) и ИЛИ (\/). В таблице также указаны тип команды (Т) в соответствии с таблицей, ее длина в байтах (Б) и время выполнения в машинных циклах (Ц). Таблица 22
В качестве "логического" аккумулятора, участвующего во всех операциях с двумя операндами, выступает признак переноса С (разряд D7 PSW), в качестве операндов могут использоваться 128 бит из резидентной памяти данных и регистры специальных функций, допускающие прямую адресацию отдельных бит. Команда CLR (Cl ea r ing - очистка) – обнуляет значение бита. Команда CPL (C om pl ement - дополнение) – осуществляет инверсию значения бита (дополнение к предыдущему значению). Команда SETB (Set B it – установить бит) – осуществляет установку значения бита в состояние лог.1. Команда ANL (AN D L ogic – логическое И) выполняет операции логического умножения двух битов. Команда ORL (OR L ogic – логическое ИЛИ) выполняет операцию логического сложения двух битов. Команды ANL и ORL в качестве первого операнда используют битовый аккумулятор С, в качестве второго – прямоадресуемый бит. Команда MOV производит пересылку прямоадресуемого бита в битовый аккумулятор С и обратно.
4.2.4.5. Команды передачи управления
Группа представлена командами безусловного и условного переходов, командами вызова подпрограмм и командами возврата из подпрограмм (табл.23). В таблице указаны тип команды (Т) в соответствии с таблицей, ее длина в байтах (Б) и время выполнения в машинных циклах (Ц). Таблица 23
Продолжение табл.23
Команды безусловного перехода: LJMP ad16 (L ong J u mp - длинный переход) – длинный абсолютный переход по всему адресному пространству ПП. В трехбайтовой команде содержится полный 16-битный адрес перехода (ad16), позволяющий обращаться к любой ячейке памяти в пределах 64К. На практике редко возникает необходимость перехода в пределах всего адресного пространства и чаще используются укороченные команды перехода, занимающие меньше места в памяти. AJMP ad11 (A bsolute J u mp – абсолютный переход) – абсолютный переход в пределах одной страницы памяти программ размером 2048 байт. Такие команды содержат только 11 младших бит адреса перехода (ad11). Команды абсолютного перехода имеют формат 2 байта, при этом второй байт команды содержит 8 младших разрядов адреса (А7-А0), которые адресуют 256 байт памяти, а 3 старших разряда (А10-А8) находятся в первом байте вместе с кодом операции. Для изменения адреса перехода необходимо выбирать команду с другим кодом операции. Всего имеется 8 команд типа AJMP. При выполнении команды в вычисленном адресе следующей по порядку команды ((РС)= (PC) + 2) 11 младших бит заменяются на ad11 из тела команды абсолютного перехода. SJMP rel (S hort J u mp – короткий переход) - относительный переход позволяет передать управление в пределах -128 ÷ +127 байт относительно адреса следующей команды (команды, следующей по порядку за командой относительного перехода). Формирование адреса относительного перехода (rel) осуществляется путем сложения базового адреса с адресом в поле операнда команды. В качестве базового адреса используется содержимое программного счетчика, а адрес в поле операнда команды представляет собой восьмиразрядное смещение rel (rel ative - относительный). Число rel интерпретируется командой как целое со знаком, представленное в дополнительном коде. Диапазон его представления -128 ÷ +127. При определении числа rel следует учесть, что программный счетчик указывает на следующую, подлежащую выполнению, команду. Относительный переход широко используется в командах передачи управления, так как по сравнению с абсолютными переходами они придают программе важное качество перемещаемости. JMP @A + DPTR – косвенный переход по адресу, представляющим собой сумму содержимого аккумулятора A и регистра DPTR. Эта команда удобна тем, что предоставляет возможность организации перехода по адресу, вычисляемому самой программой и неизвестному при написании исходного текста программы. При этом в регистре DPTR находится постоянная часть адреса, в аккумуляторе – вычисляемая. Команды условного перехода имеют структуру J ump(условие) bit, rel или J umр(условие), rel и позволяют осуществлять переход при выполнении следующих условий (переход если): - JZ — аккумулятор содержит нулевое значение; - JNZ — аккумулятор содержит не нулевое значение - JC — бит переноса С установлен; - JNC — бит переноса С не установлен; - JB — прямоадресуемый бит равен 1 - JNB — прямоадресуемый бит равен 0; - JBC — прямоадресуемый бит равен 1 и сбрасывается в нулевое значение при выполнении команды. Все команды условного перехода содержат короткий относительный адрес, т. е. переход может осуществляться в пределах -128... +127 байт относительно следующей команды, аналогично команде SJMP. Команды вызова подпрограмм и возврата из них: LCALL ad16 – длинный вызов подпрограммы в пределах полного адресного пространства 64К. Трехбайтовая команда аналогичная команде LJMP. ACALL ad11 – двухбайтовая команда вызова подпрограммы в пределах адресного пространства 2К. Как и для команды AJMP, имеется 8 команд типа ACALL. RET – безадресная команда возврата из подпрограммы. RETI - безадресная команда возврата из подпрограммы обработки прерывания. Команды LCALL и ACALL в отличие от команд перехода (LJMP, AJMP) сохраняют в стеке адрес возврата в основную программу. Когда микроконтроллер принимает запрос на прерывание, он автоматически генерирует команду LCALL ad16, что автоматически обеспечивает запоминание адреса возврата в стеке. Команды RET и RETI извлекают адрес возврата из стека и помещают его в счетчик команд РС. Кроме того, команда RETI разрешает прерывания обслуженного уровня. Команды организации программных циклов: DJNZ (D ecrement J ump N ot Z ero – декремент и переход, если не ноль) – команда для организации программных циклов. Осуществляет декремент операнда, проверку результата на нулевое значение и переход, если результат не равен нулю. Операнд может быть представлен регистровым или прямым адресом. Переход осуществляется по относительному адресу (rel). Во многих случаях используется для организации программных задержек, например: MOV R1,#N M0: NOP NOP DJNZ R1,M0; Выход из цикла, если R1=0. Время программной задержки будет определяться суммой времени выполнения всех команд, находящихся между меткой М0 и командой DJNZ (в данном случае 4 мкс), умноженной на число N, предварительно записанное в регистр R1. CJNE (C ompare J ump N ot E qually – сравнение и переход, если на равно) – команда сравнения двух операндов, с последующим переходом по относительному адресу (rel), если результат сравнения не равен нулю. Первый операнд может быть представлен неявной, регистровой, косвенной регистровой адресацией. Второй операнд может быть непосредственным, либо с прямым адресом. Команда CJNE эффективно используется в процедурах ожидания какого-либо события. Например: WAIT: CJNE A,P0,WAIT будет выполняться до тех пор, пока на линиях порта Р0 не установится информация, совпадающая с содержимым аккумулятора А. NOP (N ot Op eration – нет операции) – холостая команда, не выполняющая никаких действий, но занимающую во времени один машинный цикл (при fCLK=12 мГц время выполнения команды 1мкс). Все команды данной группы, за исключением CJNE и JBC, не оказывают воздействия на флаги. Команда CJNE устанавливает флаг C, если первый операнд оказывается меньше второго. Команда JBC сбрасывает флаг C в случае перехода.
|