Ahojte, potreboval bych poradit, jak pouzit funkci free z cecka v assembleru:
struct alist {
char key;
unsigned short value;
struct alist *next;
}; /* struktura asociativniho seznamu */
/* a potrebuji napsat funkci free_list pomoci inline assembleru (posledni prvek seznamu je vzdy NULL */
void free_list(struct alist *list)
{
_asm {
// jak na to?
}
}
jako dobry napad vypada toto: seznam nejdrive projit a do nejakeho pomocneho pole si ukladat jednotlive ukazatele. Pak projit to pole a v kazdem cyklu vzit prvek, pushnout ho na zasobnik, zavolat free a upravit zasobnik.
Jenze ja nevim, co mam ukladat do toho pole. Projit ten seznam od zacatku do konce je easy, ukladat hodnoty do pole je taky easy, ale co mam ukladat? Kdyz to udelam takto, tak to fungovat nebude (nejde to spustit, budu to jen popisovat, at to sem nemusim programovat cele):
_asm {
mov ebx, list
// projdu seznam a spocitam kolik ma prvku (v kazdem kroku tedy zmenim ebx na [ebx + 4]) - umim
// pak pouziju malloc na alokovani tohoto poctu ukazatelu, takze v eax budu mit ono misto - umim
// projdu seznam jeste jednou a ted uz vkladam adresy do eax (v edi si budu udrzovat index) - NEVIM JAK NA TO
cykli:
// nactu si ukazatel do edx
// (ale tohle je asi spatne, mel bych tam mit adresu toho ukazatele, ne? a jak to mam udelat?)
mov edx, [ebx + 4]
// do eax tedy vlozim nacteneho ukazatele
mov dword ptr[eax + edi * 4], edx
// posunu se na dalsi prvek
mov ebx, [ebx + 4]
// zvysim edi
inc edi
// a toto provadim az dokud nenarazim na NULL
jmp cykli
// nasledne projdu pole, ktere mam v eax (index si budu udrzovat v esi)
cykli:
// nactu prvek na zasobnik
push [eax + esi * 4]
// zavolam free
call free
// upravim zasobnik
add esp, 4
// toto provadim az do NULL
jmp cykli
// a ted si samozrejme vratim, co potrebuji
}
Jak na to prosim? (jde mi opravdu jen o to, co a jak ukladat do toho pole, ktere pak budu prochazet a volat free) Dekuji