STM8 - STM8

STM8 представляет собой 8-разрядный микроконтроллер семейства от STMicroelectronics . В микроконтроллерах STM8 используется расширенный вариант архитектуры микроконтроллеров ST7 . Микроконтроллеры STM8 особенно дешевы для полнофункционального 8-битного микроконтроллера.

Архитектура

STM8 очень похож на более ранний ST7, но лучше подходит в качестве цели для C из-за его 16-битных индексных регистров и режима адресации, связанного с указателем стека . Хотя внутренне в архитектуре Гарварда он имеет единую 24-битное адресное пространство, что позволяет код для выполнения из оперативной памяти (полезно для внутрисистемного программирования на флэш - ПЗУ ), и данные (например, таблиц поиска ) , чтобы получить доступ из ПЗУ. Доступ к данным выше 64 КБ ограничен специальными инструкциями «загрузить дальше»; операнды памяти большинства операций могут обращаться максимум к 128 КБ (16-битный базовый адрес плюс 16-битное смещение).

Очень немногие микроконтроллеры STM8 имеют более 64 КБ памяти данных.

Он имеет те же шесть регистров (A, X, Y, SP, PC, CC), что и ST7, но индексные регистры X и Y были расширены до 16 бит, а счетчик программ увеличен до 24 бит. Аккумулятор А и указатель стека остаются 8 и 16 бит, соответственно.

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

Подсемейства

  • Автомобиль СТМ8АФ
  • СТМ8АЛ автомобильный маломощный
  • STM8L маломощный
  • STM8S по выгодной цене
  • STM8T с сенсорным управлением
  • Управление освещением STLUX
  • STNRG широтно-импульсная модуляция -controllers

Поддержка компилятора

STM8 поддерживается бесплатным компилятором Small Device C Compiler , бесплатным компилятором Cosmic C с закрытым исходным кодом и несвободными компиляторами 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 Ex , 91 6x , и 91 Ex ), были удалены; все режимы косвенной адресации выбирают 16-битные адреса. Был 72 добавлен новый байт префикса , который используется для косвенного кодирования, начиная с 16-битного адреса.

Инструкции по манипулированию битами были изменены, чтобы принимать 16-битный адрес и требовать 72 байта префикса. Коды операций без префикса 0x и 1x ранее занятые коды вместо этого используются для относительной адресации указателя стека.

Коды некоторых редко используемых инструкций ветвления были изменены, чтобы требовать 90 префикса, а коды операций без префикса переназначены для подписанных ветвей, которые зависят от флага V.

Инструкции загрузки и сравнения, нацеленные на регистр X, мало используются на ST7 с режимами адресации, индексируемыми регистром X. В STM8, когда такие операции определяют операнд памяти, индексированный регистром X, операнд регистра изменяется на Y. С 90 префиксом регистры меняются местами, так что регистр индекса равен Y, а регистр операнда - X.

Одно из основных различий в производительности заключается в том, что STM8 выбирает 32 бита из ПЗУ за цикл, а для типичных инструкций требуется один цикл плюс один цикл на каждый доступ к ОЗУ. ST7, напротив, выбирает 8 бит за цикл и берет один цикл на байт инструкции.

Набор инструкций

Инструкции STM8 состоят из необязательного префикса байт ( , , или ), в опкоде байт, и несколько (до четырех, но редко более чем два) байт из операндов. Байты префикса в основном изменяют режим адресации, используемый для указания операнда памяти, но в некоторых случаях префиксы и полностью выполняют другую операцию. 72169016911692167290

Префикс меняет 90 местами X и Y в следующей инструкции. В таблице ниже эти варианты объединены в одну строку путем записи «X / Y», что означает «X» или «Y». Префикс 90 также используется в двух местах для введения новых кодов операций: инструкции BCPL и BCCM и некоторые условия перехода.

Префикс 92 преобразует инструкции с операндом смещения ( addr16 , X) в косвенную адресацию ([ addr8 ], X). Смещение заменяется 8-битным адресом 16-битного значения смещения в памяти. Он используется только для этой функции.

