4927 subscribers

Микроконтроллеры для начинающих. Часть 16. Команды пересылки данных STM8

473 full reads
823 story viewsUnique page visitors
473 read the story to the endThat's 57% of the total page views
1,5 minute — average reading time

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

Префиксы

Прежде всего я еще раз коснусь префиксов, которые уже упоминал ранее. Байт префикса предшествует команде и модифицирует ее работу. Всего существует 4 различных префикса;

PDY - заменяет использование регистра X на использование регистра Y при выполнении команды с непосредственным, прямым, косвенным режимом адресации.

PIX - заменяет режимы прямой адресации, прямой адресации бита, относительной адресации, на соответствующие режимы косвенной адресации. Так же, заменяет режим индексной адресации с использование регистра X на режим косвенной индексной адресации с использованием регистра X.

PIY - заменяет использование регистра X на использование регистра Y при выполнении команды с косвенной индексной адресацией.

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

В большинстве случаев вам не потребуется задавать префикс вручную. Ассемблер проанализирует форму команды, которую вы использовали и самостоятельно сформирует нужный префикс если он потребуется. Поэтому я не буду упоминать префиксы при описании команд.

Однако, следует помнить, что шина данных памяти команд STM8 позволяет передавать за один раз 4 байта. Команда состоит из кода команды (один байт) и до 3 байт с данными или адресацией. Таким образом, по шине данных памяти программ можно за один цикл передать всю команду полностью. Байт префикса нарушает эту картину, так как теперь общая длина команды с префиксом может превышать ширину шины. Это никак не повлияет на работу вашей программы, но влияет на работу конвейера. А значит, влияет и на быстродействие.

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

Общие команды пересылки

LD dst,src

Команда загрузки LD (загрузка данных из памяти в регистр) есть во многих микроконтроллерах. Однако, она обычно идет в паре с командой сохранения ST (сохранение из регистра в память). Однако, в случае STM8 команда LD обеспечивает передачу данных в обе стороны. То есть, она же является и командой сохранения.

Обратите внимание, в отличии от многих других процессоров, где команда загрузки имеет только один операнд, здесь их два. dst задает место назначения, то есть, куда данные будут записаны. src задает источник данных, то есть, откуда данные будут браться. Допустимы не все комбинации источник-приемник, а только такие

LD reg,mem

Пересылка данных из ячейки памяти в регистр. Строго говоря, только этот формат и можно назвать загрузкой. Влияет на флаги Z и N. В данном формате в качестве источника можно указать не только адрес ячейки памяти, но и непосредственные данные.

LD mem,reg

Пересылка данных из регистра в память. Во многих других процессорах этот вариант обычно называют сохранением (ST). Влияет на флаги Z и N.

LD reg,reg

Пересылка данных между двумя регистрами. Обратите внимание, что в данном формате команда не влияет на флаги!

LDF dst,src

Почти аналогична команде LD, но использует расширенный (полный адрес). Кроме того, здесь дополнительно ограничиваются варианты пар источник-приемник. Допустимы только такие форматы:

LDF A,mem

LDF mem,A

то есть, в качестве регистра может использоваться только аккумулятор. Влияет на флаги Z и N. Причем в данной команде нельзя указать непосредственные данные для загрузки в аккумулятор.

MOV dst,src

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

EXG dst,src

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

CLR dst

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

Команды пересылки 16-битных данных

Не смотря на то, что для 8-битной архитектуры STM8 такую пересылку можно выполнить не прибегая к отдельным командам, их наличие несколько упрощает программирование.

LDW dst,src

Аналогична команде LD, но оперирует сразу двумя байтами данных. Соответственно, и регистр здесь требуется указывать 16-разрядный (X, Y, SP). Обратите внимание, что как и в случае команды LD на флаги влияют только пары источник-приемник reg,mem и mem,reg.

EXGW X,Y

16-битный вариант команды EXG может обменивать только содержимое двух индексных регистров X и Y. Не влияет на флаги. Обратите внимание, что регистр SP в данном случае указать нельзя никак.

CLRW dst

16-битный вариант команды CLR. Однако, в качестве очищаемого регистра можно указать только индексные регистры X и Y. Указать регистр SP невозможно. Обнуляет флаг N и устанавливает флаг Z.

Команды работы со стеком

PUSH src

Помещает данные в стек с одновременной коррекцией указателя стека SP. В качестве источника возможно указать только аккумулятор, регистр CC (регистр флагов состояния), адрес ячейки памяти, непосредственные данные. Не влияет на флаги.

PUSHW src

Помещает в стек, с одновременной коррекцией SP, содержимое 16-битных регистров X или Y. Другой источник указать невозможно. Не влияет на флаги.

POP dst

Извлекает данные из стека, с одновременной коррекцией SP, и помещает их в указанный приемник. В качестве приемника могут быть указаны аккумулятор, регистр CC и адрес ячейки памяти. Не влияет на флаги за исключением POP CC.

POPW dst

Извлекает данные из стека, с одновременной коррекцией SP, и помещает их в 16-битные регистры X или Y. Не влияет на флаги.

Заключение

Как видно, команды пересылки в STM8 просты и, относительно, логичны. Да, они имеют свои тонкости, которые нужно помнить. Да, есть пара не совсем логичных моментов. Но, в целом, все довольно просто. И опять не потребовалось прибегать даже к простым иллюстрациям.

До новых встреч!