Группа команд логических операций
Данную группу образуют 25 команд (табл. 3.4), реализующих те же логические операции над байтами, что и в МК48. Однако в МК51 значительно расширено число типов операндов, участвующих в операциях.
Таблица 3.4. Группа команд логических операций
Название команды | Мнемокод | КОП | Т | Б | Ц | Операция |
Логическое И аккумулятора и регистра | ANL A, Rn | 01011rrr | (A) = (A) /\ (Rn) | |||
Логическое И аккумулятора и прямоадресуемого байта | ANL A, ad | (A) = (A) /\ (ad) | ||||
Логическое И аккумулятора и байта из РПД | ANL A, @Ri | 0101011i | (A) = (A) /\ ((Ri)) | |||
Логическое И аккумулятора и константы | ANL A, #d | (A) = (A) /\ #d | ||||
Логическое И прямоадресуемого байта и аккумулятора | ANL ad, A | (ad) = (ad) /\ (A) | ||||
Логическое И прямоадресуемого байта и константы | ANL ad, #d | (ad) = (ad) /\ #d | ||||
Логическое ИЛИ аккумулятора и регистра | ORL A, Rn | 01001rrr | (A) = (A) \/ (Rn) | |||
Логическое ИЛИ аккумулятора и прямоадресуемого байта | ORL A, ad | (A) = (A) \/ (ad) | ||||
Логическое ИЛИ аккумулятора и байта из РПД | ORL A, @Ri | 0100011i | (A) = (A) \/ ((Ri)) | |||
Логическое ИЛИ аккумулятора и константы | ORL A, #d | (A) = (A) \/ #d | ||||
Логическое ИЛИ прямоадресуемого байта и аккумулятора | ORL ad, A | (ad) = (ad) \/ (A) | ||||
Логическое ИЛИ прямоадресуемого байта и константы | ORL ad, #d | (ad) = (ad) \/ #d | ||||
Исключающее ИЛИ аккумулятора и регистра | XRL A, Rn | 01101rrr | (A) = (A) | |||
Исключающее ИЛИ аккумулятора и прямоадресуемого байта | XRL A, ad | (A) = (A) | ||||
Исключающее ИЛИ аккумулятора и байта из РПД | XRL A, @Ri | 0110011i | (A) = (A) | |||
Исключающее ИЛИ аккумулятора и константы | XRL A, #d | (A) = (A) | ||||
Исключающее ИЛИ прямоадресуемого байта и аккумулятора | XRL ad, A | (ad) = (ad) | ||||
Исключающее ИЛИ прямоадресуемого байта и константы | XRL ad, #d | (ad) = (ad) | ||||
Сброс аккумулятора | CLR A | (A) = 0 | ||||
Инверсия аккумулятора | CPL A | (A) = ( мA) | ||||
Сдвиг аккумулятора влево циклически | RL A | (An+1) = (An), n = 0 ? 6, (A0) = (A7) | ||||
Сдвиг аккумулятора влево через перенос | RLC A | (An+1) = (An), n = 0 ? 6, (A0) = (C), (C) = (A7) | ||||
Сдвиг аккумулятора вправо циклически | RR A | (A n) = (A n+1), n = 0 ? 6, (A7) = (A0) | ||||
Сдвиг аккумулятора вправо через перенос | RRC A | (A n) = (A n+1), n = 0 ? 6, (A7) = (C), (C) = (A0) | ||||
Обмен местами тетрад в аккумуляторе | SWAP A | (A0-3) <-> (A4-7) |
Группа команд операций с битами
Отличительной особенностью данной группы команд (табл. 3.5) является то, что они оперируют с однобитными операндами. В качестве таких операндов могут выступать отдельные биты некоторых регистров специальных функций (РСФ) и портов, а также 128 программных флагов пользователя.
Таблица 3.5. Группа команд операции с битами
Название команды | Мнемокод | КОП | Т | Б | Ц | Операция |
Сброс переноса | CLR C | (C) = 0 | ||||
Сброс бита | CLR bit | (b) = 0 | ||||
Установка переноса | SETB C | (C) = 1 | ||||
Установка бита | SETB bit | (b) = 1 | ||||
Инверсия переноса | CPL C | (C) = ( мC) | ||||
Инверсия бита | CPL bit | (b) = ( мb) | ||||
Логическое И бита и переноса | ANL C, bit | (C) = (C) /\ (b) | ||||
Логическое И инверсии бита и переноса | ANL C, /bit | (C) = (C) /\ ( мb) | ||||
Логическое ИЛИ бита и переноса | ORL C, bit | (C) = (C) \/ (b) | ||||
Логическое ИЛИ инверсии бита и переноса | ORL C, /bit | (C) = (C) \/ (мb) | ||||
Пересылка бита в перенос | MOV C, bit | (C) = (b) | ||||
Пересылка переноса в бит | MOV bit, C | (b) = (C) |
Существуют команды сброса (CLR), установки (SETB) и инверсии (CPL) бит, а также конъюнкции и дизъюнкции бита и флага переноса. Для адресации бит используется прямой восьмиразрядный адрес (bit). Косвенная адресация бит невозможна.
Группа команд передачи управления
К данной группе команд (табл. 3.6) относятся команды, обеспечивающие условное и безусловное ветвление, вызов подпрограмм и возврат из них, а также команда пустой операции NOP. В большинстве команд используется прямая адресация, т.е. адрес перехода целиком (или его часть) содержится в самой команде передачи управления. Можно выделить три разновидности команд ветвления по разрядности указываемого адреса перехода.
Таблица 3.6. Группа команд передачи управления
Название команды | Мнемокод | КОП | Т | Б | Ц | Операция |
Длинный переход в полном объеме памяти в программ | LJMP ad16 | (PC) = ad16 | ||||
Абсолютный переход внутри страницы в 2 Кбайта | AJMP ad11 | a10a9a800001 | (PC) = (PC) + 2 (PC0-10) = ad11 | |||
Короткий относительный переход внутри страницы в 256 байт | SJMP rel | (PC) = (PC) + 2 (PC) = (PC) + rel | ||||
Косвенный относительный переход | JMP @A+DPTR | (PC) = (A) + (DPTR) | ||||
Переход, если аккумулятор равен нулю | JZ rel | (PC) = (PC) + 2, если (A) = 0, то (PC) = (PC) + rel | ||||
Переход, если аккумулятор не равен нулю | JNZ rel | (PC) = (PC) + 2, если (A) ? 0, то (PC) = (PC) + rel | ||||
Переход, если перенос равен единице | JC rel | (PC) = (PC) + 2, если (C) = 1, то (PC) = (PC) + rel | ||||
Переход, если перенос равен нулю | JNC rel | (PC) = (PC) + 2, если (C) = 0, то (PC) = (PC) + rel | ||||
Переход, если бит равен единице | JB bit, rel | (PC) = (PC) + 3, если (b) = 1, то (PC) = (PC) + rel | ||||
Переход, если бит равен нулю | JNB bit, rel | (PC) = (PC) + 3, если (b) = 0, то (PC) = (PC) + rel | ||||
Переход, если бит установлен, с последующим сбросом бита | JBC bit, rel | (PC) = (PC) + 3, если (b) = 1, то (b) = 0 и (PC) = (PC) + rel | ||||
Декремент регистра и переход, если не нуль | DJNZ Rn, rel | 11011rrr | (PC) = (PC) + 2, (Rn) = (Rn) -1, если (Rn) ? 0, то (PC) = (PC) + rel | |||
Декремент прямоадресуемого байта и переход, если не нуль | DJNZ ad, rel | (PC) = (PC) + 2, (ad) = (ad) -1, если (ad) ? 0, то (PC) = (PC) + rel | ||||
Сравнение аккумулятора с прямоадресуемым байтом и переход, если не равно | CJNE A, ad, rel | (PC) = (PC) + 3, если (A) ? (ad), то (PC) = (PC) + rel, если (A) < (ad), то (C) = 1, иначе (C) = 0 | ||||
Сравнение аккумулятора с константой и переход, если не равно | CJNE A, #d, rel | (PC) = (PC) + 3, если (A) ? #d, то (PC) = (PC) + rel, если (A) < #d, то (C) = 1, иначе (C) = 0 | ||||
Сравнение регистра с константой и переход, если не равно | CJNE Rn, #d, rel | 10111rrr | (PC) = (PC) + 3, если (Rn) ? #d, то (PC) = (PC) + rel, если (Rn) < #d, то (C) = 1, иначе (C) = 0 | |||
Сравнение байта в РПД с константой и переход, если не равно | CJNE @Ri, #d, rel | 1011011i | (PC) = (PC) + 3, если ((Ri)) ? #d, то (PC) = (PC) + rel, если ((Ri)) < #d, то (C) = 1, иначе (C) = 0 | |||
Длинный вызов подпрограммы | LCALL ad16 | (PC) = (PC) + 3, (SP) = (SP) + 1, ((SP)) = (PC0-7), (SP) = (SP) + 1, ((SP)) = (PC8-15), (PC) = ad16 | ||||
Абсолютный вызов подпрограммы в пределах страницы в 2 Кбайта | ACALL ad11 | a10a9a810001 | (PC) = (PC) + 2, (SP) = (SP) + 1, ((SP)) = (PC0-7), (SP) = (SP) + 1, ((SP)) = (PC8-15), (PC0-10) = ad11 | |||
Возврат из подпрограммы | RET | (PC8-15) = ((SP)), (SP) = (SP) - 1, (PC0-7) = ((SP)), (SP) = (SP) - 1 | ||||
Возврат из подпрограммы обработки прерывания | RETI | (PC8-15) = ((SP)), (SP) = (SP) - 1, (PC0-7) = ((SP)), (SP) = (SP) - 1 | ||||
Холостая команда | NOP | (PC) = (PC) + 1 | ||||
Примечание. Ассемблер допускает использование обобщенного имени команд JMP и CALL, которые в процессе трансляции заменяются оптимальными по формату командами вызова (ACALL, LCALL) или перехода (AJMP, SJMP, LJMP). |
Длинный переход. Переход по всему адресному пространству ПП. В команде содержится полный 16-битный адрес перехода (ad 16). Трех байтные команды длинного перехода содержат в мнемокоде букву L (Long). Всего существует две такие команды: LJMP - длинный переход и LCALL - длинный вызов подпрограммы. На практике редко возникает необходимость перехода в пределах всего адресного пространства и чаще используются укороченные команды перехода, занимающее меньше места в памяти.
Абсолютный переход. Переход в пределах одной страницы памяти программ размером 2048 байт. Такие команды содержат только 11 младших бит адреса перехода (ad 11). Команды абсолютного перехода имеют формат 2 байта. Начальная буква мнемокода - A (Absolute). При выполнении команды в вычисленном адресе следующей по порядку команды ((РС)= (PC) + 2) 11 младших бит заменяются на ad11 из тела команды абсолютного перехода.
Относительный переход. Короткий относительный переход позволяет передать управление в пределах -128 - +127 байт относительно адреса следующей команды (команды, следующей по порядку за командой относительного перехода). Существует одна команда безусловного короткого перехода SJMP (Short). Все команды условного перехода используют данный метод адресации. Относительный адрес перехода (rel) содержится во втором байте команды.
Косвенный переход. Команда JMP @A + DPTR позволяет передавать управление по косвенному адресу. Эта команда удобна тем, что предоставляет возможность организации перехода по адресу, вычисляемому самой программой и неизвестному при написании исходного текста программы.
Условные переходы. Развитая система условных переходов предоставляет возможность осуществлять ветвление по следующим условиям: аккумулятор содержит нуль (JZ); содержимое аккумулятора не равно нулю (JNZ); перенос равен единице (JC); перенос равен нулю (JNC); адресуемый бит равен единице (JB); адресуемый бит равен нулю (JNB).
Для организации программных циклов удобно пользоваться командой DJNZ, которая работает аналогично соответствующей команде МК48. Однако в качестве счетчика циклов в МК51 может использоваться не только регистр, но и прямоадресуемый байт (например, ячейка РПД).
Команда CJNE эффективно используется в процедурах ожидания какого-либо события. Например, команда
WAIT: CJNE A,P0,WAIT
будет выполняться до тех пор, пока на линиях порта 0 не установится информация, совпадающая с содержимым аккумулятора.
Все команды данной группы, за исключением CJNE и JBC, не оказывают воздействия на флаги. Команда CJNE устанавливает флаг C, если первый операнд оказывается меньше второго. Команда JBC сбрасывает флаг C в случае перехода.
Подпрограммы. Для обращения к подпрограммам необходимо использовать команды вызова подпрограмм (LCALL, ACALL). Эти команды в отличие от команд перехода (LJMP, AJMP) сохраняют в стеке адрес возврата в основную программу. Для возврата из подпрограммы необходимо выполнить команду RET. Команда RETI отличается от команды RET тем, что разрешает прерывания обслуженного уровня.