Tvůrce webu je i pro tebe! Postav třeba web. Bez grafika. Bez kodéra. Hned.
wz

Obsah / Utility / LIST / Inicializace popisovače seznamu

Zdrojový kód: INCLUDE\UTIL\LIST.INC, UTIL\LIST.ASM


Inicializace popisovače seznamu

Popisovač seznamu vyžaduje inicializaci pouze v případě, že se jedná o hlavičku seznamu nebo o výchozí prvek seznamu bez hlavičky. Při inicializaci nastavíme oba ukazatele na adresu popisovače, tím vytvoříme prázdný seznam. Popisovače přidávaných prvků není potřeba inicializovat. Zvláštním případem je "bezpečný seznam". U bezpečného seznamu je položka LIST_Next nastavena na adresu popisovače jako příznak, že prvek není začleněn do žádného seznamu.


; ------------- Macro - initialized list head (or initialized safe list entry)

%define		LISTHEAD dd	$,$

Makro LISTHEAD použijeme k deklaraci inicializovaného záhlaví seznamu. Prvky LIST_Next a LIST_Prev ukazují na adresu popisovače záhlaví seznamu.


; ------------- Macro - initialized linked list entry
; %1 = pointer to next entry, %2 = pointer to previous entry

%macro		LINKEDLIST 2
		dd	%1,%2
%endmacro

Makro LINKEDLIST slouží k deklaraci inicializovaného popisovače seznamu. Použijeme ho k vytvoření seznamů se strukturou známou v době překladu, jako je například seznam ovladačů zařízení. Prvním parametrem makra je ukazatel na následující popisovač seznamu, druhým parametrem ukazatel na předcházející popisovač.


; ------------- Macro - initialize list head (%1 = pointer to list head)

%macro		LISTINIT 1
		mov	[%1+LIST_Next],%1 ; next (first) entry in chain
		mov	[%1+LIST_Prev],%1 ; previous (last) entry in chain
%endmacro

; -----------------------------------------------------------------------------
;                           Initialize list head
; -----------------------------------------------------------------------------
; INPUT:	EBX = list head
; -----------------------------------------------------------------------------

ListInit:	LISTINIT ebx		; initialize list head
		ret

Pomocí makra LISTINIT můžeme inicializovat záhlaví prázdného seznamu. Jako parametr uvedeme ukazatel na záhlaví seznamu. Toto makro je použito ve funkci ListInit, s jejíž pomocí inicializujeme prázdný seznam. Parametrem funkce je ukazatel na záhlaví seznamu předávaný v registru EBX.


; ------------- Macro - test if list is empty (output: ZY = list is empty)
; %1 = pointer to list head

%macro		LISTTEST 1
		cmp	dword [%1+LIST_Next],%1 ; check if list is empty
%endmacro

Makrem LISTTEST můžeme testovat, zda je seznam prázdný nebo zda je položka bezpečného seznamu připojena k seznamu. Parametrem makra je ukazatel na popisovač seznamu. Je-li seznam prázdný nebo není-li prvek bezpečného seznamu připojen k seznamu, nastaví makro příznak ZF na 1, tj. je splněna podmínka ZY.


; ------------- Macro - mark safe list entry as empty (%1 = safe list entry)

%macro		LISTEMPTY 1
		mov	dword [%1+LIST_Next],%1 ; mark safe list entry as empty
%endmacro

; -----------------------------------------------------------------------------
;                       Initialize safe list entry
; -----------------------------------------------------------------------------
; INPUT:	EBX = safe list entry
; NOTES:	Safe list entry is not in list if NEXT points to itself.
; -----------------------------------------------------------------------------

ListSafeInit:	LISTEMPTY ebx		; initialize safe list entry
		ret

Makro LISTEMPTY inicializuje položku bezpečného seznamu a to tak, že ukazatel LIST_Next nastaví na adresu položky. Parametrem makra je ukazatel na položku seznamu. Makro je použito ve funkci ListSafeInit, která inicializuje položku bezpečného seznamu, jejíž adresu předáme funkci v registru EBX.


Obsah / Utility / LIST / Inicializace popisovače seznamu