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.
МП 68000 позволяет использовать почти все режимы адресации и размеры операндов с любой командой («Справочное пособие программиста МП 68000» исчерпывающе описывает все допустимые сочетания; наиболее полезная информация собрана в табл. 11.2). В результате написание изящных и эффективных программ на языке ассемблера оказывается относительно простой задачей. Например, работая с МП 8086 и желая проанализировать состояние флага порта ввода-вывода, вы должны будете сохранить и восстановить содержимое регистра AL и в сумме использовать 5 команд (PUSH, IN, TEST, POP, Jcc). МП 68000 позволяет выполнить ту же операцию с помощью всего двух команд: BTST и Всс; никакие регистры не нужны, потому что бит памяти (и, следовательно, регистры порта) можно проанализировать непосредственно. Более того, «автоинкрементный» режим адресации вроде «(А2) +» дает возможность работать с массивами. Хотя мы еще не описали все режимы адресации и команды, вы вполне сможете выполнить следующее упражнение.
Упражнение 11.1. Скопировать массив длиной $100 байт из таблицы, начинающейся в ячейке $А0000 в таблицу, начинающуюся в ячейке SA8000. При решении этой задачи будет полезна команд WGT метка (переход если больше нуля).
Режимы адресации. В приведенных выше примерах команд операции выполнялись над константами, содержимым регистров и содержимым ячеек памяти (или портов). Архитектура МП 68000 предусматривает богатый набор «режимов адресации» для определения этих операндов. В табл. 11.3 перечислены 12 режимов адресации, которые рассматриваются фирмой Motorola как 14. Вот что они значат:
Регистровая прямая адресация
Синтаксис: Dn (или An)
Пример: MOVE.W D0,D1
Операндом является содержимое указанного регистра
Непосредственная адресация
Синтаксис: #хххх
Пример: MOVE.B #$FF,D0
Операндом является указанная константа
Абсолютная адресация к памяти
Синтаксис: xxxx.W или xxxx.L
Пример: ADD.W D0JB000.W
Адрес операнда указан как непосредственная константа
Косвенная адресация
Синтаксис: (An)
Пример: SUB.W D0, (А0)
Указанный регистр содержит адрес операнда
Косвенная постинкрементная адресация
Синтаксис: (Аn) +
Пример: MOVE.B (А0) +, (А1) +
Аналогична косвенной, но после выполнения операции An инкрементируется на величину размера
Косвенная предекрементная адресация
Синтаксис: — 1Аn)
Пример: MOVE.W D0,-(A7)
An сначала декрементируется на величину размера, затем выполняется косвенная адресация
Косвенная адресация со смещением
Синтаксис: d16(An)
Пример: MOVE.L (А0),100(А0)
Адрес операнда определяется как (An) плюс 16-разрядное знаковое смещение d16
Косвенная индексная адресация со смещением
Синтаксис: d8(An,Xn.W [или. L]) (Хn может быть либо Dn, либо An)
Пример: MOVE.L 100(A0),100(A0,D7)
Адрес операнда определяется как (An) плюс (Хп) плюс 8-разрядное знаковое смещение d8
PC-относительная адресация со смещением
Синтаксис: d16(PC)
Пример: LEA 100(РС), АЗ
Адрес операнда отличается от адреса этой команды на величину 16-разрядного знакового смещения
PC-относительная адресация с индексом и смещением
Синтаксис: d8(PC,Xn.W или. L)
Пример: MOVE.W 100(PC,D0.W),D1
Адрес операнда отличается от адреса этой команды на величину суммы 8-разрядного знакового смещения и содержимого Хn.
Несколько пояснений: в первых двух режимах не адресуется память; адресуются регистры или непосредственные константы (т. е. константы, включенные в поток команд; они могут быть только источниками, но никогда не приемниками). Все остальные режимы служат для адресации памяти. Абсолютная адресация удобна для обращения к портам ввода- вывода или к отдельным ячейкам памяти.