Конспект лекций по курсам «Микропроцессоры в системах контроля» - страница 11

^ 1.16.Логические операции
Данную группу образуют 25 команд (табл. П.1.3), реализующих функционально полную систему логических операции над байтами. В микроконтроллере расширено число типов операндов, участвующих в операциях.

Имеется возможность производить операцию “исключающее ИЛИ” с содержимым портов. Команда XRL может быть эффективно использована для инверсии отдельных битов портов.

ANL ,

(логическое И)

1) (A):=(A)and(Ri) ANL A, Rn

i=0,..,7

Пример: A=FEh, R2=C5h

ANL A, R2 A=C4h


2) (A):=(A)and(direct) ANL A,

Пример: A=0A3h, PSW=86h

ANL A, PSW A=82h


3) (A):=(A)and((Ri)) ANL A, @Rn

i=0, 1

Пример: A=0BCh, ОЗУ[35]=47h, R0=35h

ANL A,@R0 A=04h


4) (A):=(A)and #data ANL A, #data

Пример: A=36h

ANL A, #0DDh A=14h


5) (direct):=(direct)and(A) ANL , A

Пример: A=55h, P2=0AAh

ANL P2, A P2=00h


6) (direct):=(direct)and #data ANL , #data

Пример: P1=FFh

ANL P1, #73h P1=73h


ANL C,

(только прямая адресация)


1) (С):=(С)and(bit)

Пример: CY=1, P1.0=0

ANL C, P1.0 CY=0

2) (С):=(С)and(/bit)

Пример: C=1, AC=0

ANL C, /AC CY=1, AC=0


CLR A (сброс аккумулятора в 0)

1) (A):=0

Пример: (A)=6DH, CY=0, AC=1

CLR A  (A)=0, CY=0, AC=1


CLR (сброс бита)


  1. (C):=0; CY=1, CLR C CY=0

  2. (bit):=0;

Пример: P1=5Eh(01011110b)

CLR P1.3 P1=56h(01010110b)


CPL A инверсия аккумулятора

1) (A):=/(А)

Пример: (A)=65H=01100101b

CPL A  (A)=9AH=10011010


CPL


  1. (bit):=/(bit); P1=39h (00111001b)

CPL P1.1

CPL P1.3 P1=33h (00110011)

2) (C):=/(C) CY=0, AC=1, OV=0

CPL C CY=1, AC=1, OV=0


ORL <байт_назначения>,

Логическое ИЛИ


  1. (A):=(A) OR (Ri)

i=0,..,7

Пример: A=15h, R5=6Ch

ORL A, R5  A=7Dh

  1. (A):=(A) OR (direct)

Пример: A=84h, PSW=0C2h

ORL A, PSW A=C6h

  1. (A):=(A) OR ((Ri))

i=0,1

Пример: A=52h, R0=6Dh, ОЗУ[6D]=49h

ORL A,@R0 A=5Bh

  1. (A)=(A) OR #

Пример: A=F0h

ORL A, #0Ah A=FAh

  1. (direct):=(direct) OR (A)

Пример: A=34h, IP=23h

ORL IP, A IP=37h

  1. (direct):=(direct) OR #

Пример: P1=00h

ORL P1, #0C4h P1=C4h


RL A

циклический сдвиг аккумулятора влево


A=0D5h, CY=0

Пример: RL A A=0АВh, СY=0


RLC A

циклический сдвиг влево через бит С


RR A

циклический сдвиг вправо


RRC A

циклический сдвиг вправо через бит С


XRL <байт_назначения>,<байт_источника>
^ Исключающее ИЛИ

  1. (A):=(A) XOR (Ri)

i=0,..,7

Пример: A=C3h, R6=0AAh

XRL A, R6 A=69h

  1. (A):=(a) XOR (direct)

Пример: A=0Fh, P1=0A6h

XRL A,P1 A=A9h

  1. (A):=(A) XOR ((Ri))

i=0,1

Пример: A=55h, R1=77h, ОЗУ[77]=5Ah

XRL A,@R1 A=0Fh

4) (A)=(A) XOR #

Пример: A=0C3h,

XRL A, 0F5h A=36h

  1. (direct):=(direct) XOR (A)

