2)
Не используется в командах В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.
МП 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
Синтаксис: d16
(PC)Пример: LEA 100(РС), АЗ
Адрес операнда отличается от адреса этой команды на величину 16-разрядного знакового смещения
Синтаксис: d8
(PC,Xn.W или. L)Пример:
Адрес операнда отличается от адреса этой команды на величину суммы 8-разрядного знакового смещения и содержимого Хn.