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

Obsah / Utility / HASH / Nahrazení položky seznamu jinou položkou

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


Nahrazení položky seznamu jinou položkou


; -----------------------------------------------------------------------------
;                      Replace old entry by new entry
; -----------------------------------------------------------------------------
; INPUT:	EAX = new hash list entry
;		EBX = old hash list entry
; -----------------------------------------------------------------------------

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

HashReplace:	push	ecx		; push ECX
		push	edx		; push EDX

; ------------- Get next (-> ECX) and previous (-> EDX) entry

		mov	ecx,[ebx+HASHE_Next] ; ECX <- next entry
		mov	edx,[ebx+HASHE_Prev] ; EDX <- previous entry

; ------------- Link next entry and previous entry to new entry

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

; ------------- Link new entry to next entry and to previous entry

		jecxz	HashReplace2	; no next entry
		mov	[ecx+HASHE_Prev],eax ; link new entry to next entry
HashReplace2:	mov	[edx+HASHE_Next],eax ; link new entry to previous entry

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

		pop	edx		; pop EDX
		pop	ecx		; pop ECX
		ret

Funkce HashReplace zajistí náhradu prvku seznamu jiným prvkem (který není součástí žádného seznamu). V registru EAX je funkci předán ukazatel na nový prvek seznamu (který nahradí starý prvek), v registru EBX ukazatel na starý prvek seznamu (který bude nahrazen novým prvkem).

Registry ECX a EDX jsou použity jako přechodné, jejich obsahy jsou proto uchovány instrukcemi PUSH/POP. Do přechodných registrů je ze staré položky seznamu načten ukazatel na následující položku (registr ECX, ukazatel může být nulový) a ukazatel na předcházející položku (registr EDX, položkou může být záhlaví seznamu).

Ukazatele na sousední položky jsou připojeny k nové položce - do proměnné HASHE_Next nové položky je uložen ukazatel na následující položku a do proměnné HASHE_Prev nové položky je uložen ukazatel na předcházející položku (nebo záhlaví).

Ukazatel na následující položku (v registru ECX) může být nulový, v takovém případě se přeskočí další instrukce. Jinak se uloží ukazatel na novou položku do proměnné HASHE_Prev následující položky. Ukazatel na novou položku se uloží též do proměnné HASHE_Next předcházející položky. Je-li předcházející položkou záhlaví seznamu, uloží se ukazatel do proměnné HASHH_First záhlaví seznamu a nová položka bude novou první položkou seznamu.


Obsah / Utility / HASH / Nahrazení položky seznamu jinou položkou