Пример: A=31h, P1=82h

XRL P1, A  P1=B3h

  1. (direct):=(direct) XOR #

Пример: IP=65h

XRL IP, #65h IP=00h


SWAP A

обмен тетрадами внутри A

Пример: A=0D7h  SWAP A  A=7Dh

^ 1.17.Команды передачи управления
К данной группе команд (табл. П.1.4) относятся команды, условного и безусловного ветвления, вызова подпрограмм и возврата из них, а также команда пустой операции NOP. В большинстве команд используется прямая адресация, т.е. адрес перехода целиком (или его часть) содержится в самой команде передачи управления. Можно выделить три разновидности команд ветвления по разрядности указываемого адреса перехода.
      1. ^ Длинный переход

Переход по всему адресному пространству памяти программ. В команде содержится полный 16-битный адрес перехода (ad16). Трехбайтные команды длинного перехода содержат в мнемокоде букву L (Long). Всего существует две такие команды: LJMP - длинный переход и LCALL - длинный вызов подпрограммы. На практике редко возникает необходимость перехода в пределах всего адресного пространства, и чаще используются укороченные команды перехода, занимающие меньше места в памяти.

LCALL

длинный вызов

(PC):=(PC)+3,

(SP):=(SP)+1, ((SP)):=(PC[7÷0]),

(SP):=(SP)+1, ((SP)) :=( PC [15÷8]),

(PC) :=

Пример: Пусть SP=07h, адрес PRN=1234h, адрес LCALL=0126h

После

LCALL PRN SP=09h, PC 1234h

(ОЗУ [08])=26h, (ОЗУ [09]) =01h


LJMP

длинный переход

(PC):=

LJMP

      1. ^ Абсолютный переход

Переход в пределах одной страницы памяти программ размером 2048 байтов. Такие команды содержат только 11 младших битов адреса перехода (ad11). Команды абсолютного перехода имеют формат 2 байта. Начальная буква мнемокода - A (Absolute). При выполнении команды в вычисленном адресе следующей по порядку команды ((РС) = (PC) + 2) 11 младших битов заменяются на ad11 из тела команды абсолютного перехода.
      1. ^ Относительный переход

Короткий относительный переход позволяет передать управление в пределах от – 128 до +127 байт относительно адреса следующей команды (команды, следующей по порядку за командой относительного перехода). Существует одна команда короткого безусловного перехода SJMP (Short). Все команды условного перехода используют данный метод адресации. Относительный адрес перехода (rel) содержится во втором байте команды.

SJMP

короткий переход 127 байт

(PC):=(PC)+2

(PC):=(PC)+(rel 8)

      1. ^ Косвенный переход

Команда JMP @А + DPTR позволяет передавать управление по косвенному адресу. Эта команда удобна тем, что предоставляет возможность организации перехода по адресу, вычисляемому самой программой и неизвестному при написании исходного текста программы.

JMP @A + DPTR

(PC):=(A)[7÷0]+(DPTR[150])

Пример: PC=034Eh, A=86h

DPTR=0329h

JMP @A+ DPTR PC=03AFh

      1. ^ Условные переходы

Система условных переходов предоставляет возможность осуществлять ветвление по следующим условиям: аккумулятор содержит нуль (JZ), содержимое аккумулятора не равно нулю (JNZ), перенос равен единице (JC), перенос равен нулю (JNC), адресуемый бит равен единице (JB), адресуемый бит равен нулю (JNB).

Для организации программных циклов удобно пользоваться командой DJNZ. В качестве счётчика циклов может использоваться не только регистр, но и прямоадресуемый байт (например, ячейка резидентной памяти данных).

Команда CJNE эффективно используется в процедурах ожидания какого-либо события. Например, команда

WAIT: CJNE A, P0, WAIT

будет выполняться до тех пор, пока на линиях порта 0 не установится информация, совпадающая с содержимым аккумулятора.

Все команды данной группы, за исключением CJNE и JBC, не оказывают воздействия на флаги. Команда CJNE устанавливает флаг CY, если первый операнд оказывается меньше второго. Команда JBC сбрасывает флаг CY в случае перехода.

JNB,

переход, если бит не установлен

JNB P1.3, LAB

JNC

