GNU Assembler a zasobnik

fukas na centrum.cz fukas na centrum.cz
Sobota Leden 5 13:21:06 CET 2002


> > Potrebuji zavolat fci a predat ji parametry v zasobniku,
> > ale tak abych neztratil sve vlastni argumenty v zasobniku.
> > Priklad:
> >   sub   xxx,%ebsp   # nevim o kolik mam posunout zasobnik?
> >   pushl 0x18(%ebp)
> >   pushl (x)
> >   pushl 0x14(%ebp)
> >   pushl 0x8(%ebp)
> >   call  putpixel_nolock
> >   add   yyy,%esp   # yyy = 4*(pocet_pushl) + xxx
> 
> Ja Vam asi spatne rozumim.
> Ta funkce, kterou zavolate, si prece zase dane parametry z toho 
zasobniku 
> popne, a az udela ret, tak bude stack pointer presne stejny 
jako pred tim 
> callem.
> 
> Nebo ne?
 
Ja dany assembler kombinuji s C(C++) a tam plati pravidlo,
ze volajici uklizi. Tzn. Pokud ja nekoho zavolam a naplnim
zasobnik parametry, z hlediska konvence volany nesmi zasobik
uklidit. O to se stara volajici. Proto ja jako fce kterou nekdo
zavolal z C musim ponechat zasobnik tak jak jsem jej dostal(tzn.
muzu zmenit neco na zasobniku, ale velikost zasobniku a esp musi
zustat stejne, protoze fce ktera me z C zavolala tento zasobnik
taky uvolni. Co co jsem napsal nahore v asm neni moje konstrukce,
ale prekladace GCC. Bohuzel se mi zatim nepodarilo zjisit
jak danou hodnotu xxx generuje. 

Pro jistotu uvedu presnejsi priklad:
Soubor fce.s:

 .text
 
 .globl putpixel_nolock
 .globl fce1

 # putpixel_nolock(SDL_Surface *s,int x,int y,Uint32 color)
 putpixel_nolock:
    enter $0x0,$0x0
    ....

    leave
    ret 

 # fce1( ......... )
 fce1:
   enter $0x0,$0x0
   ....
   sub   xxx,%ebsp   # nevim o kolik mam posunout zasobnik?
   pushl 0x18(%ebp)
   pushl (x)
   pushl 0x14(%ebp)
   pushl 0x8(%ebp)
   call  putpixel_nolock
   add   yyy,%esp   # yyy = 4*(pocet_pushl) + xxx
   ...
   leave
   ret

Pokud me nekdo zavola z C tak mi preda parametry pres
zasobnik. Ja si chci sve parametry uchovat protoze s nimi
porad pracuji, ale zaroven potrebuji do zasobniku ulozit
parametry pro putpixel_nolock, kterou volam. V momente
az se vrati rizeni z call do me fce potrebuji abych zasobnik
(uklidil) dostal do puvodniho stavu, a nebo aspon aby
esp ukazoval na moje puvodni nezmenene parametry.

fuka

-----
Centrum pro milovníky peněz 
http://finance.centrum.cz 





Další informace o konferenci Linux