Hi Gabriel!
On Thu, 14 Mar 2002, Gabriel Cernat wrote:
>
> Am cateva probleme referitoare la assembler din perspectiva
> unui program scris in C. Ma intereseaza cum se creaza frame
> stack si cum sunt preluate variabilele de catre procedura apelanta:
>
> Fie functiile:
>
> aduna(int a)
> {
> int b;
> b=a;
> //return (a+b);
> }
>
> main()
> {
> int x=0;
> //x=3;
> aduna(1);
> aduna(x);
> }
>
> In asamblare aduna arata cam asa
> push %ebp //pune bp pe stiva
> mov %esp, %ebp // mov dest, src
> //adica scrie ebp peste esp care indica varful stivei?
> //n-ar tb. ca esp peste ebp ca sa creeze un nou stack f.?
nope, sp devine bp.
> sub $0x4, %esp //muta sp in jos, adica face loc pe stiva?
> //pt ce?
int b; b are 4 octeti, sub $0x4, %esp resprezinta de fapt alocarea
celor 4 octeti pe stiva.
> mov %0x8(%ebp),%eax //mov dest,src
> // ce inseamna in primul rand %0x8(%ebp)?-o adresa referita fct. de ebp?
> //deci pun eax in adresa respectiva, dar ce anume se gaseste in eax caci
> //parametrul e pus pe stiva
ala e stack-frame-ul, si referirea la parametrii care ii primeste functia
se face relativ la %ebp.
> mov %eax, 0xfffffffc(%ebp) //
> leave // ce-i asta
leave `curata' ce a fost alocat pe stiva.
> ret
> mov %si,%si
>
> iar in main
> push %ebp //pune bp pe stiva
> mov %esp, %ebp // mov dest, src
> //iarasi de ce?
pen' ca asa-i in tenis.
> sub $0x8, %esp //sub dest,src
> // la ce bun?
din cauza de int x;
> movl $0x0, 0xfffffffc(%ebp) // seteaza variabila x=0 la
> // o adresa care nu stiu cum e obtinuta
foarte simplu 0 -> [%ebp + (-4)] :)
sintaxa este offset(base,index,scale)
> sub $0xc, %esp
> push $0x1 //in sfarsit ceva: parametrul
> call aduna // e primul apel
> .....
>
> Variabilele sunt puse pe stiva in schimb procedura apelanta
> pare (?) ca nu ia nimic de pe stiva.
nu face pop, pentru ca atunci leave o sa intre in balarii.
le adreseaza direct de acolo (vezi mai sus).
detalii la http://www.linuxassembly.org/linasm.html
-- teodor
---
Send e-mail to '[EMAIL PROTECTED]' with 'unsubscribe rlug' to
unsubscribe from this list.