Список
Включение в список
Для включения нового элемента в список необходимо предварительно локализовать элемент, до или после которого будет производиться это включение. Для того чтобы включить новый элемент после локализованного, необходимо выполнить действия, отраженные фрагментом кода:
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::общий выход