Курс лекций - Микропроцессоры

         

Описание машинных команд


ACALL <addr 11> - абсолютный вызов подпрограммы.

Описание: вызывает подпрограмму, размещенную по указанному адресу <addr 11>. Команда увеличивает содержимое счетчика команд на 2 и затем помещает полученный результат в стек (младший байт первым). После это содержимое указателя стека SP увеличивается на 2. Т.к. в команде используется 11-разрядный адрес, полученный соединением пяти старших бит счетчика команд и второго байта команды, то подпрограмма должна начинаться в пределах той же 2K-байтной страницы. Команда не воздействует на флаги.

Количество байт: 2
Количество циклов: 2
Действие команды
:
(PC) = (PC) + 2
(SP) = (SP) + 1
((SP)) = (PC7-0)
(SP) = (SP) + 1
((SP)) = (PC15-8)
(PC10-0) = адрес подпрограммы (метки)
Машинный код:

a10 a9 a8 1 0 0 0 1 a7 a6 a5 a4 a3 a2 a1 a0

Пример:

адрес команда исходный текст 1000 7111 ACALL 311h

Действие команды:

до команды после команды PC=1000 PC=0311 *SP=35 *SP=1002

ADD A, <байт-источник> - сложение.

Описание: складывает содержимое аккумулятора А с содержимым байта- источника. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного.

Для команды сложения разрешены следующие режимы адресации:

1) Первый операнд - , второй операнд - ;

Количество байт: 1
Количество циклов: 1
Действие команды
:
(PC) = (PC) + 1
(A) = (A) + (Rn) , n=0,1,2,3,4,5,6,7
Машинный код:

0 0 1 0 1 r r r

Пример:

адрес команда исходный текст 0000 2F ADD A, R7

Действие команды:

до команды после команды PC=0000 PC=0001 A=35 A=7A R7=46 R7=46 C=0 C=0

2) Первый операнд - , второй операнд - ;

Количество байт: 1
Количество циклов: 1
Действие команды
:
(PC) = (PC) + 1
(A) = (A) + ((Ri)) , i=0,1
Машинный код:

0 0 1 0 0 1 1 i

Пример:


адрес команда исходный текст 0010 26 ADD A, @R0 Действие команды:
до команды после команды PC=0010 PC=0011 R0=15 R0=15 A=95 A=16 *15=81 *15=81 C=0 C=1 3) Первый операнд - , второй операнд - ;
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (direct)
Машинный код:
0 0 1 0 0 1 0 1 d d d d d d d d Пример:
адрес команда исходный текст 0012 2564 ADD A, 100 Действие команды:
до команды после команды PC=0012 PC=0014 A=95 A=96 *100=01 *100=81 C=1 C=0 4) Первый операнд - , второй операнд - .
Пример: ADD A, #38h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (date 8)
Машинный код:
0 0 1 0 0 1 0 0 i i i i i i i i Пример:
адрес команда исходный текст 0014 2564 ADD A, #38h Действие команды:
до команды после команды PC=0014 PC=0016 A=95 A=CD C=1 C=0 ADDC A, <байт-источник> - сложение с учетом переноса.
Описание: складывает содержимое аккумулятора А с содержимым байта-источника, к получившемуся результату прибавляется значение флага переноса. Результат операции помещается в аккумулятор. Флаг переноса C устанавливается при переносе из 7го разряда. Флаг вспомогательного переноса AC устанавливается при переносе из 3го разряда. При сложении знаковых чисел флаг переполнения OV устанавливается при превышении максимального положительного числа или при получении числа меньшего минимально возможного. Для команды сложения разрешены следующие режимы адресации байта - источника:
  • ;
Пример: ADDC A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + (Rn) , n=0, : ,7
Машинный код: 0 0 1 1 1 r r r
  • ;
Пример: ADDC A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) + (C) + ((Ri)) , i=0,1
Машинный код: 0 0 1 1 0 1 1 i
  • ;
Пример: ADDC A, 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(A) = (A) + (C) + (direct)
Машинный код:
0 0 1 1 0 1 0 1


d d d d d d d d
  • .
