Система команд M68HC08
В данном разделе приведена подробная информация по всем командам семейства M68HC08. Команды расположены по алфавиту, мнемоника команд, для лучшего распознавания, выделена крупным шрифтом.
Используемые обозначения
Ниже приведены обозначения, используемые в данном разделе при описании команд .
| Операторы |
| () |
= Содержимое регистра или ячейки памяти указывается в круглых скобках |
| <-- |
= Загрузить |
| Э |
= Извлечь из стека |
| Ї |
= Занести в стек |
| & |
= Логическое AND |
| | |
= Логическое OR |
| x |
= Перемножить |
| ё |
= Разделить |
| : |
= Связать в цепочку |
| + |
= Сложить |
| - |
= Инвертировать (выполнить дополнение до двух) |
| " |
= Расширение символа |
| |
| Регистры CPU |
| A |
= Аккумулятор |
| CCR |
= Регистр кодов признаков |
| H |
= Индексный регистр, старшие 8 разрядов (старший байт) |
| X |
= Индексный регистр, младшие 8 разрядов (младший байт) |
| PC |
= Счетчик команд |
| PCH |
= Счетчик команд, старшие 8 разрядов (старший байт) |
| PCL |
= Счетчик команд, младшие 8 разрядов (младший байт) |
| SP |
= Указатель стека |
| |
| Память и адресация |
| M |
= Ячейка памяти или абсолютные данные, в зависимости от режима адресации |
| rel |
= Относительное смещение (т.е. дополнение до двух числа, находящегося в последнем байте машинного кода, связанного с командой перехода |
| |
| Биты регистра кодов признаков (CCR) |
| V |
= Указатель переполнения дополнения до двух, бит 7 |
| H |
= Полуперенос, бит 4 |
| I |
= Маска прерывания, бит 3 |
| N |
= Указатель отрицательного значения, бит 2 |
| Z |
= Указатель нулевого значения, бит 1 |
| C |
= Перенос/заем, бит 0 |
| |
| Состояния битов ПЕРЕД выполнением команды (n = 7, 6, 5, ... 0) |
| Mn |
= Бит n ячейки памяти, используемый при операции |
| An |
= Бит n аккумулятора |
| Hn |
= Бит n индексного регистра H |
| Xn |
= Бит n индексного регистра X |
| |
| Состояния битов ПОСЛЕ выполнением команды |
| - |
= Над битом действия не производились |
| 0 |
= Бит переведен в состояние 0 |
| 1 |
= Бит переведен в состояние 1 |
| b |
= бит установлен или очищен, в зависимости от результата операции |
| |
| Представление машинных кодов |
| dd |
= Младшие 8 битов (младший байт) прямого адреса $0000-$00FF (старший байт в состоянии $00) |
| ee |
= Старшие 8 битов (старший байт) 16-разрядного смещения |
| ff |
= Младшие 8 битов (младший байт) 16-разрядного или 8-разрядного смещения |
| ii |
= Один байт непосредственных данных |
| hh |
= Старший байт 16-разрядного расширенного адреса |
| ll |
= Младший байт 16-разрядного расширенного адреса |
| rr |
= Относительное смещение |
| |
| Представление исходных форм |
| opr |
= Операнд (один или два байта, в зависимости от режима адресации) |
| rel |
= Относительное смещение, используемое в командах переходов и манипулирования битами |
| |
| Режимы адресации |
| INH |
= Неявный (без операнда) |
| IMM |
= 8-разрядный непосредственный |
| DIR |
= 8-разрядный прямой |
| EXT |
= 16-разрядный расширенный |
| IX |
= 16-разрядный индексный без смещения |
| IX+ |
= 16-разрядный индексный без смещения с постинкрементом |
| IX1 |
= 16-разрядный индексный с 8-разрядным смещением |
| IX1+ |
= 16-разрядный индексный с 8-разрядным смещением с постинкрементом |
| IX2 |
= 16-разрядный индексный с 16-разрядным смещением |
| REL |
= Относительный с 8-разрядным смещением |
| DD |
= Прямого источника в прямой пункт назначения |
| IMD |
= Непосредственного в прямой |
| IX+D |
= 16-разрядного индексированного, с постинкрементом, источника в прямой пункт назначения |
| DIX+ |
= Прямого источника в 16-разрядный индексированный, с постинкрементом, пункт назначения |
| SP1 |
= По указателю стека с 8-разрядным смещением |
| SP2 |
= По указателю стека с 16-разрядным смещением |
Соглашения по терминологии
- Установить - относится к установке бита (битов) в логическое состояние 1
- Очистить - относится к установке бита (битов) в логическое состояние 0
- Бит, с предшествующим символом, например символом A - относится к числовому значению бита и мнемоники. A7 является битом 7 аккумулятора A. Диапазон битов, с предшествующим символом, например символом A - относится к числовым значениям диапазона битов и мнемонике. A [7:4] являются битами аккумулятора с 7 по 4.
- Круглые скобки ( ) -отмечают содержимое регистра или ячейки памяти. (A) является содержимым аккумулятора
- LSB - младший бит или биты
- MSB - старший бит или биты. Относится к старшим и младшим байтам, упомянутым выше
Сводная таблица команд
| Мнемоника |
Функция |
Операция |
Флаги |
Пример применения |
| ADC |
Сложить с переносом (Add with Carry) |
A <-- (A) + (M) + (C) |
V, H, N, Z, C |
|
| ADD |
Сложить без переноса (Add without Carry) |
A <-- (A) + (M) |
V, H, N, Z, C |
|
| AIS |
Сложить непосредственное значение, со знаком, с указателем стека |
SP <-- (SP) + (16 " M) |
|
Пример кодов с использованием команды AIS* |
| AIX |
Сложить непосредственное значение, со знаком, с индексным регистром |
HX <-- (HX) + (16 " M) |
|
Пример кодов с использованием команды AIX* |
| AND |
Выполнить логическое AND |
A <-- (A) & (M) |
V, N, Z |
|
| ASL |
Арифметически сдвинуть влево |
|
V, N, Z, C |
|
| ASR |
Арифметически сдвинуть вправо |
|
V, N, Z, C |
|
| BCC |
Перейти, если бит переноса очищен |
PC <-- (PC) + $0002 + rel, если (C) = 0 |
|
|
| BCLR n |
Очистить в памяти бит n |
Mn <-- 0 |
|
|
| BCS |
Перейти, если бит переноса установлен |
PC <-- (PC) + $0002 + rel, если (C) = 1 |
|
|
| BEQ |
Перейти, если равно |
PC <-- (PC) + $0002 + rel, если (Z) = 1 |
|
|
| BGE |
Перейти, если больше или равно операнду со знаком |
PC <-- (PC) + $0002 + rel, если (N Е V) = 0, т.е., если (A) і (M), являющиеся дополнениями до двух со знаком |
|
Пример кодов с использованием команды BGE* |
| BGT |
Перейти, если больше чем операнд со знаком |
PC <-- (PC) + $0002 + rel, если (N Е V) = 0, т.е., если (A) > (M), являющиеся дополнениями до двух со знаком |
|
Пример кодов с использованием команды BGT* |
| BHCC |
Перейти, если бит полупереноса очищен |
PC <-- (PC) + $0002 + rel, если (H) = 0 |
|
|
| BHCS |
Перейти, если бит полупереноса установлен |
PC <-- (PC) + $0002 + rel, если (H) = 1 |
|
|
| BHI |
Перейти, если больше |
PC <-- (PC) + $0002 + rel, если C | (Z) = 0 т.е., если (A) > (M), являющиеся двоичными числами без знака |
|
|
| BHS |
Перейти, если больше или равно |
PC <-- (PC) + $0002 + rel, если (C) = 0 т.е., если (A) і (M), являющиеся двоичными числами без знака |
|
|
| BIH |
Перейти, если линия прерывания на высоком уровне |
____
PC <-- (PC) + $0002 + rel, если IRQ1 = 1 |
|
|
| BIL |
Перейти, если линия прерывания на низком уровне |
____
PC <-- (PC) + $0002 + rel, если IRQ1 = 0 |
|
|
| BIT |
Тестировать бит |
(A) & (M) |
V, N, Z |
|
| BLE |
Перейти, если меньше или равно операнду со знаком |
PC <-- (PC) + $0002 + rel, если если Z | (N Е V) = 1 т.е., если (A) Ј (M), являющиеся дополнениями до двух со знаком |
|
Пример кодов с использованием команды BLE* |
| BLO |
Перейти, если меньше |
PC <-- (PC) + $0002 + rel, если (C) = 1 т.е., если (A) < (M), являющиеся двоичными числами без знака |
|
|
| BLS |
Перейти, если меньше или равно |
PC <-- (PC) + $0002 + rel, если C | (Z) = 1 т.е., если (A) Ј (M), являющиеся двоичными числами без знака |
|
|
| BLT |
Перейти, если меньше операнда со знаком |
PC <-- (PC) + $0002 + rel, если (N Е V) = 1 т.е., если (A) < (M), являющиеся дополнениями до двух со знаком |
|
Пример кодов с использованием команды BLT* |
| BMC |
Перейти, если маска прерывания очищена |
PC <-- (PC) + $0002 + rel, если (I) = 0 |
|
|
| BMI |
Перейти, если минус |
PC <-- (PC) + $0002 + rel, если (N) = 1 |
|
|
| BMS |
Перейти, если маска прерывания установлена |
PC <-- (PC) + $0002 + rel, если (I) = 1 |
|
|
| BNE |
Перейти, если не равно |
PC <-- (PC) + $0002 + rel, если (Z) = 0 |
|
|
| BPL |
Перейти, если положительный |
PC <-- (PC) + $0002 + rel, если (N) = 0 |
|
|
| BRA |
Переходить всегда |
PC <-- (PC) + $0002 + rel |
|
|
| BRCLR n |
Перейти, если бит n памяти очищен |
PC <-- (PC) + $0002 + rel, если бит n в M = 0 |
|
|
| BRN |
Не переходить никогда |
PC <-- (PC) + $0002 |
|
|
| BRSET n |
Перейти, если бит n памяти установлен |
PC <-- (PC) + $0002 + rel, если бит n в M = 1 |
|
|
| BSET n |
Установить бит n памяти |
Mn <-- 1 |
|
|
| BSR |
Перейти в подпрограмму |
| PC <-- (PC) + $0002 |
Организация в PC адреса возврата |
| Ї(PCL); SP <-- (SP) - $0001 |
Занесение в стек младшей половины адреса возврата |
| Ї(PCH); SP <-- (SP) - $0001 |
Занесение в стек старшей половины адреса возврата |
| PC <-- (PC) + rel |
Загрузка в PC стартового адреса требуемой подпрограммы |
|
|
|
| CBEQ |
Сравнить и перейти если равно |
| (A) - (M); PC <-- (PC) + $0003 + rel |
Если результат равен $00 |
| или: для режима IX+: (A) - (M); PC <-- (PC) + $0002 + rel |
Если результат равен $00 |
| или: для режима SP1: (A) - (M); PC <-- (PC) + $0004 + rel |
Если результат равен $00 |
| или: для режима CBEQX: (X) - (M); PC <-- (PC) + $0003 + rel |
Если результат равен $00 |
|
|
Пример кодов команды CBEQ* Пример кодов команды CBEQA* Пример кодов команды CBEQX* |
| CLC |
Очистить бит переноса |
Бит C <-- 0 |
C |
|
| CLI |
Очистить бит маски прерывания |
Бит I <-- 0 |
|
|
| CLR |
Очистить |
A <-- $00 или: M <-- $00 или: X <-- $00 или: H <-- $00 |
V, N, Z |
Пример кодов с использованием команды CLRH* |
| CMP |
Сравнить аккумулятор с памятью |
(A) - (M) |
V, N, Z, C |
|
| COM |
Выполнить дополнение до единицы |
A <-- A# = $FF - (A) или: X <-- X# = $FF - (X) или: M <-- M# = $FF - (M) |
V, N, Z, C |
|
| CPHX |
Сравнить индексный регистр с памятью |
(H:X) - (M:M + $0001) |
V, N, Z, C |
Пример кодов с использованием команды CPHX* |
| CPX |
Сравнить младший байт индексного регистра с памятью |
(X) - (M) |
V, N, Z, C |
|
| DAA |
Выполнить десятичную коррекцию аккумулятора |
(A)10 |
V, N, Z, C |
Пример кодов с использованием команды DAA* |
| DBNZ |
Декрементировать и перейти, если не ноль |
| A <-- (A) - $0001 или: M <-- (M) - $01 или: X <-- (X) -$0001 |
| PC <-- (PC) + $0003 + rel |
если (результат) № 0, при прямом DBNZ, IX1 |
| PC <-- (PC) + $0002 + rel |
если (результат) № 0, при DBNZA, DBNZX или IX |
| PC <-- (PC) + $0004 + rel |
если (результат) № 0, при DBNZA, DBNZ SP1 |
|
|
Пример кодов с использованием команды DBNZ* |
| DEC |
Декрементировать |
A <-- (A) - $01 или: X <-- (X) - $01 или: M <-- (M) - $01 |
V, N, Z |
|
| DIV |
Разделить |
A <-- (H:A) ё (X) H <-- Остаток |
Z, C |
Пример кодов с использованием команды DIV* |
| EOR |
Выполнить исключающее OR памяти с аккумулятором |
A (A Е (M) |
V, N, Z |
|
| INC |
Инкрементировать |
A <-- (A) + $01 или: X <-- (X) + $01 или: M <-- (M) + $01 |
V, N, Z |
|
| JMP |
Выполнить переход |
PC <-- Действительный адрес |
|
|
| JSR |
Выполнить переход в подпрограмму |
| PC <-- (PC) + n |
n = 1, 2 или 3, в зависимости от режима адресации |
| Ї(PCL); SP <-- (SP) - $0001 |
Занесение в стек младшей половины адреса возврата |
| Ї(PCH); SP <-- (SP) - $0001 |
Занесение в стек старшей половины адреса возврата |
| PC <-- Действительный адрес |
Загрузка в PC стартового адреса требуемой подпрограммы |
|
|
|
| LDA |
Загрузить аккумулятор из памяти |
A <-- (M) |
V, N, Z |
|
| LDHX |
Загрузить индексный регистр из памяти |
H:X <--(M:M + $0001) |
V, N, Z |
|
| LDX |
Загрузить младший байт индексного регистра из памяти |
X <-- (M) |
V, N, Z |
|
| LSL |
Логически сдвинуть влево |
|
V, N, Z, C |
|
| LSR |
Логически сдвинуть вправо |
|
V,N, Z, C |
|
| MOV |
Переместить |
(M)назначение <-- (M)источник |
V, N, Z |
Пример кодов с использованием команды MOV* |
| MUL |
Перемножить без знака |
(X:A <-- (X) x (A) |
H, C |
|
| NEG |
Инвертировать |
A <-- -(A) = $00 - (A) или: X <-- = $00 - (X) или: M <-- = $00 - (M) |
V, N, Z, C |
|
| NOP |
Пустая операция |
Не производится |
|
|
| NSA |
Поменять местами нибблы аккумулятора |
A <-- (A[3:0]:A[7:4]) |
|
Пример кодов с использованием команды NSA* |
| ORA |
Выполнить включающее OR аккумулятора и памяти |
A <-- (A)|(M) |
V, N, Z |
|
| PSHA |
Занести аккумулятор в стек |
Ї (A), SP <-- (SP) - $0001 |
|
Пример кодов с использованием команды PSHA* |
| PSHH |
Занести старший байт индексного регистра в стек |
Ї (H), SP <-- (SP) - $0001 |
|
Пример кодов с использованием команды PSHH* |
| PSHX |
Занести младший байт индексного регистра в стек |
Ї (X), SP <-- (SP) - $0001 |
|
Пример кодов с использованием команды PSHX* |
| PULA |
Загрузить аккумулятор из стека |
SP <-- (SP + $0001); Э(A) |
|
Пример кодов с использованием команды PULA* |
| PULH |
Извлечь старший байт индексного регистра из стека |
SP <-- (SP + $0001); Э(H) |
|
Пример кодов с использованием команды PULH* |
| PULX |
Извлечь младший байт индексного регистра из стека |
SP <-- (SP + $0001); Э(X) |
|
Пример кодов с использованием команды PULX* |
| ROL |
Вращать влево через перенос |
|
V, N, Z, C |
|
| ROR |
Вращать вправо через перенос |
|
V, N, Z, C |
|
| RSP |
Сбросить указатель стека |
SP <-- $FF |
|
|
| RTI |
Вернуться из прерывания |
| SP <-- SP + $0001; Э CCR |
Извлечение CCR из стека |
| SP <-- SP + $0001; Э A |
Извлечение A из стека |
| SP <-- SP + $0001; Э X |
Извлечение X из стека |
| SP <-- SP + $0001; Э PCH |
Извлечение PCH из стека |
| SP <-- SP + $0001; Э PCL |
Извлечение PCL из стека |
|
V, H, I, N, Z, C |
|
| RTS |
Вернуться из подпрограммы |
| SP <-- SP + $0001; Э PCH |
Извлечение PCH из стека |
| SP <-- SP + $0001; Э PCL |
Извлечение PCL из стека |
|
|
|
| SBC |
Вычесть с переносом |
A <-- (A) - (M) - (C) |
V, N, Z, C |
|
| SEC |
Установить бит переноса |
Бит C <-- 1 |
C |
|
| SEI |
Установить бит маски прерывания |
Бит I <-- 1 |
I |
|
| STA |
Сохранить аккумулятор в памяти |
M <-- (A) |
V, N, Z |
|
| STHX |
Сохранить индексный регистр |
(M:M + $0001) <-- (H:X) |
V, N, Z |
Пример кодов с использованием команды STHX* |
| STOP |
Разрешить вывод IRQ#, остановить генератор |
Бит I <-- 0; останавливается генератор |
I |
|
| STX |
Сохранить X (младший байт индексного регистра) в памяти |
M <-- (X) |
V, N, Z |
|
| SUB |
Вычесть |
A <-- (A) - (M) |
V, N, Z, C |
|
| SWI |
Выполнить программное прерывание |
| PC <- (PC) + $0001 |
Организация в PC адреса возврата |
| Ї(PCL); SP <- (SP) - $0001 |
Занесение в стек младшей половины адреса возврата |
| Ї(PCH); SP <- (SP) - $0001 |
Занесение в стек старшей половины адреса возврата |
| Ї(X); SP <- (SP) - $0001 |
Занесение индексного регистра в стек |
| Ї(A); SP <- (SP) - $0001 |
Занесение аккумулятора (A) в стек |
| Ї(CCR); SP <- (SP) - $0001 |
Занесение регистра кодов признаков (CCR) в стек |
| Бит I <- 1 |
Маскирование дальнейших прерываний |
| PCH <- ($FFFC) |
Выборка вектора |
| PCH ($FFFD) |
|
|
I |
|
| TAP |
Переслать аккумулятор в регистр кодов признаков |
CCR <-- (A) |
V, H, I, N, Z, C |
Пример кодов с использованием команды TAP* |
| TAX |
Переслать аккумулятор вX (младший байт индексного регистра) |
X <-- (A) |
|
|
| TPA |
Переслать регистр кодов признаков в аккумулятор |
A <-- (CCR) |
|
Пример кодов с использованием команды TPA* |
| TST |
Проверить на отрицательное значение или ноль |
(A) - $00 или: (X) - $00 или: (M) - $00 |
V, N, Z |
|
| TSX |
Переслать указатель стека в индексный регистр |
H:X <-- (SP) + $0001 |
|
Пример кодов с использованием команды TSX* |
| TXA |
Переслать X (младший байт индексного регистра) в аккумулятор |
A <-- X |
|
|
| TXS |
Переслать индексный регистр в указатель стека |
SP <-- (H:X) - $0001 |
|
Пример кодов с использованием команды TXS* |
| WAIT |
Разрешить прерывания; остановить процессор |
Бит I <-- 0; запрещается тактирование CPU до поступления сигнала прерывания |
|
|
* - Новые команды с использованием примеров, входящие в систему команд микроконтроллеров M68HC08 и отсутствующие в системе команд микроконтроллеров M68HC05.
|