Uvolneni pameti – Assembler – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Uvolneni pameti – Assembler – Fórum – Programujte.comUvolneni pameti – Assembler – Fórum – Programujte.com

 

BigBear0
Stálý člen
4. 5. 2010   #1
-
0
-

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

Nahlásit jako SPAM
IP: 94.74.255.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
BigBear0
Stálý člen
4. 5. 2010   #2
-
0
-

Dobry, tak jsem upe hloupy, ja se proste assembleru bojim a neuvedomuji si, ze to je normalni programovaci jazyk... nejlepsi zpusob je tak, jak bych to delal vsude jinde... rekurzi... uz to mam, dekuji :-)

Nahlásit jako SPAM
IP: 94.74.255.–
NECIN DRUHYM TO, CO NECHCES, ABY ONI CINILI TOBE!
liborb
~ Redaktor
+18
Guru
5. 5. 2010   #3
-
0
-

BTW uvolnění seznamu rekurzí není nejlepší způsob (při opravdu dlouhém seznamu bys poznal proč :smile1: ). Lepší způsob je uložit si ukazatel na další položku, aktuální uvolnit a přejít na tu uloženou. Ovšem absolutně netuším, jak moc je to v assembleru složité :smile11:

Nahlásit jako SPAM
IP: 85.207.166.–
m->29+6
Super člen
5. 5. 2010   #4
-
0
-

No neviem prečo by si si všetko mal kopírovať do poľa? Veď ti stačí si uložiť prvý prvok zoznamu a počiatok zozname posunúť na nasledujúci prvok. Potom prvý prvok uvoľníš a opakuješ cyklus. Rekurzia je fajn, ale pri dlhších zoznamoch by si toho musel kopu kopírovať a možno by ti došla pamäť na zásobníku ako píše liborg.

mov eax,[list]  ; zoznam v eax

free_list:
test eax,eax
jz list_freed
mov ebx,eax ; 1. prvok v EBX
add eax,list.size ; posun na dalsi prvok
push ebx
invoke free
add esp, 4
jmp free_list
list_freed:

Nahlásit jako SPAM
IP: 147.229.208.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 28 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý