Сборник по задачам и примерам Assembler


Сеть - часть 3


В случае нелинейной организации двусвязного списка его построение таит ряд проблем. Часть из них снимается при статическом способе построения списка, который для конечных автоматов является наилучшим. При необходимости, используя приведенные ниже структуры, читатель может самостоятельно описать такой список в своем сегменте данных. Далее мы займемся динамическим, более сложным вариантом организации нелинейного списка, реализующим конечный автомат. Напомним, что его задачей является распознавание лексемы — описания шестнадцатеричного числа в директивах ассемблера dd, dq, dt. Для построения нелинейного многосвязного списка разработаем ряд макрокоманд. С их помощью построение проводится в два этапа:

  • создание двусвязного списка состояний конечного автомата;
  • создание односвязных списков переходов.

В приведенной ниже программе двусвязный список состояний конечного автомата строится сразу. Далее для каждого состояния, в котором может находиться автомат, строятся односвязные списки переходов. По мере своего создания односвязные списки переходов подсоединяются к соответствующим элементам двусвязного списка состояний конечного автомата. В конце программы производится распознавание строки string на предмет ее принадлежности к множеству строк, описываемых приведенным выше регулярным выражением для вещественного числа.

;но при необходимости можно создать и доп. кучу с помощью HeapCreate :HANDLE GetProcessHeap (VOID);

call GetProcessHeap

mov Hand_Head.eax :сохраняем дескриптор .запрашиваем и инициализируем блоки памяти из кучи:

xorebx.ebx :здесь будут указатели на предыдущ. элементы

xorecx.ecx ;dl - номер элемента состояния (двоичный) rept N_state

push ecx :LPVOID HeapAlloc(HANDLE hHeap. DWORD dwFlags, DWORD dwBytes);

push type descr ;размер структуры

push 0 :флаги не задаем

push HandJHead ;описатель кучи

call HeapAlloc

mov [eax].prev_state.ebx запоминаем адрес предыдущ. (if ebx=0. то это первый)

movebx.eax запоминаем адрес текущего в ebx

raov [eax].current_state,eax (И в descr.current_state

pop ecx

mov [eax].id_state_state,cl

inc cl endm

указатель на последний элемент списка состояний в поле-указатель на начало списка head

mov head.ebx .восстанавливаем регистры

pop ebx

pop eax endm




- Начало -  - Назад -  - Вперед -