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

Obsah / Utility / HASH / Přidání položky do seznamu

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


Přidání položky do seznamu


; -----------------------------------------------------------------------------
;          Add new entry to begin of hash list or after current entry
; -----------------------------------------------------------------------------
; INPUT:	EAX = new hash list entry
;		EBX = hash list head or current hash list entry
; -----------------------------------------------------------------------------

; ------------- Push registers

HashAddAfter:
HashAdd:	push	ecx		; push ECX

; ------------- Link first/next entry and head/current entry to new entry

		mov	ecx,[ebx+HASHH_First] ; ECX <- first/next entry
		mov	[eax+HASHE_Next],ecx ; link first/next entry to new one
		mov	[eax+HASHE_Prev],ebx ; link head/current entry to new

; ------------- Link new entry to first/next entry and to head/current entry

		jecxz	HashAdd2	; no first/next entry
		mov	[ecx+HASHE_Prev],eax ; link new entry to next one
HashAdd2:	mov	[ebx+HASHH_First],eax ; link new entry to head/current

; ------------- Pop registers

		pop	ecx		; pop ECX
		ret

Funkce HashAdd slouží k vložení nové položky na začátek hashovaného seznamu. Jako vstupní parametr je funkci předán v registru EAX ukazatel na nově vkládanou položku (přesněji ukazatel na popisovač hashovaného seznamu vkládané položky). V registru EBX je ukazatel na záhlaví hashovaného seznamu.

Po úschově registru ECX se provede připojení první položky seznamu a záhlaví seznamu k nové položce. Do registru ECX se ze záhlaví seznamu načte ukazatel na první položku seznamu, ukazatel se uloží do proměnné HASHE_Next nově vkládané položky, bude tedy jejím následujícím prvkem. V tomto okamžiku nevadí, je-li ukazatel na první položku nulový. Další instrukcí se uloží ukazatel na záhlaví (tedy na jeho proměnnou HASHH_First) do proměnné HASHE_Prev nové vkládané položky, záhlaví bude tedy jejím předcházejícím prvkem.

Následuje připojení nové položky k původní první položce seznamu a k záhlaví seznamu. Ukazatel na původní první položku seznamu je uložen v registru ECX. Může být nulový (tj. není žádná první položka), proto je operace uložení ukazatele přeskočena v případě nulového ukazatele. Jinak je ukazatel na novou položku uložen do proměnné HASHE_Prev původní první položky, nová položka tedy bude předcházejícím prvkem původní první položky. Dále je ukazatel na nově vloženou položku uložen do proměnné HASHH_First záhlaví seznamu, nová položka tedy bude novou první položkou seznamu.

Funkce slouží současně k vložení nové položky seznamu za jinou položku (návěští HashAddAfter). Registr EAX opět obsahuje ukazatel na nově vkládanou položku, v registru EBX je ukazatel na jinou položku seznamu. Nutnou podmínkou je, že offsety proměnných HASHH_First (ve struktuře HASHH) a HASHE_Next (ve struktuře HASHE) se musí shodovat, tj. proměnné musí být umístěny na začátku struktur.


; -----------------------------------------------------------------------------
;                      Add new entry before current entry
; -----------------------------------------------------------------------------
; INPUT:	EAX = new hash list entry
;		EBX = current hash list entry
; -----------------------------------------------------------------------------

; ------------- Push registers

HashAddBefore:	push	ecx		; push ECX

; ------------- Link previous entry (or head) and current entry to new entry

		mov	ecx,[ebx+HASHE_Prev] ; ECX <- previous entry (or head)
		mov	[eax+HASHE_Next],ebx ; link current entry to new one
		mov	[eax+HASHE_Prev],ecx ; link previous entry to new one

; ------------- Link new entry to previous entry (or head) and to current entry

		mov	[ebx+HASHE_Prev],eax ; link new entry to current one
		mov	[ecx+HASHE_Next],eax ; link new entry to previous one

; ------------- Pop registers

		pop	ecx		; pop ECX
		ret

Funkce HashAddBefore slouží k vložení nové položky před jinou položku. Jako vstupní parametr je funkci předán v registru EAX ukazatel na nově vkládanou položku (přesněji ukazatel na popisovač hashovaného seznamu vkládané položky). V registru EBX je ukazatel na jinou položku seznamu.

Po úschově registru ECX se provede připojení předešlé položky (nebo záhlaví seznamu) a jiné položky k nové položce. Z proměnné HASHE_Prev jiné položky se do registru ECX načte ukazatel na předešlou položku (nebo záhlaví). Ukazatel na jinou položku se uloží do proměnné HASHE_Next nové položky, jiná položka tedy bude následující položkou za nově vkládanou položkou. Ukazatel na předešlou položku (nebo záhlaví) se uloží do proměnné HASHE_Prev nové položky.

Následuje připojení nové položky k jiné položce a k předešlé položce (nebo k záhlaví). Na rozdíl od předešlé funkce není třeba rozlišovat, zda není některý ukazatel nulový (nemůže být). Ukazatel na nově vkládanou položku se uloží do proměnné HASHE_Prev jiné položky (nová položka bude její předcházející položkou) a do proměnné HASHE_Next předcházející položky (nová položka bude její následující položkou). Předcházející položkou přitom může být záhlaví, v tím případě se ukazatel na novou položku uloží do proměnné HASHH_First položky záhlaví a nová položka se stane první položkou seznamu.


Obsah / Utility / HASH / Přidání položky do seznamu