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.

Raspunde prin e-mail lui