Иллюстрированный самоучитель по задачам и примерам Assembler

Список

Включение в список

Для включения нового элемента в список необходимо предварительно локализовать элемент, до или после которого будет производиться это включение. Для того чтобы включить новый элемент после локализованного, необходимо выполнить действия, отраженные фрагментом кода:

itemjist struc элемент списка
next dd 0; адрес следующего элемента
info db 0 содержательная часть (в нашем случае – символ)
;предполагаем, что адрес локализованного элемента находится в регистре ЕВХ.
:а адрес нового элемента – в ЕАХ
mov edx.[ebx].next
mov [eax].next.edx mov [ebx].next.eax

Для включения нового элемента после локализованного возникает проблема, I источник которой в однонаправленности односвязного списка, так как, по определению, проход к предшествующему элементу невозможен. Можно, конечно, включить новый элемент, как показано выше, а затем попросту обменять содержимое этих элементов. К примеру, это может выглядеть так:

itemjist struc:элемент списка
next dd 0:адрес следующего элемента
info db 0 содержательная часть (в нашем случае – символ)
ends
;предполагаем, что адрес локализованного элемента находится в регистре ЕВХ.
:а адрес нового элемента – в ЕАХ
mov edx.[ebx].next mov [eax].next.edx mov edx.[ebx].info mov [eax].info.edx mov [ebx].next.eax
:осталось заполнить поле info нового элемента

Но если производится включение в упорядоченный список, то логичнее работать с двумя указателями – на текущий и предыдущий элементы списка, так как это показано ниже. При этом предполагается, что новый элемент создается описанной в предыдущей программе макрокомандой create_item.

;описание элемента списка
item_list struc:элемент списка
next dd 0; адрес следующего элемента
info db 0 содержательная часть (в нашем случае – символ)
ends
.data
ins_itern itemjist <.15> вставляемый элемент (поле info содержит значение –
:критерий вставки)
Headjist dd Offffffffh указатель на начало списка (Offffffffh – список пуст)
Hand_Head dd 0;переменная, в которой хранится дескриптор кучи
.code
;здесь мы инициализировали и работали со списком
;список упорядочен по возрастанию
:ищем место вставки
;1 – выбираем первую ячейку
mov ebx.HeadJist.
хогеах.еах;в еах будет указатель на предыдущий элемент;2 последняя ячейка? ml: cmpebx.Offffffffh
je noJtern:список пустой:3 – новая ячейка до очередной выбранной?
ovd1.CebxJ.info cmpdl.ins_item.info ja nextjtem cmpeax .jne into;вставить первым
createjtem i temj i st. H_Head:макрос создания элемента в куче mov Headjist.edx
:адрес нового в голову списка
mov [edx].next.ebx;настройка указателей jmpexit:на выход
;вставить внутрь списка
into: createjtem item_list.H_Head:макрос создания элемента в куче
mov [еах].next.edx:адрес нового в поле next предыдущего
mov [edx].next.ebx:в поле next нового адрес текущего
jmp exit:на выход
: выбор очередного элемента nextjtem: moveax.ebx:aflpec текущего в еах mov ebx. [ebx].next jmp ml
:4 – список пуст или нет больше элементов no J tern: cmpeax.O
jne no_empty:список непустой:список пуст
mov Headjlist.edx:адрес нового в голову списка
mov [edx].next.Offffffffh:это будет пока единственный элемент в списке
jmpexit:на выход
no_empty::список не пуст – новая ячейка в конец списка
mov [еах].next.edx
mov [edx].next.Offffffffh:это будет последний элемент в списке
exit::общий выход
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.