|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
[C++/Assembler] Meccanismo di traduzione
Mi servirebbe qualche documentazione che parla del meccanismo di traduzione che fa il compilatore GNU per tradurre da C++ ad assembler (prima di assemblare e linkare)...
Vi faccio un esempio : prova.cpp Codice:
#include "prova.h" cl::cl(st* ps = 0, int aa[] = 0) { int i; if (ps!=0 && aa!=0) for (i=0;i<4;i++) { ii[i]= aa[i]; dd[i] = 0; s.vv1[i] = ps->vv1[i]; s.vv2[i] = ps->vv2[i]; s.vv3[i] = ps->vv3[i]; } } cl cl::elab1(cl cla) { int i; cl cc(cla); for (i=0;i<4;i++) { cc.ii[i] = ii[i]; cc.s.vv1[i] = cc.s.vv2[i] = s.vv1[i]+s.vv2[i]; } return cc; } g++ -S prova.cpp -o prova.asm ottengo il corrispondente assembler : Codice:
.file "prova.cpp" gcc2_compiled.: ___gnu_compiled_cplusplus: .def ___terminate; .scl 2; .type 32; .endef .def ___sjthrow; .scl 2; .type 32; .endef .text .align 4 .globl ___2clP2stPi .def ___2clP2stPi; .scl 2; .type 32; .endef ___2clP2stPi: pushl %ebp movl %esp,%ebp subl $28,%esp pushl %edi pushl %esi pushl %ebx movl 8(%ebp),%edx cmpl $0,12(%ebp) je L302 cmpl $0,16(%ebp) je L302 movl $0,-4(%ebp) .align 4 L298: cmpl $3,-4(%ebp) jle L301 jmp L302 .align 4 L301: movl -4(%ebp),%eax movl %eax,%ecx leal 0(,%ecx,4),%eax movl -4(%ebp),%ecx leal 0(,%ecx,4),%ebx movl 16(%ebp),%ecx movl (%ecx,%ebx),%ebx movl %ebx,(%eax,%edx) movl -4(%ebp),%eax movl %eax,%ecx leal 0(,%ecx,8),%eax leal 16(%edx),%ecx movl $0,(%eax,%ecx) movl $0,4(%eax,%ecx) movl -4(%ebp),%eax movl %eax,%ecx leal 0(,%ecx,4),%eax leal 48(%edx),%ecx movl 12(%ebp),%ebx movl -4(%ebp),%esi movl %esi,%edi leal 0(,%edi,4),%esi movl (%esi,%ebx),%ebx movl %ebx,(%eax,%ecx) movl -4(%ebp),%eax movl %eax,%ecx leal 0(,%ecx,4),%eax leal 64(%edx),%ecx movl 12(%ebp),%ebx movl -4(%ebp),%esi movl %esi,%edi leal 0(,%edi,4),%esi addl $16,%ebx movl (%esi,%ebx),%esi movl %esi,(%eax,%ecx) movl -4(%ebp),%eax movl %eax,%ecx leal 0(,%ecx,8),%eax leal 80(%edx),%ecx movl 12(%ebp),%ebx movl -4(%ebp),%esi movl %esi,%edi leal 0(,%edi,8),%esi addl $32,%ebx fldl (%esi,%ebx) fstpl (%eax,%ecx) L300: incl -4(%ebp) jmp L298 .align 4 L299: L297: L302: movl %edx,%eax jmp L296 L296: leal -40(%ebp),%esp popl %ebx popl %esi popl %edi leave ret .align 4 .globl _elab1__2clT0 .def _elab1__2clT0; .scl 2; .type 32; .endef _elab1__2clT0: pushl %ebp movl %esp,%ebp subl $188,%esp pushl %edi pushl %esi pushl %ebx movl 8(%ebp),%eax movl 12(%ebp),%edx leal -128(%ebp),%edi leal 16(%ebp),%esi cld movl $28,%ecx rep movsl movl $0,-4(%ebp) .align 4 L304: cmpl $3,-4(%ebp) jle L307 jmp L305 .align 4 L307: movl -4(%ebp),%ecx movl %ecx,%ebx leal 0(,%ebx,4),%ecx leal -128(%ebp),%ebx movl -4(%ebp),%esi movl %esi,%edi leal 0(,%edi,4),%esi movl (%esi,%edx),%edi movl %edi,(%ecx,%ebx) movl -4(%ebp),%ecx movl %ecx,%ebx leal 0(,%ebx,4),%ecx leal -80(%ebp),%ebx movl -4(%ebp),%esi movl %esi,%edi leal 0(,%edi,4),%esi leal -64(%ebp),%edi movl %edi,-168(%ebp) movl -168(%ebp),%edi addl %esi,%edi movl %edi,-164(%ebp) movl -4(%ebp),%edi movl %edi,-132(%ebp) movl -132(%ebp),%esi sall $2,%esi movl %esi,-168(%ebp) leal 48(%edx),%edi movl %edi,-136(%ebp) movl -4(%ebp),%esi movl %esi,-140(%ebp) movl -140(%ebp),%edi movl %edi,-144(%ebp) movl -144(%ebp),%esi sall $2,%esi movl %esi,-148(%ebp) leal 64(%edx),%edi movl %edi,-152(%ebp) movl -136(%ebp),%esi movl -168(%ebp),%edi movl (%edi,%esi),%esi movl %esi,-168(%ebp) movl -152(%ebp),%edi movl -148(%ebp),%esi movl (%esi,%edi),%edi movl %edi,-156(%ebp) movl -168(%ebp),%edi addl -156(%ebp),%edi movl %edi,-160(%ebp) movl -160(%ebp),%edi movl -164(%ebp),%esi movl %edi,(%esi) movl -160(%ebp),%esi movl %esi,(%ecx,%ebx) L306: incl -4(%ebp) jmp L304 .align 4 L305: movl %eax,%edi leal -128(%ebp),%esi cld movl $28,%ecx rep movsl jmp L303 L303: movl %eax,%eax leal -200(%ebp),%esp popl %ebx popl %esi popl %edi leave ret $4 Grazie ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
L'enoteca sotto casa tua deve fare affari d'oro
![]() A parte gli scherzi, sperando che non intendi sapere come il gcc effettua la traduzione in assembler, non ho capito...cosa non hai capito
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Mi serve di sapere il metodo con cui il gcc traduce i nomi delle funzioni in assembler...
Ad esempio : ___2clP2stPi è la traduzione del costruttore di cl... Dal nome della funzione si vedono anche i parametri che deve ricevere...P2st è un puntatore a una struttura st...Pi è un puntatore ad un intero... _elab1__2clT0 è la traduzione di cl::elab1...ed anche qui si dovrebbe capire ciò che viene passato dalla nomenclatura... C'è uno standard ben preciso per assegnare questi nomi... Mi serve per un esame... Quello che devo fare in questo scritto è scrivere da un file .cpp un traduzione in assembler con i nomi di funzione compatibili in modo che possa venire linkato insieme al normale codice C++ (ad un main per esempio)... In pratica devo simulare ciò che fa il compilatore...facendogli "saltare" il primo passo di compilazione... |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ovviamente fino a un paio di mesi fa lo sapevo...
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
Ok ho ritrovato qualcosa...
il "nome" dell'oggetto è una combinazione del nome di classe, nome (e tipo) dell'oggetto, tipo dei parametri. Il tipo dei parametri può essere esaminato con typeid; ad es. esegui questo programma: Codice:
#include <typeinfo> #include <iostream> class foo { public: int bar1(char *, int, float, double); void bar2(char *, int, float, double); }; int foo::bar1(char *, int, float, double) { return 0; } void foo::bar2(char *, int, float, double) { } int main(int argc, char **argv) { cout << "suffisso di classe: " << typeid(foo).name() << endl << "int foo::bar1(char *, int, float, double) " << typeid(foo::bar1).name() << endl << "void foo::bar2(char *, int, float, double) " << typeid(foo::bar2).name() << endl << "Nomi effettivi: objdump -t " << argv[0] << " |grep foo" << endl; return 0; }
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Ti ringrazio...ma ho trovato tutto su una dispensa che mi ero scordato di avere
![]() Comunque il tuo metodo mi potrebbe servire... |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2007
Messaggi: 1574
|
calcolatori elettronici con Frosini??
__________________
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:13.