Система команд CPU32
Процессор CPU32 выполняет набор из 139 команд, которые реализуют следующие группы операций:
- операции пересылки,
- арифметические операции,
- логические операции,
- операции сдвига,
- операции сравнения и тестирования,
- битовые операции,
- операции управления;
- операции условной установки байтов.
В данном разделе дается описание команд и форма их записи на языке ассемблера. Общий
список команд и их символические обозначения (мнемокоды) приведены в табл.3.2. Символом * отмечены привилегированные команды,
выполняемые только в режиме супервизора. Попытка их выполнения в режиме пользователя вызывает прерывание выполнения программы (см.
раздел Модуль таймерного процессора TPU).
Таблица 3.2. Набор команд процессора CPU32
Мнемокод |
Выполняемая операция |
ABCD |
Сложение двоично-десятичных чисел |
ADD |
Сложение двоичных чисел |
ADDA |
Сложение с содержимым регистра адреса |
ADDI |
Сложение с непосредственным операндом |
ADDQ |
Сложение с 3-разрядным (коротким) непосредственным операндом |
ADDX |
Cложение с учетом переноса |
AND |
Логическая операция "И" |
ANDI |
Логическая операция "И" с непосредственным операндом |
ANDI to CCR |
Операция "И" непосредственного операнда и содержимого CCR |
*ANDI to SR |
Операция "И" непосредственного операнда и содержимого SR |
ASL |
Арифметический сдвиг влево |
ASR |
Арифметический сдвиг вправо |
Всс |
Условное ветвление (cc - условие ветвления) |
BCHG |
Тестирование бита и установка его в "0" |
BGND |
Перевод процессора в режим отладки BDM |
BRA |
Безусловное ветвление |
BSET |
Тестирование бита и установка его в "1" |
BSR |
Вызов подпрограммы |
BTST |
Тестирование бита |
CHK |
Проверка операнда на попадание в заданный диапазон |
CHK2 |
Проверка операнда на попадание в заданные границы |
CLK |
Установка нулевого значения операнда |
CMP |
Сравнение операндов |
CMPA |
Сравнение с содержимым регистра адреса |
CMPI |
Сравнение с непосредственным операндом |
CMPM |
Сравнение операндов из массива данных |
CMP2 |
Установка признаков при попадании операнда в заданный диапазон |
DBcc |
Организация циклов с условным выходом (cc - условие выхода) |
DIVS, DIVSL |
Деление операндов со знаком |
DIVU, DIVul |
Деление операндов без знака |
EOR |
Логическая операция Исключающее ИЛИ |
EORI |
Операция Исключающее ИЛИ с непосредственным операндом |
EORI to CCR |
Операция Исключающее ИЛИ с содержимым CCR |
*EORI to SR |
Операция Исключающее ИЛИ с содержимым SR |
EXG |
Обмен содержимым регистров |
EXT |
Расширение знака операнда |
ILLEGAL |
Прерывание при неправильном коде команды |
JMP |
Безусловный переход |
JSR |
Переход к подпрограмме |
LEA |
Загрузка в регистр эффективного адреса EA |
LINK |
Организация связи стеков |
*LPSTOP |
Останов с переводом в энергосберегающий режим |
LSL |
Логический сдвиг влево |
LSR |
Логический сдвиг вправо |
MOVE |
Пересылка операндов |
MOVEA |
Пересылка содержимого регистра адреса |
MOVE from CCR |
Пересылка содержимого CCR в память или регистр |
*MOVE from SR |
Пересылка содержимого SR в память или регистр |
MOVE to CCR |
Загрузка содержимого CCR из памяти или регистра |
*MOVE to SR |
Загрузка содержимого SR из памяти или регистра |
*MOVE USP |
Пересылка содержимого USP |
*MOVEC |
Пересылка содержимого регистров USP,VBR,SFC или DFC |
MOVEM |
Пересылка содержимого группы регистров адреса или данных |
MOVEP |
Побайтная пересылка |
MOVEQ |
Пересылка непосредственного короткого операнда (не более 8 бит) |
*MOVES |
Пересылка с выдачей кода адресного пространства из SFC или DFC |
MULS |
Умножение операндов со знаком |
MULU |
Умножение операндов без знака |
NBCD |
Изменение знака двоично-десятичного числа |
NEG |
Изменение знака двоичного числа |
NEGX |
Изменение знака с учетом признака X |
NOP |
Отсутствие операции |
NOT |
Логическая операция НЕ |
OR |
Логическая операция ИЛИ |
ORI |
Логическая операция ИЛИ с непосредственным операндом |
ORI to CCR |
Операция ИЛИ с непосредственным операндом и содержимым CCR |
*ORI to SR |
Операция ИЛИ с непосредственным операндом и содержимым |
PEA |
Загрузка в стек эффективного адреса EA |
*RESET |
Установка начального состояния |
ROL |
Циклический сдвиг влево |
ROR |
Циклический сдвиг вправо |
ROXL |
Циклический сдвиг влево с расширением |
ROXR |
Циклический сдвиг вправо с расширением |
RTD |
Загрузка PC из стека с резервированием ячеек стека |
*RTE |
Возврат из подпрограммы обслуживания прерываний |
RTS |
Возврат из подпрограммы |
RTR |
Возврат из подпрограммы с восстановлением признаков |
SBCD |
Вычитание двоично-десятичных чисел |
Scc |
Условная установка байта (cc - условие установки) |
*STOP |
Останов выполнения программы |
SUB |
Вычитание двоичных чисел |
SUBA |
Вычитание с содержимым регистра адреса |
SUBI |
Вычитание с непосредственным операндом |
SUBQ |
Вычитание 3-разрядного (короткого) непосредственного операнда |
SUBX |
Вычитание с учетом заема |
SWAP |
Перестановка байтов в слове |
TAS |
Тестирование операнда с установкой в І1І его старшего разряда |
TBLS, TBLSN |
Табличная интерполяция для чисел со знаком |
TBLU, TBLUN |
Табличная интерполяция для чисел без знака |
TRAP |
Программное прерывание |
TRAPcc |
Условное программное прерывание (cc - код условия) |
TRAPV |
Прерывание при переполнении |
TST |
Тестирование операнда |
UNLK |
Операция, обратная LINK |
В общем виде запись типовой двухадресной команды на языке ассемблера имеет следующий вид:
COP.x <src>, <dst>
где в качестве COP указывается мнемокод соответствующей команды (табл.3.2), а вместо x ставится символ, определяющий разрядность
операндов: B - байт, W - слово, L - длинное слово. Если после мнемокода отсутствует символ разрядности, то по умолчанию операндом
служит слово.
Операнды условно обозначаются как <src> - источник, <dst> - приемник, причем в качестве приемника
указывается операнд, на месте которого помещается результат операции. При записи конкретных команд в качестве <src>,
<dst> указываются символические адреса операндов на языке ассемблера в соответствии с используемым способом их адресации
( табл.3.1). Для одноадресных команд в поле операндов дается один символический адрес, в безадресных командах адрес операнда в
явном виде не задается. При непосредственной адресации вместо указывается значение операнда Im, перед которым ставится
префиксный символ #.
Числа Im, d8, d16, bd, Abs.W, Abs.L в поле операндов могут даваться в различных системах счисления,
которые определяются префиксным символом:
& - десятичное число,
% - двоичное число,
@ - восьмеричное число,
$ - шестнадцатиричное число.
При отсутствии префиксного символа число воспринимается как десятичное.
С целью повышения производительности в CPU32 организован трехступенчатый конвейер выполняемых команд.
Контроль состояния конвейера обеспечивается с помощью выходных сигналов процессора:
IPIPE# - принимает значение 0 в первом такте выполнения каждой команды в конвейере;
IFETCH# - принимает значение 0 при загрузке очередной команды в конвейер, а также при освобождении
конвейера (отсутствии команд).
Данные сигналы могут использоваться внешним анализатором для контроля текущего состояния процессора.
Ниже в этом разделе рассматриваются команды, выполняемые процессором CPU32. В таблицах для каждой команды
дан ее синтаксис на языке ассемблера и указана разрядность операндов: фиксированная (указывается числом) или изменяемая (определяется
символом B,W,L, который ставится после мнемокода команды). Операнды, адрес которых вычисляется в соответствии с заданным способом
адресации, обозначены символами <EA>. При выполнении многих команд для вычисления EA можно использовать только определенные
способы адресации. В этих случаях для операндов , в таблицах даны номера разрешенных способов адресации, соответствующие
их нумерации в табл.3.1.
Команды пересылки (табл.3.3 ). Основной в этой группе является команда MOVE, которая допускает
использование любых способов для адресации операнда-источника и большинства способов для адресации операнда-приемника
<dst>. Имеется ряд вариантов этой команды.
Таблица 3.3. Команды пересылки
Синтаксис ассемблера |
Разрядность |
Операция |
Адресация |
MOVE <EA>, <EA> |
MOVEA <EA>, An |
MOVEQ #Im, Dn |
MOVEP Dn, (d16, An) |
MOVEP (d16, An), Dn |
MOVEM <list>, <EA> |
MOVEM <EA>, <list> |
|
B, W, L |
W, L |
32 |
W, L |
W, L |
W, L |
W, L |
|
<src> ->t; <dst> |
<src> -> An |
Im -> Dn |
Dn -> <dst> |
<src> -> Dn |
<list> -> <dst> |
<src> > <list> |
|
(1-14), (1, 3 - 9) |
(1 - 14), 2 |
12, 1 |
1, (3, 6) |
(3, 6), 1 |
(1, 2), (3, 5-9,13) |
(3, 4, 6-11,13,14), (1, 2) |
|
MOVE <EA>, CCR |
MOVE CCR, <EA> |
MOVE <EA>, SR |
MOVE SR, <EA> |
MOVEC Rc, Rn |
MOVEC Rn, Rc |
MOVES <EA>, Rn |
MOVES Rn, ,<EA> |
MOVE USP, An |
MOVE An, USP |
|
16 |
16 |
16 |
16 |
32 |
32 |
B,W,L |
B,W,L |
32 |
32 |
|
<src> -> CCR |
CCR -> <dst> |
<src> -> SR |
SR -> <dst> |
Rc -> Dn или An |
Dn или An -> Rc |
<src> -> Dn или An |
Dn или An -> <dst> |
USP -> An |
An -> USP |
|
(1, 3 - 14), - |
- , (1, 3-9, 13) |
(1, 3 - 14), - |
- , (1, 3 - 9,13) |
- , (1,2) |
(1,2), - |
(3-9,13), (1,2) |
(1,2), (3-9,13) |
- , 2 |
2, - |
|
|
|
EA -> An |
SP - 4 -> SP, EA -> (SP) |
|
(3, 6 - 11,13,14), 2 |
(3, 6 - 11,13,14) |
|
|
|
|
|
Команда MOVEA выполняет загрузку адресных регистров. При словарной разрядности в регистр
An загружается слово, адресованное EA, которое расширяется знаком до 32 разрядов. Если непосредственный операнд, загружаемый в регистр
данных, имеет не более 8 значащих разрядов (значения в диапазоне 0-255), то эту операцию рекомендуется выполнять командой MOVEQ.
Она имеет меньшую длину и время выполнения, чем команда MOVE с непосредственной адресацией, которая может загружать операнды,
имеющие до 32 разрядов. Команда MOVEP обеспечивает пересылку 16- или 32-разрядных операндов через 8-разрядные периферийные устройства.
Для этого команда реализует два или четыре цикла обмена, при которых байты операндов последовательно, начиная со старшего, поступают
на выводы D15-8 (если адрес четный) или D7-0 (если адрес нечетный).
Команда MOVEM осуществляет групповую пересылку 16- или 32-разрядных операндов между регистрами и памятью.
Состав регистров, участвующих в обмене, задается списком , в котором регистры An,Dn указываются в произвольном порядке,
разделяемые символом /. Группа соседних регистров может задаваться перечислением: Rx-Ry. Адрес EA определяет начальную ячейку
памяти и после каждого цикла пересылки изменяется на 2 или 4 в зависимости разрядности операндов. Например, команда
MOVEM.L D1/D4-D7/A3/A6, (A0)
выполнит пересылку содержимого семи регистров в память, где будут заполнены 28 байтов, начиная с адреса, заданного содержимым
регистра A0. Если используется адресация с постинкрементом, то сначала производится загрузка из памяти перечисленных регистров
данных, затем регистров адреса, начиная с регистров, имеющих меньший номер. Если используется адресация с предекрементом, то
пересылка содержимого перечисленных регистров в память производится в обратном порядке, начиная с регистра адреса, имеющего
наибольший номер. При остальных разрешенных способах адресации первая пересылка осуществляется между регистром данных с наименьшим
номером и ячейкой памяти с адресом EA. Последующие циклы обмена производятся с увеличением адреса EA на 2 или 4 и переходом к
регистрам данных, а затем адреса, с большими номерами.
Ряд модификаций команды MOVE обеспечивают обращение к регистру состояния SR и указателю стека
пользователя USP. Команды MOVE to SR, MOVE from SR выполняются только в режиме супервизора (привилегированные команды). В
режиме пользователя допускается только запись или считывание содержимого младшего байта регистра SR с помощью команд MOVE to CCR,
MOVE from CCR. Команда обращения к указателю стека пользователя MOVE USP также является привилегированной. Она выполняется в режиме
супервизора, когда операционная система производит распределение общей адресуемой памяти между задачами пользователей. Указатель
стека супервизора SSP программно недоступен во всех режимах и загружается только в процессе начальной установки состояния
процессора (см. раздел Модуль таймерного процессора TPU).
Команда MOVEC, которая является привилегированной, выполняет пересылку содержимого заданного регистра Rn
(данных Dn или адреса An) в один из управляющих регистров Rc (USP,VBR,SFC или DFC) или наоборот. Данная команда позволяет
производить загрузку управляющих регистров (например, задавать начальный адрес вершины стека пользователя или определять базовый
адрес для размещения таблицы векторов прерываний) или выбирать их текущее значение для хранения или модификации.
Команда MOVES также является привилегированной. Она выполняет пересылку содержимого регистра Rn (данных
Dn или адреса An) в ячейку памяти с адресом EA или загрузку содержимого адресованной ячейки памяти в регистр Rn. При этом на
выводы FC2-0 микроконтроллера из регистра SFC или DFC выдается 3-разрядный код, определяющий адресное пространство, в котором
размещается адресуемая ячейка:
001 - пространство данных пользователя,
010 - пространство команд пользователя,
101 - пространство данных супервизора,
110 - пространство команд супервизора.
Этот код поступает в устройство управления памятью (диспетчер памяти), которое производит обращение к соответствующему блоку
виртуальной памяти системы для записи или считывания адресованной ячейки. При записи из регистра Rn в память код адресного
пространства задается содержимым регистра DFC, при чтении из памяти в регистр Rn код задается содержимым регистра SFC. Необходимые
значения кодов пространства должны быть предварительно загружены в регистры DFC,SFC с помощью команды MOVEC.
Команды LEA и PEA производят определение адреса EA в соответствии с заданным способом адресации, и
помещают его в указанный регистр адреса An или стек, адресуемый с помощью указателя стека SP (пользователя или супервизора).
Команда EXG выполняет обмен содержимым между двумя любыми регистрами адреса или данных. Команда SWAP осуществляет перестановку
старшего B1 и младшего B0 байтов содержимого регистра данных Dn.
Команды арифметических операций и табличной интерполяции функций (табл.3.4). Основными в
этой группе являются команды сложения, вычитания, умножения и деления, которые имеют ряд вариантов. В этом же разделе рассмотрены
специфические операции табличной интерполяции функций, реализуемые процессором CPU32.
Таблица 3.4. Команды арифметических операций
Синтаксис ассемблера |
Разрядность |
Операция |
Адресация |
ADD Dn, <EA> |
ADD <EA> , Dn |
ADDA <EA>, An |
ADDI # Im, <EA> |
ADDQ # Im, <EA> |
ADDX Dy, Dx |
ADDX - (Ay),- (Ax) |
|
B, W, L |
B, W, L |
W, L |
B, W, L |
B, W, L |
B, W, L |
B, W, L |
|
<dst> + Dn -> <dst> |
Dn+ <src> - Dn |
<dst> + An -> An |
<dst> + Im -> <dst> |
<dst> + Im -> <dst> |
Dx + Dy + X -> Dx |
<dst> + <src> + X -> <dst> |
|
1, (3 - 9,13) |
(1 - 14), 1 |
(1 -14), 2 |
12, (1, 3-9,13) |
12, (1- 9,13) |
1, 1 |
5, 5 |
|
SUB Dn, <EA> |
SUB <EA>, Dn |
SUBA <EA>,An |
SUBI # Im, <EA> |
SUBQ # Im, <EA> |
SUBX Dy, Dx |
SUBX - (Ay), - (Ax) |
NEG <EA> |
NEGX <EA> |
|
B, W, L |
B, W, L |
W, L |
B, W, L |
B, W, L |
B, W, L |
B, W, L |
B, W, L |
B, W, L |
|
<dst> - Dn -> <dst> |
Dn+ <src> -> <dst> |
An- <src> -> An |
<dst> - Im -> <dst> |
<dst> - Im -> <dst> |
Dx - Dy - X -> <dst> |
<dst> - <src> - X -> <dst> |
O - <dst> -> <dst> |
O - <dst> - X -> <dst> |
|
1, (3-9, 13) |
(1 - 14), 1 |
(1 -14), 2 |
12, (1, 3 - 9,13) |
12, (1- 9,13) |
1, 1 |
5, 5 |
(1, 3 - 9,13) |
(1, 3 - 9,13) |
|
ABCD Dy, Dx |
ABCD - (Ay), - (Ax) |
SBCD Dy, Dx |
SBCD - (Ay), - (Ax) |
NBCD <EA> |
|
|
Dx + Dy + X -> Dx |
<dst> + <src> + X -> <dst> |
Dx- Dy - X -> Dx |
<dst> - <src> - X -> <dst> |
O - <dst> - X -> <dst> |
|
1, 1 |
5, 5 |
1, 2 |
5, 5 |
(1, 3 - 9,13) |
|
MULS <EA>, Dn |
MULS.L <EA>, Dh-Dl |
MULU <EA>, Dn |
MULU.L <EA>, Dh-Dl |
DIVS <EA>, Dn |
DIVS.L <EA>, Dr:Dq |
DIVSL.L <EA>, Dr:Dq |
DIVU <EA>, Dn |
DIVU.L <EA>, Dr:Dq |
DIVUL.L <EA>, Dr:Dq |
EXT Dn |
EXTB.L Dn |
|
W,L |
32 |
W,L |
32 |
W,L |
32 |
32 |
16 |
32 |
32 |
W,L |
32 |
|
Dn * <src> -> Dn |
Dn * <src> -> Dn |
Dn * <src> -> Dn |
Dl * <src> -> Dh:Dl |
Dn / <src> -> Dn |
Dr:Dq / <src> -> Dr:Dq |
Dq / <src> -> Dr:Dq |
Dn / <src> -> Dn |
Dr:Dq / <src> -> Dr:Dq |
Dq / <src> -> Dr:Dq |
(sign) (Dn) > Dn |
(sign) Bo -> Dn |
|
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
(1, 3 - 14), 1 |
1 |
1 |
|
TBLS <EA>, Dx |
TBLSN <EA>, Dx |
TBLS Dym:Dyn, Dx |
TBLSN Dym:Dyn, Dx |
|
|
Беззнаковая интерполяция таблично-заданной функции с округлением |
Беззнаковая интерполяция таблично-заданной функции без округления |
Беззнаковая интерполяция регистрово-заданной функции с округлением |
Беззнаковая интерполяция регистрово-заданной функции без округления |
|
(3,6-11,13), 1 |
(3,6-11,13), 1 |
1, 1 |
1, 1 |
|
TBLS <EA>, Dx |
TBLSN <EA>, Dx |
TBLU Dym:Dyn, Dx |
TBLUN Dym:Dyn, Dx |
|
|
Беззнаковая интерполяция таблично-заданной функции с округлением |
Беззнаковая интерполяция таблично-заданной функции без округления |
Беззнаковая интерполяция регистрово-заданной функции с округлением |
Беззнаковая интерполяция регистрово-заданной функции без округления |
|
(3,6-11,13), 1 |
(3,6-11,13), 1 |
1,1 |
1,1 |
|
CLR <EA> |
B, W, L |
0 -> <dst> |
(1, 3 - 9,13) |
Команды сложения ADD и вычитания SUB используют одинаковые способы адресации и имеют
аналогичные варианты. Команды ADDA,SUBA позволяют модифицировать содержимое адресных регистров. Команды ADDX,SUBX выполняют сложение
и вычитание содержимого регистров данных или ячеек памяти с учетом признака X, устанавливаемого при формировании переноса или заема
(табл.3.5). При обращении к памяти эти команды реализуют предекрементную адресацию, которая ускоряет обработку последовательно
размещенных массивов данных. Непосредственная адресация используется в двух вариантах команд сложения и вычитания: обычном и
быстром. Команды ADDI, SUBI реализуют обычный вариант, при котором непосредственный операнд Im может иметь до 32 разрядов. В
командах ADDQ, SUBQ реализуется быстрый вариант непосредственной адресации, при котором "короткий" 3-разрядный операнд содержится
в поле Rn первого слова команды (рис.3.3,а). При этом диапазон значений операнда очень ограничен - от 1 до 7, однако существенно
сокращается длина команды и время ее выполнения.
Команда NEG изменяет знак операнда с переводом его в дополнительный код. Такая же операция с учетом
признака X производится командой NEGX, которая используется для последовательного преобразования операндов, состоящих из нескольких
слов или двойных слов.
Команды ABCD, SBCD выполняют сложение и вычитание 8-разрядных упакованных двоично-десятичных чисел,
представляющих два десятичных разряда (числа от 0 до 99). При этом учитывается признак X, что позволяет обрабатывать многоразрядные
операнды путем последовательности данных операций. Команда NBCD изменяет знак операнда, формируя при X=0 его дополнительный код
(дополнение до10), а при X=1 - обратный код (дополнение до 9).
Операции умножения и деления выполняются над числами со знаком (команды MULS, DIVS) или без знака (команды
MULU, DIVU). Один из операндов и результат всегда размещаются в регистре данных.
При умножении 16-разрядных операндов (команды MULS.W, MULU.W) получаемый 32-разрядный результат располагается
в регистре Dn. При выполнении команд MULS.L, MULU.L умножаются 32-разрядные операнды, в регистре Dn размещаются 32 младших разряда
результата, а старшие его разряды теряются. Команды MULSL.L, MULUL.L производят умножение 32-разрядных операндов и сохранение
64-разрядного результата в двух заданных регистрах Dh (старшие 32 разряда)-Dl (младшие 32 разряда).
При делении с помощью команд DIVS, DIVU 32-разрядное содержимое регистра Dn является делимым, а делитель
может быть 16-разрядным (команды DIVS.W, DIVU.W) или 32-разрядным (команды DIVS.L, DIVU.L). В регистре Dn размещается результат:
16-разрядное частное в младших разрядах и 16-разрядный остаток в старших разрядах при выполнении команд DIVS.W, DIVU.W; 32-разрядное
частное (остаток не сохраняется) при выполнении команд DIVS.L, DIVU.L. Команды DIVS.L, DIVU.L, в которых указаны два регистра Dr:Dq
производят деление 64-разрядного числа, размещенного в этих регистрах ( в Dr - старшие разряды, в Dq - младшие разряды), на
32-разрядный делитель, адрес которого задан в команде. При этом в регистре Dq будет располагаться 32-разрядное частное, а в
регистре Dr - остаток. Команды DIVSL.L, DIVUL.L выполняют деление 32-разрядного содержимого регистра Dq на 32-разрядный делитель,
адресуемый , с размещением 32-разрядного частного в регистре Dq и 32-разрядного остатка в регистре Dr.
Команды расширения EXT, EXTB служат для преобразования байта в слово (EXT или EXT.W), слова в двойное слово
(EXT.L) или байта в двойное слово (EXTB.L). Преобразование производится путем расширения знака, то есть дублирования значения
старшего (знакового) разряда младшего байта или слова в старших разрядах слова или двойного слова. Таким образом при расширении
сохраняется знак операнда и форма его представления - прямой или дополнительный код. Команды EXT.L, EXTB.L обычно выполняются
перед делением для получения из 8- или 16-разрядного числа 32-разрядного делимого с сохранением знака. Команда очистки CLR
устанавливает нулевое значение адресуемого байта, слова или двойного слова.
Различные варианты команд интерполяции TBL позволяют определить промежуточные значения линейной функции,
заданной конечными точками на определенном отрезке. Начальное Em и конечное En значения функции выбираются из двух последовательно
расположенных ячеек памяти (табличное задание) или двух регистров данных Dym, Dyn (регистровое задание). Отрезок, на котором
определена линейная функция, делится на 256 интервалов. Разрядность значений функции задается соответствующим суффиксом B,W,L
в мнемокоде команды (после точки).
Команды TBLU,TBLS вычисляют значение функции в любой из 255 промежуточных точек, номер которой указывается
в младшем байте регистра данных Dx. Результатом операции является число
Rx = Em + ( En - Em ) * Dx / 256 ,
которое заносится в регистр Dx. Дробная часть результата размещается в младших разрядах D7-0, целая часть - в старших разрядах:
байт в разрядах D15-8, слово - в D23-8, младшие 24 разряда длинного слова - в D31-8 (старшие 8 разрядов не охраняются). При этом
значение целой части округляется. Команда TBLU выполняет данную операцию над числами без знака. При ее выполнении неиспользуемые
в операциях с байтами и словами старшие разряды результата в регистре Dx (D31-16 или D31-24) заполняются нулями. Команда TBLS
выполняет операцию над числами со знаком. В этом случае неиспользуемые разряды результата в регистре Dx заполняются путем
расширения знака.
Команды TBLUN,TBLSN реализуют аналогичные операции, но не выполняют округление целой части результата.
При этом содержимое регистра Dx после операции может быть считано, как целое число
Rx' = Em * 256 + ( En - Em ) * Dx.
Порядок размещения разрядов результата в регистре Dx такой же, как при выполнении команд TBLU,TBLS.
Рассмотрим особенности адресации операндов Em,En. При табличном задании функции определяемый командой
адрес EA указывает базовый адрес таблицы, которая содержит операнды Ei. Эти операнды задают кусочно-линейную функцию, значения
которой в промежуточных точках вычисляются с помощью команд TBL. Указанный в команде регистр Dx содержит в разрядах D15-8
смещение, которое суммируется с базовым адресом EA, образуя адрес выбираемого из таблицы операнда Em. Из следующей ячейки в
таблице выбирается операнд En. Таблица может содержать до 256 операндов, задающих линейные отрезки, а команды TBL позволяют
вычислить 256 промежуточных значений функций для каждого отрезка. Таким образом можно получить до 65536 значений функции (или
ее аппроксимации), вместо хранения их в памяти.
При регистровом задании функции значения Em,En выбираются из указанных в команде регистров Dym, Dyn.
Из регистра Dx в этом случае выбирается только младший байт D7-0, задающий номер промежуточной точки и используемый при вычислении
Rx или Rx'.
По результатам выполнения арифметических, логических и ряда других команд производится установка
соответствующих значений признаков C,V,Z,N,X в младшем байте регистра SR (рис.3.2). Изменение признаков после выполнения
определенных команд указано в табл.3.5, где обозначено:
+ - установка признака по результатам операции;
- - сохранение предыдущего значения признака;
0 - установка нулевого значения признака;
? - неопределенное значение признака;
* - значение признака Z сохраняется при нулевом результате, установка Z=0 при ненулевом результате.
Таблица 3.5. Изменение признаков после выполнения команд
Команды |
X |
N |
Z |
V |
C |
Примечание |
ABCD, SBCD, NBCD |
+ |
? |
* |
? |
+ |
X=С - десятичный перенос |
ADD, ADDI, ADDQ, SUB, SUBI, SUBQ, NEG |
+ |
+ |
+ |
+ |
+ |
X=C - двоичный перенос |
ADDX, SUBX, NEGX |
+ |
+ |
* |
+ |
+ |
X=C - двоичный перенос |
MULS, MULU, DIVS, DIVU |
- |
+ |
+ |
+ |
0 |
|
MOVE, MOVEQ, AND, ANDI, OR, ORI, EOR, EORI, NOT, CLR, EXT, TAS, TST |
- |
+ |
+ |
0 |
0 |
|
CMP, CMPI, CMPM |
- |
+ |
+ |
+ |
+ |
|
CMP2 |
- |
? |
+ |
? |
+ |
|
BTST, BSET, BCLR, BCHG |
- |
- |
+ |
- |
- |
Z = bn (инверсия) |
ASL, ASR |
+ |
+ |
- |
+ |
+ |
V = 1 при изменении знака |
LSL, LSR |
+ |
+ |
+ |
0 |
+ |
|
ROL, ROR |
- |
+ |
+ |
0 |
+ |
|
ROXL, ROXR |
+ |
+ |
+ |
0 |
+ |
|
CHK |
+ |
+ |
+ |
+ |
+ |
|
MOVE, ANDI, ORI, EORI to CCR или SR |
+ |
+ |
+ |
+ |
+ |
|
Значения признаков изменяются также при выполнении команд сравнения и тестирования,
сдвигов, битовых операций, пересылок MOVE to SR, MOVE to CCR и логических операций ANDI, ORI, EORI to CCR или to SR. Команды, не
указанные в табл.3.5, не меняют значения признаков.
Команды логических операций (табл.3.6). Процессор производит логические операции И, ИЛИ,
Исключающее ИЛИ, которые выполняются с помощью команд AND, OR, EOR над одноименными разрядами операндов. Команды ANDI, ORI, EORI
выполняют эти же операции с непосредственной адресацией операнда - источника. Команда NOT инвертирует значение каждого разряда
операнда. По результатам выполнения команд производится установка признаков в соответствии с табл.3.5.
Таблица 3.6. Команды логических операций
Синтаксис ассемблера |
Разрядность |
Операции |
Адресация |
AND <EA>, Dn |
AND Dn, <EA> |
ANDI # Im, <EA> |
ANDI # Im, CCR |
ANDI # Im, SR |
OR <EA>, Dn |
OR Dn, <EA> |
ORI # Im, <EA> |
ORI # Im, CCR |
ORI # Im, SR |
|
B, W, L |
B, W, L |
B, W, L |
16 |
16 |
B, W, L |
B, W, L |
B, W, L |
16 |
16 |
|
Dn ^ <src> -> Dn |
<dst> ^ Dn -> <dst> |
<dst> ^ Im -> <dst> |
CCR ^ Im -> CCR |
SR ^ Im -> SR |
Dn <src> -> Dn |
<dst> Dn -> <dst> |
<dst> Im -> <dst> |
CCR Im -> CCR |
SR Im -> SR |
|
(1, 3 - 14), 1 |
1, (3 - 9,13) |
12, (1, 3 - 9,13) |
12, - |
12, - |
(1, 3 - 14), 1 |
1, (3 - 9,13) |
12, (1, 3 - 9,13) |
12, - |
12, - |
|
EOR Dn, <EA> |
EORI # Im, <EA> |
EORI # Im, CCR |
EORI # Im, SR |
|
|
<dst> + Dn -> <dst> |
lt;dst> + Im -> <dst> |
CCR + Im -> CCR |
SR + Im -> SR |
|
1, (1, 3 - 9,13) |
12, (1, 3 - 9,13) |
12, - |
12, - |
|
NOT <EA> |
B, W, L |
<dst> -> <dst> |
(1, 3 - 9.13) |
Особую роль играют варианты команд ANDI, ORI, EORI, использующие в качестве операнда
- приемника содержимое регистра SR или его младшего байта CCR. При адресации к CCR эти команды позволяют изменять значения всех
или части признаков X, N, Z, V, C путем задания соответствующих значений пяти младших разрядов непосредственного операнда Im.
При адресации к SR эти команды могут изменять значения любых разрядов этого регистра, в том числе бита супервизора S. Поэтому
команды ANDI, ORI, EORI, адресующие регистр SR, являются привилегированными.
Команды сдвига (табл.3.7). Процессор осуществляет арифметические, логические и циклические
сдвиги адресуемых операндов на один или несколько разрядов. Каждый вид сдвига имеет три варианта:
- сдвиг содержимого регистра данных Dy, число разрядов сдвига Ns задается содержимым регистра Dy;
- сдвиг содержимого регистра данных Dy, число разрядов сдвига Ns задается непосредственно в команде;
- сдвиг содержимого ячейки памяти с адресом EA на один разряд.
Операнд, размещаемый в регистре Dy, может иметь разрядность B, W или L; операнд,
размещаемый в памяти, имеет разрядность слова.
Таблица 3.7. Команды сдвигов
Синтаксис ассемблера |
Разрядность |
Операции |
Адресация |
ASL Dx, Dv |
ASL # Ns, Dv |
ASL <EA> |
ASR Dx, Dv |
ASR # Ns, Dv |
ASR <EA> |
|
B, W, L |
B, W, L |
16 |
B, W, L |
B, W, L |
16 |
|
см. рис. 3.5, а |
см. рис. 3.5, а |
см. рис. 3.5, а |
см. рис. 3.5, б |
см. рис. 3.5, б |
см. рис. 3.5, б |
|
1, 1 |
12, 1 |
(3 - 9,13) |
1, 1 |
12, 1 |
(3 - 9,13) |
|
LSL Dx, Dv |
LSL # Ns, Dv |
LSL <lEA> |
LSR Dx, Dv |
LSR # Ns, Dv |
LSR <lEA> |
|
B, W, L |
B, W, L |
16 |
B, W, L |
B, W, L |
16 |
|
см. рис. 3.5, а |
см. рис. 3.5, а |
см. рис. 3.5, а |
см. рис. 3.5, в |
см. рис. 3.5, в |
см. рис. 3.5, в |
|
1, 1 |
12, 1 |
(3 - 9,13) |
1, 1 |
12, 1 |
(3 - 9,13) |
|
ROL Dx, Dv |
ROL # Ns, Dv |
ROL <EA> |
ROR Dx, Dv |
ROR # Ns, Dv |
ROR <EA> |
|
B, W, L |
B, W, L |
16 |
B, W, L |
B, W, L |
16 |
|
см. рис. 3.6,а |
см. рис. 3.6,а |
см. рис. 3.6,а |
см. рис. 3.6, б |
см. рис. 3.6, б |
см. рис. 3.6, б |
|
1, 1 |
12, 1 |
(3 - 9,13) |
1, 1 |
12, 1 |
(3 - 9,13) |
|
ROXL Dx, Dv |
ROXL # Ns, Dv |
ROXL <EA> |
ROXR Dx, Dv |
ROXR # Ns, Dv |
ROXR <EA> |
|
B, W, L |
B, W, L |
16 |
B, W, L |
B, W, L |
16 |
|
см. рис. 3.6, в |
см. рис. 3.6, в |
см. рис. 3.6, в |
см. рис. 3.6, г |
см. рис. 3.6, г |
см. рис. 3.6, г |
|
1, 1 |
12, 1 |
(3 - 9,13) |
1, 1 |
12, 1 |
(3 - 9,13) |
|
Выполнение команд сдвигов иллюстрируется на рис.3.5, 3.6. Выдвигаемые разряды поступают
в качестве признаков C,X в регистр SR, поэтому после выполнения команд сдвигов эти признаки принимают значение последнего разряда,
выдвинутого вправо или влево. Признаки N, Z устанавливаются в соответствии со знаком и значением (равно или не равно нулю) результата
сдвига
Рис.3.5. Выполнение арифметических (а, б) и логических (а, в) сдвигов.
При арифметическом и логическом сдвиге влево с помощью команд ASL, LSL производится
заполнение освобождающихся младших разрядов операнда нулями (рис.3.5,а). При арифметическом сдвиге вправо по команде ASR
освобождающиеся старшие разряды операнда заполняются значением старшего (знакового) разряда исходного операнда (рис.3.5,в).
Таким образом сохраняется значение знака и формы представления операнда (прямой или дополнительный код). При логическом сдвиге
вправо по команде LSR старшие разряды операнда заполняются нулями (рис.3.5,в). Особенностью выполнения команд арифметических
сдвигов является использование признака V для индикации изменения значения старшего (знакового) разряда операнда. Значение V=1
устанавливается, если в процессе выполнения команды ASL произошло хотя бы одно изменение значения этого разряда. При выполнении
команды ASR данный разряд не изменяется.
Рис.3.6. Выполнение циклических сдвигов
Циклические сдвиги имеют два варианта : без использования признака
X (команды ROL, ROR) и с введением признака X в цепь циклического сдвига (команды ROXL, ROXR). В обоих вариантах последний
выдвигаемый разряд сохраняется в качестве признака C.
Команды сравнения и тестирования (табл.3.8). Сравнение операндов производится путем их
вычитания и установки значений признаков N,Z,V,C в соответствии с полученным результатом (табл.3.5). При этом результат не
сохраняется, и значения операндов не меняются. Анализ полученных значений признаков позволяет определить относительное значение
(>, <, = ) операндов со знаком или без знака (табл.3.12). Отдельные команды позволяют сравнивать операнд, адресуемый EA,
с содержимым регистра данных (команда CMP), регистра адреса (команда CMPA), непосредственным операндом (команда CMPI). Команда
CMPM используется при сравнении размещенных в памяти массивов операндов.
Команда CMP2 проверяет содержимое регистра Rn на нахождение в пределах заданного диапазона значений.
Нижняя LB и верхняя UB границы диапазона содержатся в ячейках памяти, начиная с адреса EA. В качестве Rn может выбираться регистр
данных или адреса. Разрядность операнда и значений LB,UB определяется суффиксом B,W или L. Результатом сравнения является установка
признаков (табл.3.5): C=1, если операнд выходит за границы LB,UB; Z=1, если операнд равен одной из границ.
Таблица 3.8. Команды сравнения и тестирования.
Синтаксис ассемблера |
Разрядность |
Операции |
Адресация |
СMP <EA>, Dn |
СMP <EA>, Dn |
CMPI # Im, <EA> |
CMPM (Av) +,(Ax) + |
|
B, W, L |
W, L |
B, W, L |
B, W, L |
|
Dn - <src> |
An - <src> |
<dst> - Im |
<dst> - <src> |
|
(1 - 14), 1 |
(1 - 14), 2 |
12, (1, 3 - 11,13,14) |
4,4 |
|
CMP2 <EA>, Rn |
B,W,L |
(Rn)<LB, (Rn)>UB |
(3,6-11,13,14), (1,2) |
|
|
<dst> - 0 |
<dst> - 0, 1 -> b7 |
|
|
Команды тестирования TST, TAS являются однооперандными вариантами команд сравнения.
При выполнении этих команд устанавливаются признаки N,Z в соответствии со знаком и значением (равно или не равно нулю) операнда,
адресуемого EA. Команда TAS, которая оперирует только с байтовыми операндами, производит после тестирования установку значения
старшего бита операнда b7=1. Для выполнения этой команды используется неделимый цикл "чтение-модификация-запись", который не может
быть прерван запросом прямого доступа к памяти, поступившим от других устройств системы. Команда TAS обычно используется в
мультипроцессорных системах для организации совместного использования памяти с помощью "семафоров" - специальных битов, запрещающих
или разрешающих различным процессорам доступ к отдельным блокам общей памяти.
Kоманды битовых операций (табл.3.9 ). Эти команды производят установку значения признака
Z в соответствии со значением тестируемого бита bn в операнде, адресуемом EA. Если операнд размещается в регистре данных, то он
рассматривается как длинное слово, если в ячейке памяти - как байт. Номер тестируемого бита задается содержимым регистра Dn, или
непосредственным операндом Nb. Значение Z=1 устанавливается, если тестируемый бит bn=0, значение Z=0, если bn=1.
Команды данной группы реализуют разные варианты изменения тестируемого бита. Команда BTST сохраняет
значение этого бита неизменным. Команда BSET после тестирования устанавливает значение bn=1, а команда BCLR - значение bn=0.
Команда BCHG инвертирует значение бита bn после тестирования.
Таблица 3.9. Команды битовых операций.
Синтаксис ассемблера |
Разрядность |
Операции |
Адресация |
BTST Dn, <EA> |
BTST # Nb, <EA> |
BSET Dn, <EA> |
BSET # Nb, <EA> |
BCLR Dn, <EA> |
BCLR # Nb, <EA> |
BCHG Dn, <EA> |
BCHG # Nb, <EA> |
|
B, L |
B, L |
B, L |
B, L |
B, L |
B, L |
B, L |
B, L |
|
bn -> Z |
bn -> Z |
bn -> Z, 1 -> bn |
bn -> Z, 1 -> bn |
bn -> Z, 0 > bn |
bn -> Z, 0 -> bn |
bn -> Z, `bn -> bn |
bn -> Z, `bn -> bn |
|
1, (1, 3 - 14) |
12, (1, 3 - 14) |
1, (1, 3 - 9,13,14) |
12, (1, 3 - 9,13,14) |
1, (1, 3 - 9,13,14) |
12, (1, 3 - 9,13,14) |
1, (1, 3 - 9,13,14) |
12, (1, 3 - 9, 13,14) |
|
Команды управления и установки байтов (табл.3.10 ). В эту группу входят
команды условной и безусловной передачи управления программой, вызова подпрограмм, обработки прерываний, а также специальные команды
(останов и начальная установка процессора, организация стековых кадров и др.). Хотя команды условной установки байтов не относятся к
командам управления, однако они рассматриваются в данном разделе, так как используют те же условия установки, что и команды условного
ветвления.
Таблица 3.10. Команды управления и установки байтов.
Синтаксис ассемблера |
Операции |
Адресация |
JMP <EA> |
BRA #Ds |
JSR <EA> |
BSR #Ds |
RTS |
RTR |
Bcc #Ds |
DBcc Dn, #Ds |
|
<dst> -> PC |
PC + Ds -> PC |
SP - 4 -> SP, PC -> (SP), <dst> -> PC |
SP - 4 -> SP, PC -> (SP), PC + Ds -> PC |
(SP) -> PC, SP + 4 -> SP |
(SP) -> CCR, SP + Z -> SP, (SP) -> PC, SP + 4 -> SP |
Если (сс) выполняется, то PC + Ds -> PC |
Если (сс) выполняется, то PC + Ds -> PCЕсли (сс) не выполняется, то Dn - 1 -> Dn,
если после этого Dn =/ 1, то PC + Ds -> PC
|
|
(3, 6 - 11,13,14) |
|
(3, 6 - 11,13,14) |
|
|
|
|
|
|
TRAP #Nt |
TRAP cc #Te |
TRAPV ILLEGAL RTE |
|
SSP-2 -> SSP, Fe/Av-> (SSP), SSP-4 -> SSP, PC ->(SSP),
SSP - 2 > SSP, SR -> (SSP), Ve-> PC
|
Если (cc) выполняется, то аналогично TRAP с номером вектора Ne=7 |
Если V = 1, то аналогично TRAP с номером вектора Ne=7
Аналогично TRAP с номером вектора Ne=4
(SP) -> SR, SP + 2 -> SP, (SP) -> PC, SP + 4 -> SP
|
|
|
BKPT #Nb |
Останов в контрольной точке |
|
RTD #Ns |
(SP) -> PC, SP + 4 + Ns -> SP |
|
|
PC + 2 -> PC (отсутствие операции) |
Ws -> SR и останов программы |
Ws -> SR и останов программы |
|
|
RESET |
Установка начального состояния (повторный запуск) |
|
CHK <EA>, Dn |
CHK2 <EA>, Rn |
LINK An, #Ns |
UNLK An |
|
Если (Dn)< 0 или (Dn)> <src>, то аналогично TRAP с номером вектора Ne=6 |
Если (Rn) < LB или (Rn)>UB, то аналогично TRAP с номером вектора Ne=6 |
SP - 4 -> SP, (An) -> (SP), SP -> An, SP + Ns > SP |
An -> SP, (SP) -Gt; An, SP + 4 -> SP |
|
(1, 3 - 14), 1 |
(3,6-11,13,14),(1,2) |
|
|
|
Scc <EA> |
Если (сс) выполняется, то 1 ... 1 -> <dst>, если (сс) не выполняется, то 0 ... 0 -> <dst>
|
(1, 3 - 9,13,14) |
Команда безусловного перехода JMP загружает в программный счетчик PC содержимое ячейки
памяти, адресуемой EA. Это содержимое является адресом команды, которой передается управление программой. Безусловный переход
осуществляется также командой ветвления BRA, которая отличается от JMP способом формирования нового содержимого программного
счетчика. Оно образуется суммированием текущего содержимого PC (адреса следующей команды программы) со смещением Ds, заданным
в команде. Таким образом реализуется относительная адресация новой команды. Величина Ds, содержащая до 16 разрядов, задается
числом со знаком, поэтому новое значение PC может быть больше или меньше текущего значения. При программировании на языке
ассемблера вместо значения Ds можно указывать символическое обозначение адреса перехода <label>. В этом случае вычисление
значения Ds производится программой-ассемблером. Следует отметить, что величина Ds, содержащая не более 8 двоичных разрядов
(короткое смещение), размещается в младшем байте первого слова команды, а содержащая большее число разрядов (длинное смещение)
задается отдельным словом команды. Поэтому команды BRA,BSR,Bcc, DBcc, Scc, использующие короткое смещение, занимают меньше памяти
и выполняются быстрее, чем такие же команды с длинным смещением.
Команда вызова подпрограммы JSR загружает в PC из ячейки памяти адрес первой команды вызываемой
подпрограммы, поместив перед этим текущее содержимое PC (адрес следующей команды программы) в стек. Вызов подпрограммы выполняется
также командой BSR, которая использует относительную адресацию, аналогично команде BRA. Возврат к вызывавшей программе после
выполнения подпрограммы осуществляется командой RTS, которая возвращает из стека в PC его текущее значение, обеспечивая переход к
выполнению следующей команды программы. В большинстве случаев первая команда вызываемой подпрограммы производит загрузку в стек
текущего значения регистра SR, чтобы сохранить установленные значения признаков. В этих случаях при возврате из подпрограммы
следует использовать команду RTR, которая восстанавливает текущие значения байта CCR (признаки X,N,Z,V,C) и PC.
Команды условных ветвлений Bcc имеют 14 вариантов, отличающихся видом условия (табл.3.11). Если
соответствующее условие (сс) выполняется, то происходит переход к команде, адрес которой формируется относительным способом,
как в командах BRA, BSR. В противном случае выполняется следующая команда программы.
Таблица 3.11. Виды условий (cc)
Мнемокод |
Проверяемое условие |
Значение (сс) |
NE EQ |
не равно (ненулевой результат) равно (нулевой результат) |
Z = 0 Z = 1 |
HI LS |
выше ниже или равно |
C + N = 0 C + N = 1 |
HS (или С) LO (или S) |
выше или равно (нет переноса) ниже (есть перенос) |
C = 0 С = 1 |
GE LT |
больше или равно меньше |
N + V = 0 N + V = 1 |
GT LE |
больше меньше или равно |
Z + (N + V) = 0 Z + (N + V) = 1 |
PL MI |
положительный результат отрицательный результат |
N = 0 N = 1 |
VC VS |
нет переполнения есть переполнение |
V = 0 V = 1 |
T F |
есть ветвление *) нет ветвления *) |
1 0 |
*) Не используется в команде Всс
В качестве условий ветвления (cc) используются 14 различных значений признаков N,Z,V,C и их комбинаций.
Во многих случаях условием служит результат сравнения двух операндов, выполняемого с помощью команд CMP, CMPA, CMPI, CMPM.
Равенство операндов определяется по значению признака Z: условия EQ, NE. Если сравниваются числа без знака, то их относительные
значения: выше (>), выше или равно (>= ), ниже (< ), ниже или равно (<=), определяются условиями HI, HS, LO, LS.
При этом в качестве мнемокодов условий "выше или равно" (HS) и "ниже" (LO) можно использовать, соответственно, CC и CS. Если
сравниваются числа со знаком, то их относительные значения определяются условиями GT, GE, LT, LE. Остальные условия определяются
знаком результата (PL,MI) и наличием или отсутствием переполнения (VS,VC).
При записи на языке ассемблера мнемокод соответствующего условия вводится в мнемокод команды вместо
символа сс. Например,
B + EQ = BEQ - мнемокод команды ветвления при равенстве операндов,
B + MI = BMI - мнемокод команды ветвления при отрицательном результате.
Условие выполняется, если значение (cc), определяемое логическими выражениями в табл.3.11, равно 1.
В табл.3.11 содержатся также условия безусловного ветвления (T) и выполнения следующей команды (F),
которые используются в командах DBcc, Scc.
Команда DBcc служит для организации программных циклов. Указанный в команде регистр Dn является счетчиком
циклов. При выполнении команды DBcc сначала проверяется выполнение заданного условия. Если условие выполняется, то процессор выбирает
следующую команду программы (условный выход из цикла). Если условие не выполняется, то производится декремент содержимого регистра Dn.
Если при этом содержимое Dn оказывается равным -1, то также выбирается следующая команда (завершение цикла). Если содержимое Dn не
равно -1, то выполняется переход к команде с адресом (PC + Ds), являющейся началом цикла. Данная команда допускает использование
любых условий, указанных в табл.3.11. При этом команда DBF обеспечивает безусловное выполнение заданного числа циклов, а команда
DBT - безусловный выход из цикла.
Команда прерывания TRAP переводит процессор в режим супервизора, устанавливая значение признака S=1 в
регистре SR. В стек супервизора заносятся слово (Fe/Av), указывающее формат используемого стекового кадра Fe и относительный
адрес выбираемого вектора исключения Av (см. раздел Исключения, прерывания и режим отладки BDM), а также содержимое регистров SR,PC. Затем из таблицы векторов выбирается
и вводится в PC вектор соответствующего исключения Ve - адрес первой команды подпрограммы обслуживания. Значение Ve выбирается из
размещенной в памяти таблицы векторов исключения (см. раздел Исключения, прерывания и режим отладки BDM). Команда TRAP позволяет выбирать один из шестнадцати возможных
векторов, номер которого Ne = Nt + 32, где значение Nt = 0...15 задается непосредственно в команде. Таким образом, данная команда
позволяет использовать до 16 различных подпрограмм обслуживания прерываний с номерами векторов Ne от 32 до 47.
Команда прерывания при переполнении TRAPV выполняет процедуру, аналогичную TRAP, если установлено значение
признака переполнения V=1. Эта команда обращается к вектору исключения с номером Ne=7 (табл.3.12), который является входом в
подпрограмму обслуживания при возникновении переполнения. Команда условного прерывания обеспечивает обращение к вектору исключения
с номером Ne=7, если выполняется заданное условие (cc). Непосредственно в команде может быть указан код Te (идентификатор), который
используется подпрограммой обслуживания. Команда ILLEGAL позволяет обратиться к подпрограмме обслуживания с номером вектора Ne = 4,
вызываемой при поступлении неправильного кода команды.
Возвращение из подпрограммы обслуживания прерываний (исключений) к прерванной программе выполняется
командой RTE, которая восстанавливает содержимое регистров PC, SR, загружая их из стека. При этом команда проверяет соответствие
значений кода формата Fe и адреса вектора Av, записанных в стеке и сохраняющихся в процессоре. Если обнаруживается их несоответствие,
то реализуется прерывание с номером вектора Ne=14 (ошибка формата стекового кадра, см. раздел Исключения, прерывания и режим отладки BDM ). Команда RTE является
привилегированной, так как производит обратную загрузку содержимого SR. Поэтому возвращение из подпрограмм обслуживания прерываний
может выполняться только в режиме супервизора. Команда RTD загружает из стека новое содержимое PC, а затем исключает из стека Ns ячеек.
Команда BKPT (останов в контрольной точке) останавливает выполнение программы и выдает на выводы A4-2
адресной шины указанный в команде код контрольной точки Nb. Выборка следующей команды производится после поступления сигнала
разрешения от системы отладки. При этом система отладки с помощью внешнего сигнала может переключить процессор на выполнение
подпрограммы обслуживания с номером вектора Ve=4.
Команда NOP производит переход к следующей команде программы без выполнения каких-либо операций.
Привилегированные команды STOP, LPSTOP выполняют загрузку в регистр SR нового содержимого, заданного словом Ws, после чего
процессор останавливает свою работу. В случае поступления команды LPSTOP микроконтроллер переводится в режим отключения с
минимальным потреблением мощности (см. раздел Регистровая структура процессора CPU32). Возобновление работы происходит при поступлении внешнего запроса прерывания
или сигнала установки начального состояния (повторного запуска) RESET#. Привилегированная команда RESET устанавливает на входе
микроконтроллера сигнал RESET# = 0 в течение 512 тактов для перевода в начальное состояние других устройств системы. При этом
состояние процессора не изменяется, и он продолжает выполнение программы. Реализация прерываний описана в разделе Исключения, прерывания и режим отладки BDM.
Ряд специальных команд упрощает выполнение некоторых часто используемых процедур. Команда CHK проверяет,
находится ли содержимое регистра Dn в диапазоне от 0 до верхней границы UB, заданной содержимым ячейки памяти, адресуемой EA. Если
содержимое Dn выходит за пределы этого диапазона, то выполняется прерывание с обращением к сответствующей подпрограмме обслуживания
(номер вектора Ne=6). Команда CHK2 выполняет такую же процедуру при выходе содержимого регистр Rn за пределы диапазона, нижняя и
верхняя границы которого выбираются из ячеек памяти с начальным адресом EA. В качестве Rn может выбираться регистр данных или адреса,
а разрядность операндов задается соответствующим суффиксом B,W или L. Команда LINK обеспечивает модификацию содержимого указателя
стека SP на заданную в команде величину Ns с сохранением его исходного содержимого, которое может быть восстановлено с помощью
команды UNLK. Регистр An используется при этом в качестве регистра связи с сохранением его содержимого в стеке. Таким образом
реализуется совместное использование стека разными процедурами.
Команды установки байтов Sсс производят при выполнении заданного условия (сс) установку 1 во всех разрядах
байта, адресованного EA. Если условие не выполняется, то во всех разрядах байта устанавливается 0. Данные команды могут использовать
все виды условий, указанные в табл.3.11. При этом команда ST выполняет безусловную установку всех разрядов в 1, а команда SF -
безусловную установку всех разрядов в 0.
|