Obsah / Utility / LIST / Podpůrné funkce
Zdrojový kód: INCLUDE\UTIL\LIST.INC, UTIL\LIST.ASM
Podpůrné funkce
Následující funkce jsou použity jako doplňkové operace prováděné nad seznamem prvků.
|
Funkce ListReplace 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 předcházející položku (registr ECX) a ukazatel na následující položku (registr EDX). Poté je předcházející položka propojena s nově vkládanou položkou seznamu a dále je nově vkládaná položka propojena s následující položkou seznamu.
|
Funkce ListXchgNext zajistí prohození dvou za sebou následujících prvků. V registru EBX je funkci předán ukazatel na aktuální prvek, tento prvek bude zaměněn s následujícím prvkem. Může se přitom jednat o jediný prvek seznamu.
Jako přechodné registry se použijí registry EAX a ECX, jejich obsahy jsou uchovány instrukcemi PUSH/POP. Do registru EAX je z aktuální položky načten ukazatel na předcházející položku, do registru ECX ukazatel na následující položku (tedy na položku, s níž má být provedena záměna). Následující položka je propojena s předcházející položkou pomocí makra LINKLINK. Dále již není ukazatel na předcházející položku potřeba a proto je do registru EAX z následující položky načten ukazatel na příští následující položku (tj. následující položka následující položky). Nakonec je aktuální položka připojena za původní následující položku a před původní příští následující položku.
|
Poslední funkcí je funkce ListSplice, která odpojí část seznamu a nahradí ho jiným seznamem. Vstupními parametry jsou ukazatel na záhlaví zdrojového seznamu v registru EAX a ukazatel na záhlaví cílového seznamu v registru EBX. Zdrojový seznam bude po operaci prázdný a jeho obsah bude začleněn na začátek cílového seznamu.
Registry ECX, EDX a ESI jsou použity jako přechodné registry, jejich obsahy jsou proto uchovány instrukcemi PUSH/POP. Zdrojový seznam je nejdříve ověřen, zda není prázdný, v tom případě funkce nepokračuje. Dále je nutno odpojit řetězec prvků ze zdrojového seznamu. Do registru ECX se načte ukazatel na první položku zdrojového seznamu, do registru EDX ukazatel na poslední položku zdrojového seznamu. Zdrojový seznam je inicializován na prázdný seznam pomocí makra LISTINIT.
Zdrojový seznam je nyní nutné připojit k cílovému seznamu. Do registru ESI je načten ukazatel na první položku cílového seznamu. První položka zdrojového seznamu je připojena k záhlaví cílového seznamu jako jeho první položka a poslední položka zdrojového seznamu je připojena před původní první položku cílového seznamu.
Obsah / Utility / LIST / Podpůrné funkce