STM8 - STM8
Эта статья нужны дополнительные цитаты для проверка. (Январь 2018) (Узнайте, как и когда удалить этот шаблон сообщения) |
В STM8 является 8 бит микроконтроллер семья STMicroelectronics. В микроконтроллерах STM8 используется расширенный вариант ST7 архитектура микроконтроллера. Микроконтроллеры STM8 особенно дешевы для полнофункционального 8-битного микроконтроллера.[1]
Архитектура
STM8 очень похож на более ранний ST7, но лучше подходит в качестве мишени для C из-за его 16-битных индексных регистров и указатель стека -режим относительной адресации. Хотя внутри Гарвардская архитектура он имеет унифицированное 24-битное адресное пространство, что позволяет коду выполняться вне ОЗУ (полезно для внутрисистемное программирование из прошить ROM ) и данные (например, таблицы поиска ) для доступа из ПЗУ. Доступ к данным выше 64 КБ ограничен специальными инструкциями «загрузить дальше»; операнды памяти большинства операций могут обращаться максимум к 128 КБ (16-битный базовый адрес плюс 16-битное смещение).
Очень немногие микроконтроллеры STM8 имеют более 64 КБ памяти данных.
Он имеет те же шесть регистров (A, X, Y, SP, PC, CC), что и ST7, но индексные регистры X и Y были расширены до 16 бит, а счетчик команд был расширен до 24 бит. В аккумулятор A и указатель стека остаются 8 и 16 битами соответственно.[2]
В регистр кода состояния имеет еще два определенных бита, всего семь. Существует флаг переполнения, и второй бит разрешения прерывания, позволяющий четыре уровни приоритета прерывания.
Подсемейства
- Автомобиль СТМ8АФ
- СТМ8АЛ автомобильный маломощный
- STM8L маломощный
- STM8S по выгодной цене
- STM8T с сенсорным управлением
- Управление освещением STLUX
- STNRG Широтно-импульсная модуляция -контроллеры
Поддержка компилятора
STM8 поддерживается бесплатным Компилятор C для малых устройств, бесплатный компилятор Cosmic C с закрытым кодом,[3] и несвободные IAR Компиляторы C и Raisonance. Помимо C существует STM8 eForth, порт с открытым исходным кодом для языка программирования Forth.
Изменения по сравнению с ST7
Набор инструкций STM8 в основном является надмножеством ST7, но не полностью совместим с двоичными кодами.
Операции с регистрами X и Y расширены до 16 бит. Таким образом, загрузка и сохранение обращаются к двум байтам памяти, а не к одному. (Так же полуприкрытый флаг был изменен, чтобы отразить перенос из бита 7 в бит 8 16-битного результата, а не перенос из бита 3 в 4.)
Прерывания передают девять байтов состояния вместо пяти на ST7.
Команда умножения сохраняет 16-битное произведение в указанном индексном регистре (например, X), а не делит его между X и A.
Режимы косвенной адресации, которые извлекают 8-битный адрес из памяти (коды операций 92 2x, 92 3x, 92 Bx, 92 6x, 92 Пр., 91 6x, и 91 пр.) были удалены; все режимы косвенной адресации выбирают 16-битные адреса. Новый префиксный байт 72 был добавлен и использовался для косвенного кодирования, начиная с 16-битного адреса.
Инструкции по манипулированию битами были изменены, чтобы принимать 16-битный адрес и требовать 72 префиксный байт. Коды операций без префикса 0x и 1x они раньше заняты, вместо этого используются для относительной адресации указателя стека.
Для некоторых редко используемых инструкций ветвления были изменены коды операций, чтобы требовать 90 префикс, а коды операций без префикса переназначены для подписанных ветвей, которые зависят от флага V.
Инструкции загрузки и сравнения, нацеленные на регистр X, мало используются на ST7 с режимами адресации, индексируемыми регистром X. На STM8, когда такие операции определяют операнд памяти, индексированный регистром X, операнд регистра изменяется на Y. 90 префикса, регистры меняются местами, так что индексный регистр - Y, а регистр операнда - X.
Одно из основных различий в производительности заключается в том, что STM8 выбирает 32 бита из ПЗУ за цикл, а для типичных инструкций требуется один цикл плюс один цикл на каждый доступ к ОЗУ. ST7, напротив, выбирает 8 бит за цикл и берет один цикл на байт инструкции.
Набор инструкций
Инструкции STM8 состоят из необязательного префиксного байта (7216, 9016, 9116, или же 9216), байт кода операции и несколько (до четырех, но редко более двух) байтов операндов. Байты префикса в основном изменяют режим адресации, используемый для указания операнда памяти, но в некоторых случаях префиксы 72 и 90 выполнить совершенно другую операцию.
Префикс 90 меняет местами X и Y в следующей инструкции. В таблице ниже эти варианты объединены в одну строку путем записи «X / Y», что означает «X» или «Y». Префикс 90 также используется в двух местах для введения новых кодов операций: инструкций BCPL и BCCM и некоторых условий перехода.
Префикс 92 преобразует инструкции с операндом смещения (адрес16, X) на косвенную адресацию ([адрес 8],ИКС). Смещение заменяется 8-битным адресом 16-битного значения смещения в памяти. Он используется только для этой функции.
Префикс 91 имеет оба предыдущих эффекта, преобразовывая (адрес16, X) режимы адресации на ([адрес 8], Y).
Префикс 72 используется в ряде мест гораздо менее регулярно. В некоторых случаях он вводит новые режимы адресации (в частности, ([адрес16], X) 16-битный непрямой режим), но он также вводит много совершенно новых операций.
| Префикс | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Операнды | Мнемонический | Описание |
|---|---|---|---|---|---|---|---|---|---|---|---|
| — | 0 | 0 | 0 | 0 | код операции | адрес 8 | OP (адрес 8, ИП) | Инструкции с одним операндом (см. Ниже) | |||
| — | 0 | 0 | 0 | 1 | код операции | адрес 8 | ОП А, (адрес 8, ИП) | Двухоперандные инструкции со стековым операндом | |||
| — | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | адрес 8 | SUB A, (адрес 8, ИП) | A: = A - операнд |
| — | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | адрес 8 | CP A, (адрес 8, ИП) | Сравнить A - операнд |
| — | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | адрес 8 | SBC A, (адрес 8, ИП) | A: = A - операнд - C вычесть с заимствованием |
| —/90 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | адрес 8 | CPW X / Y, (адрес 8, ИП) | Сравнить X / Y - операнд (16 бит) |
| — | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | адрес 8 | И А, (адрес 8, ИП) | A: = A & операнд, побитовое и |
| — | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | адрес 8 | BCP A, (адрес 8, ИП) | Побитовый тест A и операнд |
| — | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | адрес 8 | LDW Y, (адрес 8, ИП) | Y: = операнд ( |
| — | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | адрес 8 | LDW (адрес 8,ШПИОН | Операнд: = Y ( |
| — | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | адрес 8 | XOR A, (адрес 8, ИП) | A: = A ^ операнд, исключающее ИЛИ |
| — | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | адрес 8 | АЦП А, (адрес 8, ИП) | A: = A + операнд + C, сложить с переносом |
| — | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | адрес 8 | ИЛИ A, (адрес 8, ИП) | A: = A | операнд, включительно или |
| — | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | адрес 8 | ДОБАВИТЬ,(адрес 8, ИП) | A: = A + операнд |
| — | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | imm16 | ДОБАВИТЬ X, # imm16 | X: = X + немедленно (= |
| — | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | imm16 | SUBW X, # imm16 | X: = X - немедленно (= |
| — | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | адрес 8 | LDW X, (адрес 8, ИП) | X: = операнд |
| — | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | адрес 8 | LDW (адрес 8, SP), X | Операнд: = X |
| 72/90 | 0 | 0 | 0 | c | кусочек | v | операнды | Битовые операции | |||
| 72 | 0 | 0 | 0 | 0 | кусочек | 0 | адрес16 soff8 | BTJTадрес16,#кусочек,метка | Перейти к ПК + soff8, если исходный бит истинен (установлен) | ||
| 72 | 0 | 0 | 0 | 0 | кусочек | 1 | адрес16 soff8 | BTJFадрес16,#кусочек,метка | Перейти к ПК + soff8, если исходный бит ложный (очистить) | ||
| 72 | 0 | 0 | 0 | 1 | кусочек | 0 | адрес16 | BSET адрес16,#кусочек | Установить указанный бит в 1 | ||
| 72 | 0 | 0 | 0 | 1 | кусочек | 1 | адрес16 | BRES адрес16,#кусочек | Сбросить (сбросить) указанный бит на 0 | ||
| 90 | 0 | 0 | 0 | 1 | кусочек | 0 | адрес16 | BCPL адрес16,#кусочек | Дополнить (переключить) выбранный бит | ||
| 90 | 0 | 0 | 0 | 1 | кусочек | 1 | адрес16 | BCCM адрес16,#кусочек | Запись флага переноса в бит памяти | ||
| —/90 | 0 | 0 | 1 | 0 | условие | soff8 | Условные переходы (8-битное смещение со знаком) | ||||
| — | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | soff8 | JRA метка | Всегда переходить (истина) |
| — | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | soff8 | JRF метка | Ветвь никогда (ложь) |
| — | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | soff8 | JRUGT метка | Перейти, если без знака больше, чем (C = 0 и Z = 0) |
| — | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 | soff8 | JRULE метка | Переход, если без знака меньше или равно (C = 1 или Z = 1) |
| — | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | soff8 | JRNC метка | Переход, если нет переноса (C = 0) |
| — | 0 | 0 | 1 | 0 | 0 | 1 | 0 | 1 | soff8 | JRC метка | Переход при переносе (C = 1) |
| — | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 0 | soff8 | JRNE метка | Перейти, если не равно (Z = 0) |
| — | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | soff8 | JREQ метка | Перейти, если равно (Z = 1) |
| — | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNV метка | Перейти, если не переполнение (V = 0) |
| 90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | soff8 | JRNH метка | Ветвь, если не полуперенос (H = 0) |
| — | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | JRV метка | Переход при переполнении (V = 1) |
| 90 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 | soff8 | JRH метка | Разветвляется, если переносится частично (H = 1) |
| — | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 0 | soff8 | JRPL метка | Перейти, если плюс (N = 0) |
| — | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | soff8 | JRMI метка | Переход, если минус (N = 1) |
| — | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRSGT метка | Переходить, если знак больше (S = 0 и N = V) |
| 90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | soff8 | JRNM метка | Перейти, если нет маски прерывания (I = 0) |
| — | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | JRSLE метка | Переход, если знак меньше или равен (S = 1 или N ≠ V) |
| 90 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | JRM метка | Переход, если прерывания замаскированы (I = 1) |
| — | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRSGE метка | Переход, если знак больше или равен (N = V) |
| 90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 0 | soff8 | JRIL метка | Переход, если линия прерывания низкая |
| — | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRSLT метка | Переходить, если подписано меньше (N ≠ V) |
| 90 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | soff8 | JRIH метка | Переход, если линия прерывания высока |
| префикс | 0 | Режим | код операции | операнд | Инструкции с одним операндом | ||||||
| — | 0 | 0 | 0 | 0 | код операции | адрес 8 | OP (адрес 8, ИП) | Относительный указатель стека | |||
| — | 0 | 0 | 1 | 1 | код операции | адрес 8 | OP адрес 8 | 8-битный абсолютный адрес | |||
| 72 | 0 | 0 | 1 | 1 | код операции | адрес16 | OP [адрес16] | 16-битный косвенный адрес | |||
| 92 | 0 | 0 | 1 | 1 | код операции | адрес 8 | OP [адрес 8] | 8-битный косвенный адрес 16-битного адреса | |||
| — | 0 | 1 | 0 | 0 | код операции | — | OP A | Аккумулятор | |||
| 72/90 | 0 | 1 | 0 | 0 | код операции | адрес16 | OP (адрес16, X / Y) | Индексируется с 16-битным смещением | |||
| —/90 | 0 | 1 | 0 | 1 | код операции | — | OPW X / Y | Регистр X / Y (16-битная операция) | |||
| 72 | 0 | 1 | 0 | 1 | код операции | адрес16 | OP addr16 | 16-битный адрес | |||
| —/90 | 0 | 1 | 1 | 0 | код операции | адрес 8 | OP (адрес 8, X / Y) | 8-битный адрес плюс X / Y | |||
| 72 | 0 | 1 | 1 | 0 | код операции | адрес16 | OP ([адрес16],ИКС) | 16-битный косвенный адрес плюс X | |||
| 92/91 | 0 | 1 | 1 | 0 | код операции | адрес 8 | OP ([адрес 8], X / Y) | 8-битный косвенный адрес плюс X / Y | |||
| —/90 | 0 | 1 | 1 | 1 | код операции | — | OP (X / Y) | Проиндексировано без смещения | |||
| префикс | 0 | Режим | 0 | 0 | 0 | 0 | операнд | NEG операнд | Отрицание с дополнением до двух | ||
| 0 | Режим | 0 | 0 | 0 | 1 | (переназначен для обменных операций; см. следующий раздел) | |||||
| 0 | Режим | 0 | 0 | 1 | 0 | (переназначен для других операций; см. следующий раздел) | |||||
| префикс | 0 | Режим | 0 | 0 | 1 | 1 | операнд | CPL операнд | Дополнение, логическое не | ||
| префикс | 0 | Режим | 0 | 1 | 0 | 0 | операнд | SRL операнд | Сдвиг вправо логический, msbit очищен, lsbit для переноса: (операнд: C): = (0: операнд) | ||
| 0 | Режим | 0 | 1 | 0 | 1 | (переназначен для других операций; см. следующий раздел) | |||||
| префикс | 0 | Режим | 0 | 1 | 1 | 0 | операнд | RRC операнд | Повернуть вправо через перенос, (операнд: C): = (C: операнд) | ||
| префикс | 0 | Режим | 0 | 1 | 1 | 1 | операнд | SRA операнд | Сдвиг вправо арифметика, msbit сохраняется, lsbit для переноса | ||
| префикс | 0 | Режим | 1 | 0 | 0 | 0 | операнд | SLL операнд | Сдвиг влево, msbit для переноса: (C: операнд): = (операнд: 0) | ||
| префикс | 0 | Режим | 1 | 0 | 0 | 1 | операнд | RLC операнд | Повернуть влево через перенос, (C: операнд): = (операнд, C) | ||
| префикс | 0 | Режим | 1 | 0 | 1 | 0 | операнд | DEC операнд | Декремент; N и Z установлены, переносить без изменений | ||
| 0 | Режим | 1 | 0 | 1 | 1 | (переназначен для других операций; см. следующий раздел) | |||||
| префикс | 0 | Режим | 1 | 1 | 0 | 0 | операнд | INC операнд | Приращение; N и Z установлены, переносить без изменений | ||
| префикс | 0 | Режим | 1 | 1 | 0 | 1 | операнд | TNZ операнд | Тест ненулевой: установите N и Z на основе значения операнда | ||
| префикс | 0 | Режим | 1 | 1 | 1 | 0 | операнд | ЗАМЕНА операнд | Поменять местами половины операнда (4-битный поворот; 8-битный для SWAPW X и SWAPW Y) | ||
| префикс | 0 | Режим | 1 | 1 | 1 | 1 | операнд | CLR операнд | Установить операнд на 0, N очищено, Z установлено | ||
| префикс | 0 | Режим | код операции | операнд | Переназначены оподы [03-7] [125B] из диапазона с одним операндом | ||||||
| —/90 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | RRWA X / Y | Повернуть слово вправо через A: 8-битный поворот вправо 24-битной конкатенации X / Y и A; (X: A): = (A: X) |
| — | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | адрес16 | EXG A,адрес16 | Обменять A с памятью |
| — | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | — | EXG A, XL | Обменять A на X (нижняя половина) |
| — | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 1 | — | EXGW X, Y | Заменить X на Y (16 бит) |
| — | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | — | EXG A, YL | Обменять A на Y (нижняя половина) |
| — | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | — | (зарезервированный) | |
| —/90 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | — | RLWA X / Y | Повернуть слово влево через A: 8-битный поворот влево 24-битной конкатенации X / Y и A; (А: Х): = (Х: А) |
| — | 0 | 0 | 1 | 1 | 0 | 0 | 1 | 0 | адрес16 | Поп адрес16 | Вытащить из стопки |
| —/90 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | — | MUL X / Y, А | X / Y: = XL / YL × А |
| — | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | imm8 | SUBW SP, # imm | SP: = SP - imm8 |
| —/90 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 0 | — | DIV X / Y, A | Разделите X / Y на A; 16-битное частное по X / Y, остаток по A |
| — | 0 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | — | ПРЕФИКС | Префикс инструкции 72: изменить следующий код операции |
| 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | (зарезервированный) | ||
| — | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | imm8 адрес16 | MOV адрес16,#imm8 | Немедленно переместить в память (флажки не изменяются) |
| — | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | адрес8 адрес8 | MOV адрес 8,адрес 8 | Переместить память в память (флаги не изменяются) |
| — | 0 | 1 | 0 | 1 | 0 | 1 | 0 | 1 | адрес16 адрес16 | MOV адрес16,адрес16 | Переместить память в память (флаги не изменяются) |
| — | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | — | DIVW X, Y | Разделите X на Y (16 бит); частное по X, остаток по Y |
| 0 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | — | (зарезервированный) | ||
| 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | (зарезервированный) | ||
| — | 0 | 0 | 1 | 1 | 1 | 0 | 1 | 1 | адрес16 | ТОЛКАТЬ адрес16 | Вставить в стек |
| — | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | imm8 | НАЖАТЬ # imm8 | Вставить в стек |
| — | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | imm8 | ДОБАВИТЬ SP, # imm8 | SP: = SP + imm8 |
| — | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | адрес 8 | LD (адрес 8,СПА | Хранить относительно стека |
| — | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | адрес 8 | LD A, (адрес 8, ИП) | Загрузить относительно стека |
| — | 1 | 0 | 0 | код операции | — | Разные инструкции. Ни один из них не устанавливает коды условий неявно. | |||||
| — | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | — | IRET | Возврат из прерывания (pop CC, A, X, Y, PC) |
| — | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | — | RET | Извлечь 16-битный адрес возврата из стека на ПК |
| — | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | адрес24 | INT | Специальный переход для таблицы векторов прерываний |
| — | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | — | ЛОВУШКА | Прерывание с прерыванием |
| — | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | — | POP A | Извлечь из стека |
| —/90 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | — | POPW X / Y | Извлечь X / Y из стека (16 бит) |
| — | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | — | POP CC | Извлечь коды условий из стека |
| — | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | — | RETF | Извлечь 24-битный адрес возврата из стека в ПК |
| — | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | — | НАЖАТЬ А | Поместить A в стек |
| —/90 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | — | PUSHW X / Y | Вставить X / Y в стек (16 бит) |
| — | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | — | НАЖАТЬ CC | Помещать коды условий в стек |
| — | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | — | ПЕРЕМЕНА | Остановить для отладчика, если он есть, или NOP |
| — | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | — | CCF | Дополнение (переключение) флаг переноса |
| — | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес24 | CALLF адрес24 | Нажать 24-битный ПК; ПК: = адрес24 |
| 92 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | адрес16 | CALLF [адрес16] | Косвенный дальний вызов; адрес 24-битный указатель |
| — | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | — | HALT | Остановить процессор и часы |
| — | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | WFI | Дождитесь прерывания, останавливая процессор, но не часы |
| 72 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | — | WFE | Ожидание события (сопроцессор), обработка прерываний во время ожидания |
| — | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | — | PDY | Префикс инструкции 90: поменять местами X и Y в следующей инструкции |
| — | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | — | PIY | Префикс инструкции 91: PDY плюс PIX |
| — | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 0 | — | PIX | Префикс инструкции 92: использовать 8-битную косвенную память для операнда |
| —/90 | 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | — | LDW X / Y, Y / X | X / Y: = Y / X |
| —/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | — | LDW SP, X / Y | SP: = X / Y |
| —/90 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | — | LD XH / YH, А | XH / YH: = А |
| —/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | — | LDW X / Y, SP | X / Y: = SP |
| —/90 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | — | LD XL / YL, А | XL / YL: = А |
| — | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | — | RCF | Сбросить (сбросить) флаг переноса |
| — | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 | — | SCF | Установить флаг переноса |
| — | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | — | RIM | Сбросить маску прерывания (разрешить прерывания) |
| — | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | — | SIM | Установить маску прерывания (отключить прерывания) |
| — | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | — | RVF | Сбросить (сбросить) флаг переполнения |
| — | 1 | 0 | 0 | 1 | 1 | 1 | 0 | 1 | — | NOP | Нет операции |
| —/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | — | LD A, XH / YH | А: = XH / YH |
| —/90 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | — | LD A, XL / YL | А: = XL / YL |
| Префикс | 1 | Режим | код операции | операнд | Инструкции с двумя операндами A: = операнд операции | ||||||
| — | 0 | 0 | 0 | 1 | код операции | адрес 8 | OP (адрес 8, ИП) | Операнд относительно стека (см. Выше; коды операций 16, 17, 1C, 1D не соответствуют шаблону) | |||
| — | 1 | 0 | 1 | 0 | код операции | imm8 | OP #imm8 | 8-битный непосредственный операнд (запрещено как пункт назначения) | |||
| — | 1 | 0 | 1 | 1 | код операции | адрес 8 | OP адрес 8 | 8-битный абсолютный адрес (запрещено прыгать / звонить) | |||
| — | 1 | 1 | 0 | 0 | код операции | адрес16 | OP адрес16 | 16-битный абсолютный адрес | |||
| 72 | 1 | 1 | 0 | 0 | код операции | адрес16 | OP [адрес16] | 16-битный косвенный адрес | |||
| 92 | 1 | 1 | 0 | 0 | код операции | адрес 8 | OP [адрес 8] | 8-битный косвенный адрес 16-битного адреса | |||
| —/90 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP (адрес16, X / Y) | Индексируется с 16-битным смещением | |||
| 72 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP ([адрес16],ИКС) | 16-битный косвенный + X | |||
| 92/91 | 1 | 1 | 0 | 1 | код операции | адрес16 | OP ([адрес 8], X / Y) | 8-битный косвенный + X / Y | |||
| —/90 | 1 | 1 | 1 | 0 | код операции | адрес 8 | OP (адрес 8, X / Y) | Индексируется с 8-битным смещением | |||
| —/90 | 1 | 1 | 1 | 1 | код операции | — | OP (X / Y) | Проиндексировано без смещения | |||
| префикс | 1 | Режим | 0 | 0 | 0 | 0 | операнд | SUB A,операнд | A: = A - операнд | ||
| префикс | 1 | Режим | 0 | 0 | 0 | 1 | операнд | CP A,операнд | Сравнить A - операнд | ||
| префикс | 1 | Режим | 0 | 0 | 1 | 0 | операнд | SBC A,операнд | A: = A - операнд - C вычесть с заимствованием | ||
| префикс | 1 | Режим | 0 | 0 | 1 | 1 | операнд | CPW X / Y,операнд | Сравнить X / Y - операнд (16 бит); сравнить Y / X, если режим операнда проиндексирован X / Y (коды операций D3, E3, F3) | ||
| префикс | 1 | Режим | 0 | 1 | 0 | 0 | операнд | И А,операнд | A: = A & операнд, побитовое и | ||
| префикс | 1 | Режим | 0 | 1 | 0 | 1 | операнд | BCP A,операнд | Побитовый тест A и операнд | ||
| префикс | 1 | Режим | 0 | 1 | 1 | 0 | операнд | LD A,операнд | A: = операнд | ||
| префикс | 1 | Режим | 0 | 1 | 1 | 1 | операнд | LD операнд, А | Операнд: = A (режим 2 | ||
| префикс | 1 | Режим | 1 | 0 | 0 | 0 | операнд | XOR A,операнд | A: = A ^ операнд, исключающее ИЛИ | ||
| префикс | 1 | Режим | 1 | 0 | 0 | 1 | операнд | АЦП А,операнд | A: = A + операнд + C, сложить с переносом | ||
| префикс | 1 | Режим | 1 | 0 | 1 | 0 | операнд | ИЛИ А,операнд | A: = A | операнд, включительно или | ||
| префикс | 1 | Режим | 1 | 0 | 1 | 1 | операнд | ДОБАВИТЬ,операнд | A: = A + операнд | ||
| префикс | 1 | Режим | 1 | 1 | 0 | 0 | операнд | JP операнд | Младшие 16 бит ПК: = операнд, безусловный переход (режимы 2 | ||
| префикс | 1 | Режим | 1 | 1 | 0 | 1 | операнд | ВЫЗОВ операнд | Нажмите 16-битный ПК, младшие 16 бит ПК: = операнд (режимы 2 | ||
| префикс | 1 | Режим | 1 | 1 | 1 | 0 | операнд | LDW X / Y,операнд | Загрузить X / Y: = операнд; используйте 16 вместо 90 1E для LDW Y, (адрес 8, ИП) | ||
| префикс | 1 | Режим | 1 | 1 | 1 | 1 | операнд | LDW операнд, X / Y | Операнд: = X / Y (16 бит, режим 2 | ||
| Префикс | 1 | Режим | код операции | операнд | Переназначенные коды операций A7, AC, BC, AD, BD, AF из диапазона с двумя операндами | ||||||
| —/90 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес24 | ЛДФ (адрес24, X / Y), А | Загрузить далеко (= |
| 92/91 | 1 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | адрес16 | LDF ([адрес16], X / Y), A | 16-битный адрес 24-битного указателя |
| — | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес24 | JPF адрес24 | ПК: = адрес24 (= |
| 92 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | адрес16 | JPF [адрес16] | Косвенный дальний прыжок; адрес 24-битный указатель |
| — | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес24 | ЛДФ А,адрес24 | Загрузить далеко (= |
| 92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | адрес16 | LDF A, [адрес16] | Загрузить дальний, 16-битный адрес 24-битного указателя |
| — | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | soff8 | CALLR метка | Нажмите 16-битный ПК, ПК: = ПК + операнд (= |
| — | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес24 | LDF адрес24, А | Операнд: = A (= |
| 92 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | адрес16 | LDF [адрес16], А | Операнд: = A, 16-битный адрес 24-битного указателя |
| —/90 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес24 | ЛДФ А, (адрес24, X / Y) | Загрузить далеко (= |
| 92/91 | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | адрес16 | LDF A, ([адрес16], X / Y) | 16-битный адрес 24-битного указателя |
| 72 | 1 | Режим | код операции | операнд | Арифметические операции с индексным регистром (16 бит) X / Y: = X / Y ± операнд | ||||||
| 72 | 1 | 0 | 1 | 0 | код операции | imm16 | OPW X / Y, #imm16 | 16-битный немедленный | |||
| 72 | 1 | 0 | 1 | 1 | код операции | адрес16 | OPW X / Y,адрес16 | 16-битный абсолютный | |||
| 72 | 1 | 1 | 1 | 1 | код операции | адрес 8 | OPW X / Y, (адрес 8, ИП) | Относительный стек | |||
| 72 | 1 | Режим | 0 | 0 | 0 | 0 | операнд | SUBW X,операнд | X: = X - операнд (предпочтительно код операции 1D для SUBW X, #imm16) | ||
| 72 | 1 | Режим | 0 | 0 | 1 | 0 | операнд | SUBW Y,операнд | Y: = Y - операнд | ||
| 72 | 1 | Режим | 1 | 0 | 0 | 1 | операнд | ДОБАВИТЬ Y,операнд | Y: = Y + операнд | ||
| 72 | 1 | Режим | 1 | 0 | 1 | 1 | операнд | ДОБАВИТЬ X,операнд | X: = X + операнд (предпочитайте код операции 1C для ADDW X, #imm16) | ||
Для инструкций CPW и LDW, в которых режим адресации операндов индексируется X, STM8 по умолчанию использует регистр Y вместо X. Применение 90 префикс меняет местами X и Y, поэтому регистр - X, а режим адресации индексируется Y.
Рекомендации
- ^ Карлсон, Джей (15 сентября 2017 г.). «СТ СТМ8». Получено 2018-06-12.
- ^ а б "PM0044: Руководство по программированию процессора STM8" (PDF). STMicroelectronics. Сентябрь 2011 г. Документ 13590 Ред. 3. Получено 2018-06-10.
- ^ "COS-C-COMPILER - Бесплатный компилятор C для всех STM8 от Cosmic" (Пресс-релиз). STMicroelectronics. Получено 24 марта 2016.