Пример: ADDC A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) + (C) + (date 8)
Машинный код:
0 0 1 1 0 1 0 0
i i i i i i i i
AJMP <addr 11> - абсолютный переход в пределах 2K-байтной страницы.
Описание: передает управление команде, размещенной по указанному адресу <addr 11>. Команда увеличивает содержимое счетчика команд на 2 и затем заменяет младший байт счетчика команд на содержимое второго байта команды. Три младших бита старшего байта заменяются тремя старшими битами первого байта команды. Т.к. в команде используется 11- разрядный адрес, то адрес перехода должен начинаться в пределах той же 2K-байтной страницы памяти программ.
Пример: AJMP 1024
Количество байт: 2
Количество циклов: 2
Действие команды:
(PC) = (PC) + 2
(PC10-0) = адрес метки
Машинный код:
a10 a9 a8 0 0 0 0 1
a7 a6 a5 a4 a3 a2 a1 a0
ANL <байт приемник>,<байт источник> - команда "логическое И" для байтовых переменных.
Описание: выполняет операцию побитового "логического И" над указанными переменными и помещает результат в байт приемник. Команда не воздействует на флаги.
Для команды ANL с аккумулятором в качестве байта назначения разрешены следующие режимы адресации байта - источника:
  • ;
Пример: ANL A, R3
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & (Rn) , n=0,1,2,3,4,5,6,7
Машинный код: 0 1 0 1 1 r r r
  • ;
Пример: ANL A, @R0
Количество байт: 1
Количество циклов: 1
Действие команды:
(PC) = (PC) + 1
(A) = (A) & ((Ri)) , i=0,1
Машинный код: 0 1 0 1 0 1 1 i
  • ;
Пример: ANL A, 30h
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) & (direct)
Машинный код:
0 1 0 1 0 1 0 1
d d d d d d d d
  • .
Пример: ANL A, #100
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(A) = (A) & (date 8)
Машинный код:


0 1 0 1 0 1 0 0
i i i i i i i i
Для команды ANL с произвольным адресом ячейки внутренней памяти данных в качестве байта назначения разрешены следующие режимы адресации байта - источника:
  • ;
Пример: ANL 30h,A
Количество байт: 2
Количество циклов: 1
Действие команды:
(PC) = (PC) + 2
(direct) = (A) & (direct)
Машинный код:
0 1 0 1 0 0 1 0
d d d d d d d d
  • .
Пример: ANL direct, #100
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
(direct) = (A) & (date 8)
Машинный код:
0 1 0 1 0 0 1 1
d d d d d d d d
i i i i i i i i
Примечание: при выполнении команды ANL над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
ANL C,<бит источника> - "логическое И" битовой переменной и флага переноса C.
Описание: Если бит источника равен 0, то происходит сброс флага переноса, в противном случае флаг переноса не изменяет текущего значения. На остальные флаги команда не воздействует.
  • ;
Пример: ANL С, 20h
Количество байт: 2
Количество циклов: 2
Действие команды: (PC) = (PC) + 2
(C) = (C) & (bit)
Машинный код:
0 1 0 1 0 0 1 0
b b b b b b b b
Знак '/' перед операндом в языке ассемблера указывает на то, что в качестве значения используется логическое отрицание адресуемого бита, при этом сам бит источника не изменяется.
CJNE <байт назначения>,<байт источника>,<смещение> - сравнение и переход, если не равно.
Описание: сравнивает значения первых двух операндов и выполняет переход, если операнды не равны. Если значение байта назначения без учета знака меньше байта источника без учета знака, то флаг переноса C устанавливается в '1', иначе сбрасывается в '0'. Ни один из операндов после выполнения команды не изменяется. Новое значение программного счетчика при переходе вычисляется суммирование содержимого программного счетчика со вторым операндом (третьим байтом команды). Перед выполнением суммирования в программный счетчик заносится адрес первого байта следующей команды.


Суммирование производится с учетом знака третьего байта команды, представленного в дополнительном коде.
Первые два операнда допускают четыре вида адресации:
  1. байт назначения - аккумулятор
  • ;
