Меню

Таблица машинный код команд

Таблица машинный код команд

Многие любители не испытывают серьезных трудностей в овладении БЕЙСИКом. Для этого достаточно немного практики. Но рано или поздно они приходят к барьеру «машинного кода». Как это ни печально, но некоторые так перед ним и останавливаются. Это ни в коей мере не связано с отсутствием желания или способностей, просто многие не знают, с чего начать. Если в БЕЙСИКе можно начинать с чего угодно (при ошибке компьютер сам Вас поправит), то здесь Вы оказываетесь с процессором один на один, и такой метод проб и ошибок не срабатывает.

Одним словом, есть некий психологический барьер, который бывает трудно преодолеть в одиночку. Известно, что для того, чтобы научиться программировать, надо взять и начать программировать. «ИНФОРКОМ» предлагает Вам следующий компромиссный подход — сначала в рамках этой главы мы, беря «быка за рога», просто начнем программировать, а затем посвятим оставшуюся часть книги систематическому изложению материала.

Итак, давайте напишем первую программу в машинном коде. Прежде всего, выделим для нее область памяти. Если Вы читали нашу книгу «Большие возможности Вашего «ZX-Spectrum`а», то знаете, что для БЕЙСИКа в оперативной памяти компьютера отведена область памяти, начинающаяся с адреса, на который указывает системная переменная PROG и заканчивается адресом, на который указывает системная переменная RAMTOP. Предположим, что Вы хотите записать программу в машинных кодах, начиная с адреса 30000. Дайте команду CLEAR 29999. Эта команда установит RAMTOP в 29999 и Ваша программа будет защищена от возможной порчи из БЕЙСИКа. Даже если Вы дадите команду NEW, области памяти, находящиеся выше RAMTOP, не будут поражены.

Теперь дайте две прямые команды одну за другой:

Мы сейчас записали два числа в нужные нам адреса. Они образуют простейшую программу. Выполнить ее можно командой RANDOMIZE USR 30000. Попробуйте сами. Вам покажется, что ничего не произошло, но это не так. Сначала процессор обратился по адресу 30000 и нашел там число 0, которое обозначает машинный код операции NOP. Операция NOP ( no operation — нет операции) дает команду процессору, что ничего делать не надо. В течение 0,0000014 сек. он действительно ничего не делает, а затем переходит к следующему адресу, где находит число 201.

Это команда RET ( return — возврат). Она дает процессору указание прекратить в этом месте программу в машинных кодах и вернуться туда, откуда она вызывалась, т.е. в нашем случае — в БЕЙСИК. Это самое процессор и сделал, о чем Вы получили сообщение БЕЙСИКа «О.К.».

Если все, что Вы здесь прочитали, Вам понятно, то Вы уже поняли, как составляются программы в машинных кодах. Можно, конечно, возразить, что пользы от такой программы не очень много, но сейчас не в этом суть. Важно, чтобы Вы поняли, что некая последовательность чисел может быть последовательностью команд для процессора Z-80.

К сожалению, для нас мало, что говорит простая последовательность чисел вроде таких, как 0 и 201. Держать в памяти коды всех команд процессора (а их около семисот) непросто, но дело упрощается тем, что есть промежуточный язык между процессором и человеком — язык Ассемблера. У каждого кода есть своя мнемоника Ассемблера. Мнемоника — это набор букв, являющихся сокращением английских слов. Для нашего примера программа на Ассемблере выглядит так:

Перевод этих мнемоник в машинные коды тоже можно поручить компьютеру. Для этого существуют специальные программы, которые тоже называют Ассемблерами. Есть и противоположные программы — Дизассемблеры. Они наоборот переводят машинные коды в мнемоники Ассемблера.

И тех программ и других достаточно много. Часто они объединяются в пакеты. Широко распространены пакеты GENS3/MONS3 фирмы HISOFT и EDITAS / MONITOR 16/48 фирмы PICTURESQUE . Здесь GENS 3 и EDITAS — Ассемблеры, а MONS 3, MONITOR 16 и MONITOR 48 — Дизассемблеры.

Теперь давайте вернемся к нашей первой программе и попробуем ее несколько развить, чтобы она все же что-то делала. Процессор Z-80 имеет несколько регистров, у которых есть имена – «А», «В», «С» и т.д. Каждый из них может содержать одно какое-либо целое число от 0 до 255 (т.е. один байт).

Существуют десятки команд процессора, которые позволяют копировать содержимое регистров из одного в другой, а также выполнять связь с внешним миром, в т.ч. и с оперативной памятью.

Так, например, команда Ассемблера LD B,A (машинный код — 71) означает «загрузить содержимое регистра А в регистр В». LD — это сокращение от LOAD (загрузка).

Точно так же LD C,B (машинный код 72) означает «загрузить в регистр С содержимое регистра В». Можно загружать в регистры и целые числа. Например, LD A, n — означает «загрузить в регистр А целое число n », где n может быть числом от 0 до 255. До этого все команды были однобайтными. Эта же команда — двухбайтная. Сначала идет машинный код — 62, а за ним само число — n . Так, например, LD A, 77 (загрузить в регистр А число 77) будет выглядеть так: 62,77. Здесь 62 — код операции, — он сообщает процессору, что надо сделать, а 77 — это операнд. Заметим здесь же, что бывают операции и трехбайтные и четырехбайтные. Первый байт, как правило, — код операции, а следующие за ним — операнды. Мы говорим «как правило» потому, что есть некоторые операции, код которых записывается двумя байтами [прим.1].

Итак, мы уже готовы к тому, чтобы написать программу, которая будет перебрасывать какое-либо число из одного регистра процессора в другой.

Источник



FE23 LOOCH DISASM

СПРАВОЧНИК ПО КОМАНДАМ
ПРОЦЕССОРОВ x86

КОМАНДЫ АССЕМБЛЕРА
И МАШИННЫЕ КОМАНДЫ

Первоначально эта информация была помещена на странице Пояснения к основным таблицам. Но затем было решено, что эти длинные общие рассуждения лучше вынести на отдельную страницу. Однако, после такого переноса эти рассуждения еще немножко выросли. Теперь, пожалуй, они годятся только для раздела «Разные заметки» .

Команды ассемблера и машинные команды

Прежде всего нужно не забывать, что команды на языке ассемблера и команды на машинном языке — это две разные вещи. Хотя несомненно, что эти два понятия тесно связаны между собой.

Команда ассемблера это некоторое мнемоническое имя. Для процессоров семейства x86 это имя записывается на английском языке. Например, у команды сложения имя ADD , а у команды вычитания имя SUB .

В таблицах настоящего справочника в колонке Команда показано имя команды на языке ассемблера.

Основой машинной команды является код операции, который является просто некоторым числом. Для процессоров x86 (впрочем, и для других процессоров тоже) принято использовать шестнадцатиричные числа. (Попутно заметим, что для советских ЭЦВМ были приняты восьмеричные числа, с ними было меньше путаницы, поскольку такие числа состоят только из цифр и не содержат букв).

В таблицах настоящего справочника в колонке Код показан код операции машинной команды, а в колонке Формат показан формат машинной команды.

Можно считать, что количество разных машинных команд у данного процессора равно количеству возможных кодов операции. По формату можно узнать, из каких составных частей состоит данная машинная команда. Разные машинные команды могут иметь разный формат. Код операции машинной команды полностью определяет ее формат.

Часто одна ассемблерная команда имеет несколько разных вариантов машинных команд. Причем форматы этих машинных команд могут быть разными для разных вариантов.

Например, ассемблерная команда ADD имеет десять вариантов машинных команд с разными кодами операций. Но разных форматов оказывается меньше, только три. И каждый из этих трех форматов требует свои типы операндов при записи команды на языке ассемблера.

Здесь важно обратить внимание, что все эти десять машинных команд выполняют одну и ту же элементарную операцию, которая на языке ассемблера называется ADD.

И, значит, получается, что вроде бы можно рассуждать так: процессор может выполнять столько разных элементарных операций, сколько есть разных команд ассемблера. Однако, этот простой принцип все равно нуждается в оговорках и примечаниях. Так как у части ассемблерных команд бывают еще и синонимы.

Общий список всех команд процессора можно построить разными способами, выбирая разный порядок расположения команд. Основные два способа такие.

Способ (1). Взять за основу команды языка ассемблера и расположить команды по алфавиту. Тогда могут получиться вот такие таблицы. Все команды по алфавиту (кратко) Все команды по алфавиту (подробно)

Способ (2). Взять за основу код операции машинной команды и расположить команды в порядке кодов операций. При этом будет лучше, если общий список разделить на две части, сделать отдельные списки для команд с однобайтным кодом операции и для команд с двухбайтным кодом операции. Первый байт кода операций Второй байт кода операций

Конечно, возможен еще и третий способ, который обычно применяется в учебниках. Разделить все команды на группы по смыслу и изучать их по группам, начиная с более простых.

Основной байт кода операции

В системе команд x86 одного байта (256 разных комбинаций) оказалось недостаточно для кодирования всех команд. Поэтому код операции в машинной команде занимает либо один байт, либо два байта.

Если первый байт содержит код 0F , то код операции состоит из двух байтов.

Если в машинной команде код операции состоит из одного байта, то этот единственный байт и является основным байтом кода операции. И содержимое этого байта определяет, что это за операция.

Если в машинной команде код операции состоит из двух байт, то уже не первый, а второй байт будет основным и определяющим в коде операции.

В таблицах справочника, в которых показано кодирование машинных команд, основной байт кода операции обычно бывает показан дважды, сначала в колонке «Код» в виде шестнадцатиричного числа, а затем в колонке «Формат» в виде условных восьми черточек, на которых отмечены особые биты, если таковые есть в основном байте кода операции.

Источник

Описание G и M кодов для программирования ЧПУ (CNC) станков

На производстве, где работают различные станки с числовым программным управлением, используется множество различного программного обеспечения, но в большинстве случаев весь управляющий софт использует один и тот же управляющий код. Программное обеспечение для любительских станков, так же базируется на аналогичном коде. В обиходе его называют «G-код». В данном материале представлена общая информация по G-коду (G-code).

Читайте также:  Таблица степени риска при гипертонии

G-code это условное именование языка для программирования устройств с ЧПУ (CNC) (Числовое программное управление). Был создан компанией Electronic Industries Alliance в начале 1960-х. Финальная доработка была одобрена в феврале 1980-о года как RS274D стандарт. Комитет ИСО утвердил G-code, как стандарт ISO 6983-1:1982, Госкомитет по стандартам СССР — как ГОСТ 20999-83. В советской технической литературе G-code обозначается, как код ИСО-7 бит.

Производители систем управления используют G-code в качестве базового подмножества языка программирования, расширяя его по своему усмотрению.

Программа, написанная с использованием G-code, имеет жесткую структуру. Все команды управления объединяются в кадры — группы, состоящие из одной или более команд. Кадр завершается символом перевода строки (ПС/LF) и имеет номер, за исключеним первого кадра программы. Первый кадр содержит только один символ» %». Завершается программа командой M02 или M30.

Основные (в стандарте называются подготовительными) команды языка начинаются с буквы G:

  • перемещение рабочих органов оборудования с заданой скоростью (линейное и круговое;
  • выполнение типовых последовательностей (таких, как обработка отверстий и резьб);
  • управление параметрами инструмента, системами координат, и рабочих плоскостей.

Сводная таблица кодов:

Подготовительные (основные) команды / Коды Описание
G00-G04 Позиционирование инструмента
G17-G19 Переключение рабочих плоскостей (XY, XZ, YZ)
G20-G21 Не стандаризовано
G40-G44 Компенсация размера различных частей инструмента (длина, диаметр)
G53-G59 Переключение систем координат
G80-G84 Циклы сверления, нарезания резьбы
G90-G92 Переключение систем координат (абсолютная, относительная)

Таблица основных команд:

Код Описание Пример
G00 Ускоренное перемещение инструмента (холостой ход) G0 X0 Y0 Z100;
G01 Линейная интерполяция G01 X0 Y0 Z100 F200;
G02 Круговая интерполяция почасовой стрелки G02 X15 Y15 R5 F200;
G03 Круговая интерполяция против часовой стрелки G03 X15 Y15 R5 F200;
G04 Задержка на P миллисекунд G04 P500;
G10 Задать новые координаты для начала координат G10 X10 Y10 Z10;
G11 Отмена G10G11;
G15 Отмена G16G15 G90;
G16 Переключение в полярную систему координат G16 G91 X100 Y90;
G20 Режим работы в дюймовой системе G90 G20;
G21 Режим работы в метрической системе G90 G21;
G22 Активировать установленый предел перемещений (Станок невыйдет за их предел). G22 G01 X15 Y25;
G23 Отмена G22G23 G90 G54;
G28 Вернуться на референтную точку G28 G91 Z0 Y0;
G30 Поднятие по оси Z на точку смены инструмента G30 G91 Z0;
G40 Отмена компенсации размера инструмента G1 G40 X0 Y0 F200;
G41 Компенсировать радиус инструмента слева G41 X15 Y15 D1 F100;
G42 Компенсировать радиус инструмента справа G42 X15 Y15 D1 F100;
G43 Компенсировать высоту инструмента положительно G43 X15 Y15 Z100 H1 S1000 M3;
G44 Компенсировать высоту инструмента отрицательно G44 X15 Y15 Z4 H1 S1000 M3;
G53 Переключиться на систему координат станка G53 G0 X0 Y0 Z0;
G54-G59 Переключиться на заданную оператором систему координат G54 G0 X0 Y0 Z100;
G68 Поворот координат на нужный угол G68 X0 Y0 R45;
G69 Отмена G68G69;
G80 Отмена циклов сверления (G81-G84)G80 Z100;
G81 Цикл сверления G81 X0 Y0 Z-10 R3 F100;
G82 Цикл сверления сзадержкой G82 X0 Y0 Z-10 R3 P100 F100;
G83 Цикл сверления сотходом G83 X0 Y0 Z-10 R3 Q8 F100;
G84 Цикл нарезание резьбы G95 G84 X0 Y0 Z-10 R3 F1.411;
G90 Абсолютная система координат G90 G21;
G91 Относительная система координат G91 G1 X4 Y5 F100;
G94 F (подача) — в формате мм/мин. G94 G80 Z100;
G95 F (подача )- в формате мм/об. G95 G84 X0 Y0 Z-10 R3 F1.411;
G98 Отмена G99G98 G15 G90;
G99 После каждого цикла не отходить на «подходную точку» G99 G91 X10 K4;

Таблица технологических кодов:

Технологические команды языка начинаются с буквы М. Включают такие действия, как:

  • Сменить инструмент
  • Включить/выключить шпиндель
  • Включить/выключить охлаждение
  • Вызвать/закончить подпрограмму

Источник

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

ACALL — абсолютный вызов подпрограммы.

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

Пример:

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

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
Машинный код:

Пример:

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

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

Пример:

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

3) Первый операнд — неявная, второй операнд — прямая;

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

Пример:

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

Пример: ADD A, #38h

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

Пример:

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

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 — абсолютный переход в пределах 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

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

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

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

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 — сбрасывает указанный бит в нуль.

Описание: сбрасывает (записывает ‘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 — инвертируется указанный бит.

Описание: бит адрес, которого указан во втором байте команды инвертируется, т.е. если бит содержит ‘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

IF [[(A7-4) > 9] or [(C) = 1]] THEN

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» читают:

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

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

Об авторе:
к.т.н., доц., Александр Владимирович Микушин

Кандидат технических наук, доцент кафедры САПР СибГУТИ. Выпускник факультета радиосвязи и радиовещания (1982) Новосибирского электротехнического института связи (НЭИС).

А.В.Микушин длительное время проработал ведущим инженером в научно исследовательском секторе НЭИС, конструкторско технологическом центре «Сигнал», Научно производственной фирме «Булат». В процессе этой деятельности он внёс вклад в разработку систем радионавигации, радиосвязи и транкинговой связи.

Научные исследования внедрены в аппаратуре радинавигационной системы Loran-C, комплексов мобильной и транкинговой связи «Сигнал-201», авиационной системы передачи данных «Орлан-СТД», отечественном развитии системы SmarTrunkII и радиостанций специального назначения.

Источник

AVR програмирование в кодах

Известно, что у микроконтроллера AVR, 133 ассемблерных мнемонических команд, которым соответствует 76 машинные команды. Я постарался систематизировать и расписать эти команды.
Статья предлагается для тех, кто хочет написать свой компилятор, дизассемблер, ассемблер, или же просто имеет желание писать программы в машинных кодах :-).
Предполагается что минимальные знания о микроконтроллере AVR у читающих уже имеется.
Команды AVR микроконтроллера могут быть представлены 16 типами.

команды двухбайтовые:


этим типом представлены 12 команд:

  • ADC (1C00h) сложить с переносом
  • ADD (0C00h) сложить два РОНа
  • AND (2000h) логическое И
  • CP (1400h) сравнить два РОНа
  • CPC (0400h) сравнить с учетом переноса
  • CPSE (1000h) сравнить и пропустить если равно
  • MOV (2C00h) копирование РОН
  • MUL (9C00h) умножение двух РОН (результат в регистровой паре R0:R1)
  • OR (2800h) логическое ИЛИ
  • SBC (1800h) вычитание с переносом
  • SUB (1800h) вычитание двух РОН
  • EOR (2400h) выполнить исключающие или двух РОН

в скобках указан машинный код маска

в качестве операндов выступают два регистра общего назначения (РОН):

как это все применить,
предположим мы решили написать коротенькую программу из 3 команд:

MOV (2C00h) R10 (000Ah) R11 (00B0h); 2C00h OR 000Ah OR 00B0h = 2CBAh
ADD (0C00h) R10 (000Ah) R15 (00F0h); 0C00h OR 000Ah OR 00F0h = 0CFAh
AND (2000h) R10 (000Ah) R11 (00B0h); 2000h OR 000Ah OR 00B0h = 20BAh


этим типом представлены 2 команды:

  • ADIW (9600h) сложение непосредственного значения со словом
  • SBIW (9700h) вычитание непосредственного значения со словом

в качестве операнда используются регистровые пары
непосредственное значение может быть представлено числом ( 0… 63 ), чтобы получить маску для вычисления машинного кода старшую тетраду надо умножить на 4 и сложить с младшей тетрадой
Пример вычисления машинного кода:
ADIW (9600h) r24 (0000h), 60 (003Ch); 9600h OR 0000h OR ((0030h * 4) OR 000Ch )=96CCh
SBIW (9700h) X (0010h), 17 (0011h); 9700h OR 0010h OR ((0010h * 4) OR 0001h )=9751h


этим типом представлены 2 команды:

  • RJMP (C000h) относительный безусловный переход
  • RCALL (D000h) относительный вызов подпрограммы

значение операнда представлено в таблице

Пример вычисления машинного кода:

RJMP (C000h) label_2; C000h OR (адресс label_2 004 — текущий адресс 000 -1 = 003 ) = C003h
RJMP (C000h) label_1; C000h OR (адресс label_1 000 — текущий адресс 005 -1 = -6 ( 6 в двоичном коде 0000 0000 0110, для перевода в отрицательное число инвертируем, получаем 1111 1111 1001b и прибавляем 1, получаем 1111 1111 1010b или FFAh) ) = CFFAh


этим типом представлены 16 команд:

  • ASR (9405h) арифметический сдвиг вправо
  • COM (9400h) дополнение до единицы
  • DEC (940Ah) уменьшение на единицу
  • INC (9403h) увеличить на единицу
  • LSR (9406h) логически сдвинуть вправо
  • NEG (9401h) выполнить дополнение до двух
  • POP (900Fh) загрузит регистр из стека
  • PUSH (920Fh) загрузить регистр в стек
  • ROR (9407h) сдвинуть вправо через перенос
  • SWAP (9402h) обмен тетрад
  • LD Rd,(-XYZ+) (8000h) считать косвенно
  • ST (-XYZ+),Rr (8200h) записать косвенно
  • LPM Rd,Z (9004h) загрузка памяти программ
  • LPM Rd,Z+ (9005h) загрузка памяти программ с постинкрементном
  • ELPM Rd,Z (9006h) расширенная загрузка данных из памяти программ
  • ELPM Rd,Z+ (9007h) расширенная загрузка данных из памяти программ с постинкрементом

в качестве операнда выступает регистр общего назначения (РОН);

команды LD ST используют второй операнд;

Пример вычисления машинного кода:

LD (8000h) R10 (00A0h) Z (0000h); 8000h OR 00A0h OR 0000h = 80A0h
LD (8000h) R2 (0020h) Z+ (1001h); 8000h OR 0020h OR 1001h = 9021h
INC (9403h) R10 (00A0h); 9403h OR 00A0h = 94A3h
ST (8200h) R10 (00A0h) -X (100Eh); 8000h OR 00A0h OR 100Eh = 92AEh

Тип 5:

этим типом представлены 2 команды:

  • BCLR (9488h) очистить флаг
  • BSET (9408h) установить флаг

Пример:
BSET (9408h) S (0040h); 9408h OR 0040h = 9448h
BCLR (9488h) I (0070h); 9488h OR 0070h = 94F8h

Тип 6:

этим типом представлены 4 команды:

  • BLD (F800h) загрузить T флаг в бит регистра
  • BST (FA00h) переписать бит из регистра во флаг T
  • SBRC (FC00h) пропустить команду, если бит в регистре очищен
  • SBRS (FE00h) пропустить команду, если бит в регистре установлен

в качестве операнда выступает регистр общего назначения (РОН);

Пример:
BLD (F800h) R17 (0110h), 4 (0004h); F800h OR 0110h OR 0004h = F914h
BST (FA00h) R1 (0010h), 7 (0007h); FA00h OR 0010h OR 0007h = FA17h

Тип 7:

этим типом представлены 2 команды:

  • BRBS (F000h) перейти, если бит регистра SREG установлен
  • BRBC (F400h) перейти, если бит регистра SREG сброшен

значение операнда представлено в таблице

Тип 8:

этим типом представлены 10 команд;

  • NOP (0000h) холостая команда
  • IJMP (9409h) перейти косвенно
  • RET (9508h) возврат из подпрограммы
  • RETI (9518h) возврат из прерывания
  • SLEEP (9588h) перейти в режим SLEEP
  • WDR (95A8h) сброс сторожевого таймера
  • LPM (95C8h) загрузить байт из памяти программ
  • SPM (95E8h) изменение содержимого памяти программ
  • ICALL (9509h) вызов подпрограммы косвенно
  • ELPM (95D8h) расширенная загрузка данных из памяти программ

Пример:
WDR = 95A8h
SLEEP = 9588h

Тип 9:

этим типом представлены две команды;

  • IN (B000h) загрузить данные из порта в/в в регистр
  • OUT (B800h) загрузить данные из регистра в порт в/в

в качестве операнда выступает регистр общего назначения (РОН);

в качестве второго операнда выступает порт в/в;

Пример:
IN (B000h) R10 (00A0h), DDRB(0207h); B000h OR 00A0h OR 0207h = B2A7h
OUT (B800h) DDRB (0207h), R2 (0020h); B800h OR 0207h OR 0020h= BA27h

Тип 10:

этим типом представлены две команды:

  • MULSU (0300h) умножение знакового с незнаковым
  • FMUL (0308h) дробное незнаковое умножение
  • FMULS (0380h) дробное умножение со знаком
  • FMULSU (0388h) дробное умножение знакового с незнаковым

в качестве операндов выступают два регистра общего назначения r16-r23 (РОН) результат заносится в регистровую пару r0:r1:

Пример вычисления машинного кода:
FMUL (0308h) R16 (0000h) R20 (0040h); 0308h OR 0000h OR 0040h = 0348h
MULSU (0388h) R20 (0004h) R16 (0000h); 0388h OR 0004h OR 0000h = 038Ch

Тип 12a:

этим типом представлена 1 команда:

  • MOVW (0100h) пересылка регистровой пары

в качестве операндов выступают два регистра общего назначения (РОН):

Пример вычисления машинного кода:
MOVW (0100h) R02 (0010h) R04 (0002h); 0100h OR 0010h OR 0002h = 0112h
MOVW (0100h) R10 (0050h) Z (000Fh); 0100h OR 0050h OR 000Fh = 015Fh

Тип 12b:
этим типом представлена 1 команда:

  • MULS (0200h) знаковое умножение

в качестве операндов выступают два регистра общего назначения (РОН):

Пример вычисления машинного кода:
MULS (0200h) R16 (0000h) R24 (0080h); 0200h OR 0000h OR 0080h = 0280h

Тип 13:

этим типом представлены 6 команд:

  • CPI (3000h) сравнить с конгстантой
  • SBCI (4000h) вычесть непосредственное значение с переносом
  • SUBI (5000h) вычесть непосредственное значение
  • ORI (6000h) выполнить логическое OR с непосредственным значением
  • ANDI (7000h) выполнить логическое AND с непосредственным значением
  • LDI (E000h) загрузить непосредственное значение

один из операндов РОН (r16..r31);

второй операнд непосредственное значение, для получения маски надо старшую тетраду шестнадцатеричного числа умножить на 16 (10h) и сложить с младшей тетрадой;

Пример вычисления машинного кода:

LDI (E000h) R20 (0040h) #34h (0034h); E000h OR 0040h OR (0030h*10h+0004h) = E344h
SUBI (5000h) R20 (0040h) #12h (0012h); 5000h OR 0040h OR (0010h*10h+0002h) = 5142h
CPI (3000h) R22 (0060h) #10h (0010h); 3000h OR 0060h OR (0010h*10h+0000h) = 3160h

Тип 15:

этим типом представлены 4 команды:

  • CBI (9800h) сбросит разряд в регистре в/в
  • SBIC (9900h) пропустить команду, если бит порта в/в очищен
  • SBI (9A00h) установить разряд в регистре в/в
  • SBIS (9B00h)пропустить команду, если бит порта в/в установлен

один из операндов порт в/в 0-31 второй номер бита 0-7;

Пример вычисления машинного кода:
SBIC (9900h) 16 (0040h), 4 (0004h); 9900h OR 0040h OR 0004h = 9944h
SBI (9A00h) 16 (0040h) 4 (0004h); 9A00h OR 0040h OR 0004h = 9A44h

Тип 16:

этим типом представлены 4 команды:

  • LDD Rd,Z+q (8000h) косвенное относительное чтение памяти
  • LDD Rd,Y+q (8008h) косвенное относительное чтение памяти
  • STD Rd,Z+q (8200h) косвенное относительное запись памяти
  • STD Rd,Y+q (8208h) косвенное относительное запись памяти

в качестве операнда выступает регистр общего назначения (РОН);

Пример вычисления машинного кода:
LDD(Z+q) (8000h) R16 (0100h), Z + 25h (2005h); 8000h OR 0100h OR 2005h = A105h
STD(Y+q) (8208h) R20 (0140h), Z + 02h (0002h); 8208h OR 0140h OR 0002h = 834Ah

четырехбайтные :

Тип 11:

сюда входит 2 команды:

  • JMP (940C 0000h) абсолютный переход
  • CALL (940E 0000h) абсолютный вызов подпрограммы

в качестве операнда выступает адрес который загружается в регистр PC значение может быть от 0 до 3FFFFFh, используется до 1FFFFh;
Пример вычисления машинного кода:
JMP (940C 0000h) 1234h; 940C0000h OR 00001234h = 940C1234h

Тип 14:

этим типом представлены 2 команды:

  • STS (9200 0000h) загрузить непосредственно в память
  • LDS (9000 0000h) считать непосредственно из памяти

один из операндов РОН, второй непосредственное значение ( 0..FFFFh ):

Пример вычисления машинного кода:
LDS (9000 0000h) R19 (0130 0000h), 3Fh (0000 003Fh); 90000000h OR 01300000h OR 0000003Fh = 9130003Fh
STS (9200 0000h) R31 (01F0 0000h), 2FFh (0000 02FFh); 92000000h OR 01F00000h OR 000002FFh = 93F002FFh

Команды не вошедшие:

Для удобства пользования один и тот же код команды может быть представлен разными мнемоническими значениями, например команда SER r16 установить все биты регистра, эквивалентна команде LDI r16, 255 загрузить непосредственное значение в регистр. Ниже представлены эти команды:

мнемонические варианты команды BRBC условный переход:
BRCC перейти, если флаг переноса C сброшен sss=0 (BRBC C, label)
BRSH перейти, если больше или равно, флаг C сброшен sss=0 (BRBC C, label)
BRNE перейти, если не равно, Z сброшен sss=1
(BRBC Z, label)
BRPL перейти, если результат положительный, N сброшен sss=2 (BRBC N, label)
BRVC перейти, если флаг переполнения V сброшен sss=3 (BRBC V, label)
BRGE перейти, если больше или равно с учетом знака, S сброшен sss=4 (BRBC S, label)
BRHC перейти, если флаг полу переноса H сброшен sss=5 (BRBC H, label)
BRTC перейти, если флаг T сброшен sss=6 (BRBC T, label)
BRID перейти, если прерывания запрещены, I сброшен sss=7 (BRBC I, label)

мнемонические варианты команды BRBS условный переход:
BRCS перейти, если флаг переноса C установлен sss=0 (BRBS C, label)
BRLO перейти, если меньше (без знака), флаг C установлен sss=0 (BRBS C, label)
BRNE перейти, если не равно, Z установлен sss=1 (BRBS Z, label)
BRMI перейти, если результат отрицательный, N установлен sss=2 (BRBS N, label)
BRVS перейти, если флаг переполнения V установлен sss=3 (BRBS V, label)
BRLT перейти, если меньше чем (со знаком )флаг S установлен sss=4 (BRBS S, label)
BRHS перейти, если флаг полу переноса H установлен sss=5 (BRBS H, label)
BRTS перейти, если флаг T установлен sss=6 (BRBS T, label)
BRIE перейти, если прерывания разрешены, I установлен sss=7 (BRBS I, label)

мнемонические варианты команды BCLR:
CLC очистить флаг С sss=0 (BCLR C)
CLZ очистить флаг Z sss=1 (BCLR Z)
CLN очистить флаг N sss=2 (BCLR N)
CLV очистить флаг V sss=3 (BCLR V)
CLS очистить флаг S sss=4 (BCLR S)
CLH очистить флаг H sss=5 (BCLR H)
CLT очистить флаг T sss=6 (BCLR T)
CLI очистить флаг I sss=7 (BCLR I)

мнемонические варианты команды BSET:
SEC установить флаг С sss=0 (BSET C)
SEZ установить флаг Z sss=1 (BSET Z)
SEN установить флаг N sss=2 (BSET N)
SEV установить флаг V sss=3 (BSET V)
SES установить флаг S sss=4 (BSET S)
SEH установить флаг H sss=5 (BSET H)
SET установить флаг T sss=6 (BSET T)
SEI установить флаг I sss=7 (BSET I)

мнемонический вариант команды AND:
TST проверка РОН
пример: команда TST r10, аналог AND r10, r10

мнемонический вариант команды ANDI:
CBR сбросить разряд в регистре
пример: команда CBR r20, 80h, обнулить старший бит в регистре r20 аналог ANDI r20, 7Fh

мнемонический вариант команды ORI:
CBR установить разряд в регистре
пример: команда SBR r20, 80h, установить старший бит в регистре r20 аналог ORI r20, 80h

мнемонический вариант команды EOR:
CLR очистить регистр в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда CLR r0 аналог EOR r0,r0

мнемонический вариант команды ADD:
LSL логически сдвинуть влево, в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда LSL r0 аналог ADD r0,r0

мнемонический вариант команды ADC:
ROL сдвинуть влево через перенос, в качестве обоих операндов приемник и источник выступает один и тот же РОН
пример: команда ROL r10 аналог ADC r10,r10

список сокращений:

  • КОП — код операции
  • РОН — регистр общего назначения
  • RRRRR — регистр источник РОН r0..r31
  • DDDDD — регистр приемник (источник приемник) РОН r0..r31
  • KKKKKK — непосредственное значение
  • SSS — SREG номер бита в регистре 0..7
  • BBB — номер бита 0..7
  • AAAAAA — порт ввода вывода
  • qqqqq — смещение
  • прием. — регистр приемник (источник)
  • ис-чн. — регистр источник
  • рег. — регистр РОН

Если будут замечены ошибки, напишите, исправлю.

Источник

Adblock
detector