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