Система команд 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.
|