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*масштаб).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.