Пример: CJNE A, 30h, 15; direct=30h, rel=15
Количество байт: 3
Количество циклов: 2
Действие команды:
(PC) = (PC) + 3
IF (A) < > (direct) THEN
(PC) = (PC) + rel
IF (A) < (direct) THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 0 1
d d d d d d d d
R e l A d r e s
  • .
Пример: CJNE A, #100, -78; data=100, rel=-78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF (A) < > data THEN
(PC) = (PC) + rel
IF (A) < data THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 0 0
i i i i i i i i
R e l A d r e s
  1. байт назначения - ячейка ОЗУ с косвенно-регистровой или регистровой адресацией
  • к
Пример: CJNE R5, #100, 78; Rn=R5 data=100, rel=78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF (Rn) < > data THEN
(PC) = (PC) + rel
IF (Rn) < data THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 1 r r r
i i i i i i i i
R e l A d r e s
  • к
Пример: CJNE @R0, #100, 78; Ri=R0 data=100, rel=78
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
IF ((Ri)) < > data, i=0,1 THEN
(PC) = (PC) + rel
IF ((Ri)) < data, i=0,1 THEN
(C) = 1
ELSE
(C) = 0
Машинный код:
1 0 1 1 0 1 1 i
i i i i i i i i
R e l A d r e s
CLR A - сброс аккумулятора
Описание: сбрасывает (записывает '0' во все биты аккумулятора). Команда не изменяет содержимое флагов.
Пример: CLR A      ;Записывает в аккумулятор число 00h
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = 0
Машинный код:
1 1 1 0 0 1 0 0
CLR <bit> - сбрасывает указанный бит в нуль.
Описание: сбрасывает (записывает '0') в указанный во втором байте команды бит. Команда не изменяет содержимое флагов.


Пример: CLR C ;Записывает во флаг переноса '0'
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(C) = 0
Машинный код:
1 1 0 0 0 0 1 1
  • ;
Пример: CLR P1.2       ; Записывает во второй бит порта 1 '0'
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(bit) = 0
Машинный код:
1 1 0 0 0 0 1 0
b b b b b b b b
CPL A - каждый бит аккумулятора инвертируется.
Описание: каждый бит аккумулятора инвертируется, т.е. если в каком-либо из восьми бит аккумулятора записана '1', то в этот бит записывается '0' и наоборот.
Пример: CPL A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = not(A)
Машинный код: 1 1 1 1 0 1 0 0
CPL <bit> - инвертируется указанный бит.
Описание: бит адрес, которого указан во втором байте команды инвертируется, т.е. если бит содержит '1', то в этот бит записывается '0' и наоборот.
  • ;
Пример: CPL 27
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(bit) = not(bit)
Машинный код:
1 0 1 1 0 0 1 0
b b b b b b b b
CPL C - инвертируется флаг переноса 'C'.
Описание: флаг переноса 'C' инвертируется, т.е. если флаг переноса 'C' содержит '1', то в него записывается '0' и наоборот.
Пример: CPL C
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(C) = not(C)
Машинный код: 1 0 1 1 0 0 1 1
DA A - десятичная коррекция аккумулятора при сложении двоично-десятичных чисел.
Описание: команда десятичной коррекции позволяет вести сложение чисел, представленных в упакованном двоично-десятичном коде. Команда применяется после инструкций ADD или ADDC. Инструкции (команды) ADD или ADDC позволяют суммировать сразу две тетрады, расположенные в одном байте.
Если биты аккумулятора с 0 по 3 содержат число большее 9 (xxxx1010:xxxx1111) или флаг вспомогательного переноса AC содержит '1', то к аккумулятору прибавляется число 6 для того, чтобы получить правильную двоично-десятичную цифру в младшей тетраде.


