----- Original Message -----
From: "Teodor Cimpoesu" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, March 14, 2002 4:19 PM
Subject: [rlug] Re: Programming


> 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.
Ce spui tu e corect dar nu inteleg: sintaxa este mov dest,src.
iar mov %esp, %ebp este echiv  cu esp=ebp ...
Totusi codul scris este obtinut prin compilare si apoi interpretat cu
debuggeru, la o asamblare in schimb apare movl ceea ce ar fi corect.

>
> > 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.
Poti sa-mi explici mai in detaliu aici? Adica ce s-ar gasi la 8 bytes
sub bp?
> > 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;
Bine dar int are 4 octeti de ce se scad 8?


> > 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)
Adica se inverseaza bit cu bit 0xfffffffc?
Nu ca n-ar iesi semnul. Nu inteleg, cum se obtine -4 din fffffffc
astfel ca instructiunea de mai sus sa fie corecta:
    mov %0x8(%ebp),%eax

> > 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).
Priceput.
>
> detalii la http://www.linuxassembly.org/linasm.html
>
> -- teodor
Multam fain
gabi

---
Send e-mail to '[EMAIL PROTECTED]' with 'unsubscribe rlug' to 
unsubscribe from this list.

Raspunde prin e-mail lui