переход, если бит С не установлен

JNC LAB


JNZ

переход, если A≠0

JNZ LAB


JZ

переход, если A=0

JZ LAB

JB,

переход, если установлен в `1`

(PC):=(PC)+3

if (bit)=1 then PC=PC+3+

Пример: JB ACC.2, LAB


JBC,

переход, если бит С установлен в`1` и сброс этого бита в `0`


Пример: JBC ACC.3, LAB3

JBC ACC.2, LAB2


JC

переход, если перенос установлен

Пример: JC LAB


DJNZ< байт>,

декремент и переход, если не равно нулю

  1. (PC):=(PC)+2, (Ri):=(Ri)-1, i=0÷7

if ((Ri)>0 OR (Ri)<0) then PC=PC+3+

Пример: R2=08h, P1=FFh

LAB: CPL P1.7

DJNZ R2, LAB




  1. (PC):=(PC)+3, (direct):=(direct)-1,

if ((direct)>0 OR (direct)<0) then PC=PC+3+

Пример: ОЗУ[40]=01h, ОЗУ[50]=80h, ОЗУ[60]=25h

DJNZ 40h, LAB1 ;переход на LAB2

DJNZ 50h, LAB2

DJNZ 60h, LAB3

……………………….

LAB1: CLR A

LAB2: DEC R1


CJNE<байт_назначения>,<байт_источника>,

сравнение и переход `если не равно`

  1. (PC):=(PC)+3

if (direct) < (A) then (PC):=(PC)+, (C):=0

if (direct) > (A) then (PC):=(PC)+, (C):=1

-число со знаком

Пример: A=97h, P2=F0h, CY=0

CJNE A, P2, MT3

…………………...

MT3: CLRA  A=97h, P2=F0h, CY=1,

PC=PC+3+(rel8)

  1. (PC):=(PC)+3

if #data < (A) then (PC)+ , (C):=0

if #data > (A) then (PC)+ , (C):=1

Пример: A=FCh, CY=1

CJNE A, # 0BFh, MT4

………………………...

MT4: JNC A  A=FDh, C=0, PC=PC+3+(rel8)

  1. алгоритм тот же, но с Ri i=0÷7

Пример: CJNE R7, #81h, MT5

………………………

MT5: NOP

  1. алгоритм тот же, но с @Ri, i=0,1

Пример: CJNE @R0, #29h, MT6

…………………………

MT6: DEC R0

      1. Подпрограммы

Для обращения к подпрограммам необходимо использовать команды вызова подпрограмм LCALL и ACALL. Эти команды в отличие от команд перехода LJMP и AJMP сохраняют в стеке адрес возврата в основную программу. Для возврата из подпрограммы необходимо выполнить команду RET. Команда RETI отличается от команды RET тем, что разрешает прерывания обслуженного уровня.

LCALL

длинный вызов

(PC):=(PC)+3,

(SP):=(SP)+1, ((SP)):=(PC[7÷0]),

(SP):=(SP)+1, ((SP)) :=( PC [15÷8]),

(PC) :=

Пример: Пусть SP=07h, адрес PRN=1234h, адрес LCALL=0126h

После ^ LCALL PRN SP=09h, PC 1234h

(ОЗУ [08])=26h, (ОЗУ [09]) =01h


ACALL

абсолютный вызов

адрес а0÷а10-11 бит

(PC):=(PC)+2,

(SP):=(SP)+1, ((SP)):=(PC[7÷0]),

(SP):=(SP)+1, ((SP)):=(PC[15÷8]),

(PC[10÷0)=A10A9A8||A7A6…A0


Пусть SP=07h, метка MТ1 по адресу 0345h, PC=028Dh

028D: ACALL MT1  SP=09h, PC=0345h

………………………. ОЗУ[08]=8Fh, ОЗУ[09]=02h

0345: MT1

RETI

возврат из прерывания

Восстанавливает счетчик команд PC, инициализирует логику прерываний


RET

PC [15÷8] =((SP)),

(SP)=(SP)-1,

PC[7÷0]=((SP))-1,

(SP)=(SP)-1


7284558377208948.html
7284662558921160.html
7284725535796757.html
7284780976120352.html
7284861795889627.html