Префикс 91 имеет оба предыдущих эффекта, преобразовывая ( addr16 , X) режимы адресации в ([ addr8 ], Y).

Префикс 72 используется в нескольких местах гораздо менее регулярным образом. В некоторых случаях он вводит новые режимы адресации (особенно ([ addr16 ], X) непрямой 16-битный режим), но также вводит много совершенно новых операций.

Набор инструкций STM8
Приставка 7 6 5 4 3 2 1 0 Операнды Мнемонический Описание
- 0 0 0 0 код операции адрес 8 OP ( адрес 8 , SP) Инструкции с одним операндом (см. Ниже)
- 0 0 0 1 код операции адрес 8 OP A, ( адрес 8 , SP) Двухоперандные инструкции со стековым операндом
- 0 0 0 1 0 0 0 0 адрес 8 SUB A, ( адрес 8 , SP) A: = A - операнд
- 0 0 0 1 0 0 0 1 адрес 8 CP A, ( адрес 8 , SP) Сравнить A - операнд
- 0 0 0 1 0 0 1 0 адрес 8 SBC A, ( адрес 8 , SP) A: = A - операнд - C вычесть с заимствованием
- / 90 0 0 0 1 0 0 1 1 адрес 8 CPW X / Y, ( адрес 8 , SP) Сравнить X / Y - операнд (16 бит)
- 0 0 0 1 0 1 0 0 адрес 8 И А, ( адрес 8 , SP) A: = A & операнд, побитовое и
- 0 0 0 1 0 1 0 1 адрес 8 BCP A, ( адрес 8 , SP) Побитовый тест A и операнд
- 0 0 0 1 0 1 1 0 адрес 8 LDW Y, ( адрес 8 , SP) Y: = операнд ( LD A, ( addr8 , SP) назначен коду операции 7B)
- 0 0 0 1 0 1 1 1 адрес 8 LDW ( адрес 8 , SP), Y Операнд: = Y ( LD ( addr8 , SP), A назначен коду операции 6B)
- 0 0 0 1 1 0 0 0 адрес 8 XOR A, ( адрес 8 , SP) A: = A ^ операнд, исключающее ИЛИ
- 0 0 0 1 1 0 0 1 адрес 8 АЦП A, ( адрес 8 , SP) A: = A + операнд + C, сложить с переносом
- 0 0 0 1 1 0 1 0 адрес 8 ИЛИ A, ( адрес 8 , SP) A: = A | операнд, включительно или
- 0 0 0 1 1 0 1 1 адрес 8 ДОБАВИТЬ A, ( адрес8 , SP) A: = A + операнд
- 0 0 0 1 1 1 0 0 imm16 ДОБАВИТЬ X, # imm16 X: = X + немедленно (= JP ( адрес 8 , SP) )
- 0 0 0 1 1 1 0 1 imm16 SUBW X, # imm16 X: = X - немедленно (= CALL ( addr8 , SP) )
- 0 0 0 1 1 1 1 0 адрес 8 LDW X, ( адрес 8 , SP) 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  addr16 , # бит , метка Перейти к ПК + soff8, если исходный бит истинен (установлен)
72 0 0 0 0 немного 1 адрес16 soff8 BTJF  addr16 , # бит , метка Перейти к ПК + soff8, если исходный бит ложный (очистить)
72 0 0 0 1 немного 0 адрес16 BSET addr16 , # бит Установить указанный бит в 1
72 0 0 0 1 немного 1 адрес16 BRES адрес16 , # бит Сбросить (сбросить) указанный бит на 0
90 0 0 0 1 немного 0 адрес16 BCPL addr16 , # бит Дополнить (переключить) выбранный бит
90 0 0 0 1 немного 1 адрес16 BCCM addr16 , # бит Запись флага переноса в бит памяти
- / 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 , SP) Относительный указатель стека
- 0 0 1 1 код операции адрес 8 OP addr8 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 ], X) 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 операнд SWAP- операнд Поменять местами половины операнда (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 POP- адрес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 addr16 , # 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 PUSH addr16 Вставить в стек
- 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 , SP), A Хранить относительно стека
- 0 1 1 1 1 0 1 1 адрес 8 LD A, ( адрес 8 , SP) Загрузить относительно стека
- 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 plus 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 , SP) Операнд относительно стека (см. Выше; коды операций 16, 17, 1C, 1D не соответствуют шаблону)
- 1 0 1 0 код операции imm8 OP # imm8 8-битный непосредственный операнд (запрещен как место назначения)
- 1 0 1 1 код операции адрес 8 OP addr8 8-битный абсолютный адрес (запрещен для перехода / вызова)
- 1 1 0 0 код операции адрес16 OP addr16 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 ], X) 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 Операнд: = A (режим 2 LD # imm8, A переназначен, см. Ниже)
приставка 1 Режим 1 0 0 0 операнд XOR A, операнд A: = A ^ операнд, исключающее ИЛИ
приставка 1 Режим 1 0 0 1 операнд АЦП A, операнд A: = A + операнд + C, сложить с переносом
приставка 1 Режим 1 0 1 0 операнд ИЛИ A, операнд A: = A | операнд, включительно или
приставка 1 Режим 1 0 1 1 операнд ADD A, операнд A: = A + операнд
приставка 1 Режим 1 1 0 0 операнд JP- операнд Младшие 16 бит PC: = операнд, безусловный переход (режимы 2 JP # imm8 и 3 JP addr8 переназначены, см. Ниже)
приставка 1 Режим 1 1 0 1 операнд CALL операнд Нажмите 16-битный ПК, младшие 16 бит ПК: = операнд ( переназначены режимы 2 CALL # imm8 и 3 CALL addr8 , см. Ниже)
приставка 1 Режим 1 1 1 0 операнд LDW X / Y, операнд Загрузить X / Y: = операнд; используйте 16 вместо 90 1E для LDW Y, ( адрес 8 , SP)
приставка 1 Режим 1 1 1 1 операнд Операнд LDW , X / Y Операнд: = X / Y (16 бит, режим 2 LD # imm8, X переназначен, см. Ниже); сохранить Y / X, если режим операнда проиндексирован X / Y (коды операций DF, EF, FF); используйте 17 вместо 90 1F для LDW ( адрес 8 , SP), Y
Приставка 1 Режим код операции операнд Переназначенные коды операций A7, AC, BC, AD, BD, AF из диапазона с двумя операндами
- / 90 1 0 1 0 0 1 1 1 адрес24 LDF ( адрес 24 , X / Y), A Загрузить далеко (= LD # imm8, A )
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 ПК: = addr24 (= JP # imm8 )
92 1 0 1 0 1 1 0 0 адрес16 JPF [ адрес16 ] Косвенный дальний прыжок; адрес 24-битный указатель
- 1 0 1 1 1 1 0 0 адрес24 LDF A, адрес 24 Загрузить далеко (= JP addr8 )
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-битный ПК, ПК: = ПК + операнд (= CALL # imm8 )
- 1 0 1 1 1 1 0 1 адрес24 LDF адрес24 , A Операнд: = A (= CALL addr8 )
92 1 0 1 1 1 1 0 1 адрес16 LDF [ адрес16 ], A Операнд: = A, 16-битный адрес 24-битного указателя
- / 90 1 0 1 0 1 1 1 1 адрес24 LDF A, ( адрес 24 , X / Y) Загрузить далеко (= LDW # imm8, X )
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 , SP) Относительный стек
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 операнд ADDW Y, операнд Y: = Y + операнд
72 1 Режим 1 0 1 1 операнд ADDW X, операнд X: = X + операнд (предпочитайте код операции 1C для ADDW X, # imm16 )

Для инструкций CPW и LDW, в которых режим адресации операндов индексируется X, STM8 по умолчанию использует регистр Y вместо X. Применение 90 префикса меняет местами X и Y, так что регистр X, а режим адресации индексируется Y.

Рекомендации

внешние ссылки