MC68000, т.е. такая кодировка обеспечивает совместимость снизу вверх. Использование любой другой кодировки MC68020 означает потерю совместимости сверху вниз. Этого следует всячески избегать, так как на ранних моделях процессоров корректность слов расширения не проверяется. Необходимость соблюдения предосторожностей для обеспечения совместимости сверху вниз иллюстрируется на следующих двух примерах.
Пример 1. Сравнение косвенной адресации по адресному регистру с индексированием на MC68020 и MC68000
программа программа для MC68000 для MC68020
исходный текст на языке ассемблера
MOVE.L OFFSET(A0,D0.L),D1 MOVE.L (OFFSET,A0,D0.L*4),D1
машинный код
2230 2230
08XX 0CXX
Как видно из машинного кода, две команды различаются лишь в одном бите (бит 10 в слове расширения), хотя исходные тексты различаются довольно сильно. Если бы команда MC68020 выполнялась на MC68000, то процессор интерпретировал бы ее как команду
MC68000 и извлек бы неверный операнд; исключение при этом возбуждено бы не было.
Пример 2. Сравнение косвенной адресации по адресному регистру с индексированием на MC68020 и MC68000
программа программа для MC68000 для MC68020
исходный текст на языке ассемблера
MOVE.L OFFSET(A0,D0.L),D1 MOVE.L ([OFFSET,A0,D0.L*4]),D1
машинный код
2230 2230
08XX 0D21
XXXX
Сравнение машинного кода обеих команд в этом примере демонстрирует еще более неуловимую ситуацию в случае, когда код для
MC68020 выполняется на MC68000. В данном примере MC68000 проигнорирует биты 8-10 первого слова расширения и интерпретирует команду как "MOVE.L $21(A0,D0.L),D1", а затем ошибочно использует второе слово расширения как первое слово следующей команды. Таким образом, правильная последовательность разбиения входного потока на отдельные команды будет нарушена, и последствия окажутся непредсказуемыми. Может случиться, что процессором будет осуществлена выборка запрещенной команды и возникшее программное исключение будет перехвачено операционной системой, но может случиться и так, что неправильная команда выполнится без всякого извещения о том, что ошибочно использован способ адресации, реализованный только в MC68020.
Если желательно избежать подобной неприятности, пользователь может любую программу, использующую средства, специфичные именно для MC68020, предварять командой "TRAPF". Этой командой в процессоре MC68020 не выполняется никаких действий, однако при попытке выполнить ее в процессорах MC68000, MC68008, MC68010 и
MC68012 возникнет программное исключение по запрещенной команде, что воспрепятствует выполнению программы на ранних моделях процессоров.
Рис.D-5. Слова расширения в случае способа индексируемой/косвенной адресации операнда
MC68020, короткий формат
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
----T-----------T---T-------T---T-----------------------------¬
¦D/A¦ регистр ¦W/L¦масштаб¦ 0 ¦ смещение ¦
L---+-----------+---+-------+---+-----------------------------MC68020, полный формат
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
----T-----------T---T-------T---T---T---T-------T---T---------¬
¦D/A¦ регистр ¦W/L¦масштаб¦ 1 ¦BS ¦IS ¦разм.BD¦ 0 ¦ I/IS ¦
+---+-----------+---+-------+---+---+---+-------+---+---------+
¦ базовое смещение (0,1 или 2 слова) ¦
+-------------------------------------------------------------+
¦ внешнее смещение (0,1 или 2 слова) ¦
L-------------------------------------------------------------Обозначения полей на Рис.D-5:
Поле Определение регистр номер индексного регистра
D/A тип индексного регистра:
0=Dn
1=An
W/L словный/двухсловный размер индекса:
0= слово с распространенным знаком
1= длинное слово масштаб масштабирующий множитель:
00=1
01=2
10=4
11=8
BS подавление базирования:
0=базовый регистр добавляется
1=базовый регистр игнорируется
IS подавление индексного регистра:
0=индексный операнд вычислить и добавить
1=индексный операнд игнорировать разм.BD размер базового смещения:
00=зарезервировано
01=смещение нулевой длины
10=словное смещение
11=двухсловное смещение
I/IS селектор индексирования/косвенности:
определяет совместно с битом 6 (IS) способ индексируемой/косвенной адресации операнда
------T---------T---------------------------------------------¬
¦ IS ¦ I/IS ¦ адресация ¦
+-----+---------+---------------------------------------------+
¦ 0 ¦ 000 ¦ без использования памяти для вычисления ¦
¦ ¦ ¦ косвенного адреса ¦
¦ 0 ¦ 001 ¦ косвенная с преиндексированием и со смеще- ¦
¦ ¦ ¦ нием нулевой длины ¦
¦ 0 ¦ 010 ¦ косвенная с преиндексированием и со словным ¦
¦ ¦ ¦ смещением ¦
¦ 0 ¦ 011 ¦ косвенная с преиндексированием и с длинным ¦
¦ ¦ ¦ смещением ¦
¦ 0 ¦ 100 ¦ зарезервировано ¦
¦ 0 ¦ 101 ¦ косвенная с постиндексированием и со смеще- ¦
¦ ¦ ¦ нием нулевой длины ¦
¦ 0 ¦ 110 ¦ косвенная с постиндексированием и со слов- ¦
¦ ¦ ¦ ным смещением ¦
¦ 0 ¦ 111 ¦ косвенная с постиндексированием и с длинным ¦
¦ ¦ ¦ смещением ¦
¦ 1 ¦ 000 ¦ без использования памяти для вычисления ¦
¦ ¦ ¦ косвенного адреса ¦
¦ 1 ¦ 001 ¦ косвенная через память с смещением нулевой ¦
¦ ¦ ¦ длины ¦
¦ 1 ¦ 010 ¦ косвенная через память со словным смещением ¦
¦ 1 ¦ 011 ¦ косвенная через память с длинным смещением ¦
¦ 1 ¦ 100-111 ¦ зарезервировано ¦
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.