Дата последнего обновления файла 23.10.2009

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

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

Литература:

  1. Боборыкин А.В., Липовецкий Г.П., и др. Однокристальные микроЭВМ М.: Бином 1994
  2. В.В. Сташин, А.В. Урусов, О.Ф. Мологонцева Проектирование цифровых устройств на однокристальных микроконтроллерах М.: Энергоатомиздат 1990
  3. Карасев Однокристальный микропроцессор семейства MCS-51 М.: 1995
  4. Бродин В.Б., Калинин А.В. Системы на микроконтроллерах и БИС программируемой логики М.: ЭКОМ 2001
  5. Микушин А.В. Сединин В.И. Однокристальный микроконтроллер семейства MCS-51 фирмы INTEL 8xC51GB Новосибирск: СибГУТИ, 2001
  6. Микушин А.В. Занимательно о микроконтроллерах. СПб, БХВ-Петербург, 2006.
  7. Микушин А.В., Сажнев А.М., Сединин В.И. Цифровые устройства и микропроцессоры. СПб, БХВ-Петербург, 2010.

Вместе со статьей "Архитектура микроконтроллеров MCS-51" читают:

Состав семейства MCS-51
http://digteh.ru/MCS51/tablms.php

Архитектура микроконтроллеров MCS-51
http://digteh.ru/MCS51/MCS_51.php

Система команд микроконтроллеров MCS-51
http://digteh.ru/MCS51/SysInstr.php

Устройство параллельных портов микроконтроллеров MCS-51
http://digteh.ru/MCS51/port.php

Построение памяти микроконтроллеров семейства MCS-51
http://digteh.ru/MCS51/pam_cntr.php

Устройство таймеров микроконтроллеров MCS-51
http://digteh.ru/MCS51/timers.php

Последовательный порт микроконтроллера 8051
http://digteh.ru/MCS51/PoslPort.php


Автор Микушин А. В. All rights reserved. 2001 ... 2017

Предыдущие версии сайта:
http://neic.nsk.su/~mavr
http://digital.sibsutis.ru/

Поиск по сайту сервисом Яндекс

Поиск по сайту сервисом ГУГЛ

пЕИРХМЦ@Mail.ru


Яндекс.Метрика
Rambler's Top100