Поддержка механизма модульности. Уровни доступа. Слова расширения. Использование команд CAS/CAS2 в системных программах, страница 7

MOVE.L  D0,(LAST,A2)    заслать  пустой   указатель   в ссылку назад у нового элемента

CAS2.L  D0:D0,D2:D2,(A0):(A1) если новых элементов нет, установить  оба  указателя   на этот элемент

BNE     DILOOP          иначе попытаться снова

DIDONE                          успешная вставка в список

Перед вставкой нового элемента:

--------------¬       --------------¬        --------------¬

¦  элемент    ¦       ¦  элемент    ¦   ----->  элемент    ¦

¦+ LAST + NEXT¦       ¦+ LAST + NEXT<-----¬  ¦+ LAST + NEXT¦

+-----¬ ------+       +-----¬ ------+   ¦ ¦  +-----¬ ------+

¦     ¦ ¦     ¦       ¦  X  ¦ ¦   --+---- L--+--   ¦ ¦  X  ¦

L-----+^+------       L-----+^+------        L-----+ +-----новый    ¦                     ¦                      ¦

элемент -           LIST_PUT ---           LIST_GET --После вставки нового элемента:

--------------¬       --------------¬        --------------¬

¦  элемент    ¦  ----->  элемент    ¦   ----->  элемент    ¦

¦+ LAST + NEXT<----¬  ¦+ LAST + NEXT<-----¬  ¦+ LAST + NEXT¦

+-----¬ ------+  ¦ ¦  +-----¬ ------+   ¦ ¦  +-----¬ ------+

¦  X  ¦ ¦   --+--- L--+--   ¦ ¦   --+---- L--+--   ¦ ¦  X  ¦

L-----+^+------       L-----+-+------        L-----+^+-----¦                                            ¦

L--------- LIST_PUT               LIST_GET --Рис.D-8. Вставка в двунаправленный список

DDELETE

LEA     LIST_PUT,A0     загрузить  адрес  указателя  на первый элемент в A0

LEA     LIST_GET,A1     загрузить  адрес  указателя  на последний элемент в A1

DDLOOP  MOVE.L  (A1),D1         загрузить  указатель на последний элемент в D1

BEQ     DDDONE          если список пуст, то завершить выполнение операции

MOVE.L  (LAST,D1),D2    заслать ссылку назад из последнего элемента в D2

BEQ     DDEMPTY         если элемент только один, обновить указатели

LEA     (NEXT,D2),A2    загрузить  ссылку   вперед   из предпоследнего указателя в A2

CLR.L   D0              заслать пустой указатель в D0

CAS2.L  D1:D1,D2:D0,(A1):(A2)  если  оба  указателя еще указывают на этот элемент,  обновить их

BNE     DDLOOP          иначе попытаться снова

BRA     DDDONE

DDEMPTY CAS2.L  D1:D1,D2:D2,(A1):(A0) если  первый  и последний элементы все еще совпадают, оба указателя сделать пустыми

BNE     DDLOOP          иначе попытаться снова

DIDONE                          успешное удаление из списка, адрес удаленного элемента в D1

(возможно, пустой)

Перед удалением элемента:

--------------¬       --------------¬        --------------¬

¦  элемент    ¦  ----->  элемент    ¦   ----->  элемент    ¦

¦+ LAST + NEXT<----¬  ¦+ LAST + NEXT<-----¬  ¦+ LAST + NEXT¦

+-----¬ ------+  ¦ ¦  +-----¬ ------+   ¦ ¦  +-----¬ ------+

¦  X  ¦ ¦   --+--- L--+--   ¦ ¦   --+---- L--+--   ¦ ¦  X  ¦

L-----+^+------       L-----+-+------        L-----+^+-----¦                                            ¦

LIST_PUT -                                 LIST_GET --После удаления нового элемента:

--------------¬        --------------¬       --------------¬

¦  элемент    ¦   ----->  элемент    ¦       ¦  элемент    ¦

¦+ LAST + NEXT<-----¬  ¦+ LAST + NEXT<----¬  ¦+ LAST + NEXT¦

+-----¬ ------+   ¦ ¦  +-----¬ ------+    ¦  +-----¬ ------+

¦  X  ¦ ¦    -+---- L--+--   ¦ ¦  X  ¦    L--+--   ¦ ¦  X  ¦

L-----+^+------        L-----+^+------       L-----+^+-----¦                      ¦

LIST_PUT -           LIST_GET ---        удаленный элемент

Рис.D-9. Удаление из двунаправленного списка

D.5. СПОСОБЫ АДРЕСАЦИИ MC68020 С ТОЧКИ ЗРЕНИЯ

ПРОГРАММИСТА

Способы индексной адресации в MC68020 существенно  усовершенствованы по сравнению с более ранними моделями  семейства  M68000

за  счет  включения  косвенной адресации и использования полных

32-битных смещений.

Цель следующих двух разделов - описание новых возможных методов адресации и их классификация с точки зрения программиста. Далее будет удобно использовать понятие "типа  адресации",  поскольку каждый  такой  метод  может соответствовать, а может и не соответствовать  какому-то  одному  конкретному аппаратному способу адресации, реализованному в архитектуре MC68020.

D.5.1 Новые возможности адресации

Подавление базирования при индексной адресации MC68020 позволяет  использовать  любой  индексный регистр в качестве базового.

Поскольку индексным регистром может быть любой регистр  данных, мы получаем два новых варианта адресации: (Dn) и (смещ,Dn). Они могли  бы  быть  названы "косвенной адресацией по регистру данных", но предпочтительнее рассматривать их как  частный  случай

"косвенной  адресации по регистру" (Rn) и (смещ,Rn), где в роли регистра может фигурировать и адресный регистр, и регистр  данных.  Следует иметь в виду, что при употреблении индексного регистра  (Xn)  в  качестве размера может быть указано слово (используемое с распространением знака) или длинное слово.

Поскольку смещение может задаваться всеми 32 битами, оно  может представлять  собой  абсолютный адрес или значение выражения, в котором  участвуют абсолютные адреса. Это обстоятельство позволяет упомянутой выше косвенной адресации  по  регистру  придать форму  (адр,Rn), а адресации без подавления базирования - форму

(адр,An,Rn). Иными словами, абсолютный адрес можно прямо индексировать одним или двумя регистрами.

Масштабирование  дает  возможность осуществлять предварительный сдвиг индексного регистра влево на 0, 1, 2 или 3 бита  при  вычислении исполнительного адреса, что эквивалентно умножению регистра соответственно на 1, 2, 4 или 8. Это дает возможность по истинному значению индекса_массива (т.е  по  номеру  элемента), находящемуся  в  любом из 16 возможных индексных регистров, непосредственно позиционироваться на нужный элемент в  одномерном массиве  1-, 2-, 4-, 8-байтовых данных. Масштабирование в сочетании с уже рассмотренными способами адресации порождает  новые возможности.  Адрес  массива может быть задан как абсолютный, а адрес его элемента - последующим позиционированием,  а  именно, как (адр,Rn*масштаб). Кроме того, при адресации можно использовать  динамическое смещение, величина которого содержится в адресном регистре - (адр,An,Rn*масштаб). Иные вариации можно  получить, предполагая, что адресный регистр указывает непосредственно  на начало массива - (An,Rn*масштаб) или предполагая, что на начало массива указывает адресный регистр со смещением  (базовым) - (смещ,An,Rn*масштаб).