GNU Assembler a zasobnik

Míla Kuchta mila.kuchta na atlas.cz
Sobota Leden 5 17:16:19 CET 2002


fukas na centrum.cz wrote:
>> > 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

To je docela logicke, protoze jinak byste se pres ret ani nevratil a
musil byste pouzit jump:-).

> 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?

Tohle je typicka alokace prostoru pro lokalni (automaticke:-)) promenne.
Je to skoro to same jako enter xxx, 0.
Nema to %ebsp byt spise %esp?

Alokujte kolik potrebujete s tim, ze to potom odstanite pres add xxx,
%esp, pop, nebo to za sebe nechate udelat leave (v konjunkci s enter).

Inteligentnejsi by bylo si nejdriv ulozit na zasobnik %ebp, pak ulozit
%esp do %ebp, pracovat s %ebp, nakonec ulozit %ebp zpet do %esp a
%obnovit %ebp. Pro zjednoduseni psani "vysokourovnovych" modulu k tomu
Intel koneckoncu poskytl instrukce enter/leave.

S pozdravem

Mila Kuchta



Další informace o konferenci Linux