Если старшие биты аккумулятора (с 4 по 7) содержат число большее 9 (1010xxxx :1111xxxx) или флаг переноса C содержит '1', то к аккумулятору прибавляется число 60h для того, чтобы получить правильную двоично-десятичную цифру в старшей тетраде.
Если в результате операции DA A возникнет перенос, то флаг переноса C будет установлен в 1. Единичный флаг переноса после операции DA A означает, что результат суммирования больше 100 и этим можно воспользоваться для суммирования многоразрядных двоично-десятичных чисел. Команда десятичной коррекции не воздействует на флаг переполнения OV.
Примечание: команда DA A не может преобразовать двоичное число из аккумулятора в двоично-десятичный вид или правильно скорректировать двоично-десятичное вычитание.
Пример: DA A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
IF [[(A3-0) > 9] or [(AC) = 1]] THEN
(A3-0) = (A3-0) + 6
AND
IF [[(A7-4) > 9] or [(C) = 1]] THEN
(A7-4) = (A7-4) + 6
Машинный код:
1 1 0 1 0 1 0 0
DEC <байт> - производит вычитание 1 из указанного операнда.
Описание: ячейка памяти адрес, которой указан во втором байте команды уменьшается на 1. Если первоначально в ячейке было записано значение 00h, то в нее заносится значение 0FFh. Команда не воздействует на флаги.
Примечание: при выполнении команды DEC над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
Для команды DEC разрешены следующие режимы адресации байта - источника:
  • .
Пример: DEC A
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(A) = (A) - 1
Машинный код:
0 0 0 1 0 1 0 0
  • ;
Пример: DEC R3
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
Машинный код:
0 0 0 1 1 r r r
  • ;
Пример: DEC @R0
Количество байт: 1
Количество циклов: 1
Действие команды: (PC) = (PC) + 1
((Ri)) = ((Ri)) - 1, i=0,1
Машинный код:


0 0 0 1 0 1 1 i
  • ;
Пример: DEC 30h
Количество байт: 2
Количество циклов: 1
Действие команды: (PC) = (PC) + 2
(direct) = (direct) - 1
Машинный код:
0 0 0 1 0 1 0 1
d d d d d d d d
DIV AB - деление.
Описание: делит 8- битовое беззнаковое целое число из аккумулятора А на 8-битовое целое без знака в регистре В. В аккумулятор A заносится целая часть результата деления, а в регистр В - остаток. Флаги переноса C и переполнения OV будут очищены (записан '0'). Если в регистре B перед операцией деления содержится '0', то в аккумуляторы A и B будут занесены неопределенные значения, а флаг переполнения будет установлен (записана '1').
Количество байт: 1
Количество циклов: 4
Действие команды: (PC) = (PC) + 1
(A) = (A) div (B)
(A) = (A) mod (B)
Машинный код:
0 1 0 0 0 1 0 0
DJNZ <байт>,<смещение> - вычитание 1 из указанной ячейки и переход, если результат не равен 0.
Описание: вычитание 1 из указанной во втором байте команды ячейки памяти и переход к вычисляемому по третьему байту команды адресу, если результат вычитания не равен 0. Если первоначально в ячейке памяти содержится '0', то в результате выполнения операции туда будет записано число '0FFH'. Команда не воздействует на флаги. Новое значение программного счетчика при переходе вычисляется суммирование содержимого программного счетчика со вторым операндом (третьим байтом команды). Перед выполнением суммирования в программный счетчик заносится адрес первого байта следующей команды. Суммирование производится с учетом знака третьего байта команды, представленного в дополнительном коде.
Примечание: при выполнении команды DJNZ над содержимым внешнего порта используется значение из внутреннего регистра, а не данные, присутствующие на выводах микросхемы!
Для команды DJNZ разрешены следующие режимы адресации байта - источника:
  • ;
Пример: DJNZ R3 ,LABEL1;
Количество байт: 2
Количество циклов: 2
Действие команды: (PC) = (PC) + 2
(Rn) = (Rn) - 1, n=0,1,2,3,4,5,6,7
IF (Rn) < > 0, THEN n=0,1,2,3,4,5,6,7
(PC) = (PC) + rel
Машинный код:
1 1 0 1 1 r r r
R e l A d r e s
  • ;
Пример: DJNZ 30h,LABEL1;
Количество байт: 3
Количество циклов: 2
Действие команды: (PC) = (PC) + 3
(direct) = (direct) - 1
IF (direct) < > 0 THEN
(PC) = (PC) + rel
Машинный код:
1 1 0 1 0 1 0 1
d d d d d d d d
R e l A d r e s
[ ]

Содержание раздела