Рис. 11.1. Регистры МП 68000/8.
Процессор содержит 8 регистров данных и 7 адресных регистров, причем все они в полной мере являются регистрами общего назначения; вспомним в связи с этим, что в МП 8086/8 регистр АХ (AL) должен использоваться в операциях ввода-вывода, DX - для адресации к портам и т. д. Регистры данных могут содержать "байты" (8 бит), "слова" (16 бит) и "данные слова" (32 бит), причем тип данных в любой операции указывается непосредственно в обозначении команды на языке ассемблера (см. ниже). Все вычисления и обработка байтов выполняются в регистрах данных.
Адресные регистры используются как указатели памяти или пространства ввода-вывода в 5 из 12 возможных для МП 68000 способов адресации; в адресных регистрах допустимо выполнение лишь нескольких арифметических операций (сложение, вычитание, сравнение, пересылка). Сегменты, как и сегментные регистры, отсутствуют; в микропроцессорах семейства 68000 всегда возможен доступ ко всему адресному пространству (1 или 4 Мбайт для МП 68008 в DIP - или четырехстороннем корпусе, 16 Мбайт для 68000, 4 Гбайт для 68020/30).
В микропроцессоре также имеются: указатель стека (фактически их два, но в каждый данный момент активен только один), программный счетчик PC (именуемый в МП 8086/8 "указатель команд") и регистр состояния SP. Последний содержит флаги (нуля, переноса, переполнения и др.), а также маску прерываний и биты режима.
Память и ввод-вывод. В отличие от МП 8086/8 в процессорах 68000 не предусмотрены отдельные сигналы магистрали ввода-вывода и в их системе команд отсутствуют команды ввода-вывода типа IN и OUT. Ввод-вывод осуществляется так же, как и обращение к памяти, с использованием адресов полной длины и стробирующих сигналов. Для подключения порта ввода-вывода вам следует декодировать адресные линии и сделать так, чтобы регистры ваших портов выглядели, как несуществующая память. Такой метод называется отображением ввода-вывода на пространство памяти; он используется во многих микропроцессорах. (Впрочем, даже в случае самостоятельного протокола ввода-вывода МП 8086 всегда можно отобразить ввод-вывод на пространство памяти с помощью стробирующих сигналов MEMR' и MEMW'.)
Преимущество отображения ввода-вывода на пространство памяти заключается в том, что для операций над регистрами портов можно использовать все команды, предназначенные для работы с памятью. Специальные команды IN/OUT МП 8086/8 заменяет команда MOVE; кроме этого, непосредственно над содержимым портов можно выполнять операции арифметические (сложения, вычитания, циклического сдвига, сравнения, проверки), логические (И, ИЛИ), а также над битами (установка бит, проверка бит). Единственный недостаток отображения ввода-вывода на пространство памяти заключается в необходимости декодировать много адресных линий; практически здесь не возникает трудностей, поскольку при большом адресном пространстве и малом числе портов ввода-вывода нет необходимости декодировать полный адрес (примеры см. ниже).
11.02. Система команд и способы адресации
В табл. 11.1 приведен полный набор команд МП 68000. Чтобы образовать правильный оператор (команду) языка ассемблера, следует указать операнды (с помощью одного из 12 режимов адресации) и тип данных (байтов, слово или длинное слово). На языке ассемблера фирмы Motorola оператор выглядит следующим образом:
ОПЕРАЦИЯ. размер источник, приемник
Здесь ОПЕРАЦИЯ берется из табл. 11.1, размер есть В, W или L (байт, слово или длинное слово соответственно), а источник и приемник могут представлять регистры, непосредственные константы или ячейки памяти. Ниже приведено несколько примеров с указанием способов адресации.
Таблица 11.1.Набор команд МП 68000/8
Операция · Описание
Арифметические
ABCD Сложение упакованных двоично-десятичных чисел
ADD Сложение
ASL Арифметический сдвиг влево
ASR Арифметический сдвиг вправо
CLR Очистка операнда
DIVS Деление (знаковое)
DIVU Деление (беззнаковое)
EXT Расширение знака
LSL Логический сдвиг влево
LSR Логический сдвиг вправо
MOVE Пересылка
MULS Умножение (знаковое)
MULU Умножение (беззнаковое)
NBCD Отрицание упакованного двоично-десятичного числа
NEG Отрицание
SBCD Вычитание упакованного двоично-десятичного числа
SUB Вычитание
Логические
AND Логическое И
BCHG Проверка и изменение бита
BCLR Проверка и очистка бита
BSET Проверка и установка бита
BTST Проверка бита
CHK Проверка регистра на границы
CMP Сравнение
EOR Исключающее ИЛИ
EXG Обмен регистров
NOT Побитовое дополнение
OR Логическое ИЛИ
RESET Возбуждение линии RESET
ROL Циклический сдвиг влево без расширения
ROR Циклический сдвиг вправо без расширения
ROXL Циклический сдвиг влево с расширением
ROXR Циклический сдвиг вправо с расширением
Scc Установить байт по условию
SWAP Обмен половин регистра
TAS Проверка и установка операнда
TST Проверка операнда и установка флагов
Управления
Всс Условный переход
BRA Безусловный переход (относительный)
BSR Переход на подпрограмму (относительный)
DBcc Проверка, декремент и переход
JMP Безусловный переход (7 режимов)
JSR Переход на подпрограмму (7 режимов)
LEA Загрузка эффективного адреса
LINK Подсоединение стека
NOP Холостая команда
PEA Загрузка в стек эффективного адреса
RTE Возврат из исключения
RTR Возврат, восстановление кодов условий
RTS Возврат из подпрограммы
STOP Останов
TRAP Ловушка (векторизованное исключение)
TRAPV Ловушка по переполнению
UNLK Отсоединение стека
Коды условий ("сс")
СС Перенос сброшен
CS Перенос установлен
EQ Равенство нулю
F Никогда не истина
GE Больше или равно нулю
GT Больше нуля
HI Выше
LE Меньше или равно нулю
LS Ниже или равно
LT Меньше нуля
MI Минус
NE Не равно нулю
PL Плюс
T Всегда истина
VC Переполнение сброшено
VS Переполнение установлено
См. "Коды условий".
Не используется в командах Вcс; вместо "ВТ" используйте BRA.
MOVE.W (непосредственная,
# $FFFF,D0 регистровая)
MOVE.B (А0), (А1) (косвенная, косвенная)
ADD.L D5, (А2) + (прямая, косвенная с постинкрементом)
BTST.B #2$C0000 (непосредственная, абсолютная длинная)
В первом примере устанавливаются в 1 все 16 бит регистра D0 (символ "$" обозначает "шестнадцатиричное", а "#" указывает на "непосредственную" константу); вторая команда копирует байт из ячейки памяти, адрес которой находится в А0, в ячейку памяти, адрес которой находится в А1; третья прибавляет 32-разрядное знаковое целое к 4-байтовому ("длинному") целому, которое начинается в памяти с байта, адресуемого через А2, после чего содержимое А2 увеличивается на 4; последняя команда проверяет бит 2 в ячейке памяти С0000Н, устанавливая соответствующим образом флаг нуля Z (для последующей команды условного перехода). Заметьте, что операнды cледуют в порядке - источник, приемник, что противоположно нотации МП 8086.