Le mercredi 23 avril, Lucas Nussbaum a écrit :
> Je me demande ce qui cause une différence si importante entre ta
> version en C et ta version en assembleur optimisée à la main...
Tu peux essayer de compiler avec gcc -S et tu verras le code assembleur
qu'il produit. Il y a en particulier des instructions pour sauvegarder
certains registres à l'entrée de la fonction et pour les restaurer à la
sortie. C'est utile pour à peu près n'importe quelle fonction... sauf
_start().
> > .globl _start
> > _start:
> > movl $4, %eax # write(
> > movl $1, %ebx # 1,
> > movl $message, %ecx # message,
> > movl $14, %edx # 14
> > int $0x80 # );
> > movl $1, %eax # exit(
> > movl $0, %ebx # 0
> > int $0x80 # );
> > message:
> > .string "Hello, World!\n"
> >
> > Je compile avec
> >
> > as -o hello.o hello.s
> > ld --gc-sections hello.o -o hello
> > strip hello
>
> Avec les mêmes commandes, le même code, etc ... j'arrive à 348 octets !
> Comment faire pour savoir d'où viennent les différences ?
Il faut croire que mes outils de compilation ne sont pas efficaces.
J'utilise :
gcc-2.96-0.62mdk
binutils-2.11.90.0.8-5mdk
Tu peux voir ce qu'il y a dans le binaire avec "objdump -xds" et
"od -v -A x -t x1". En particulier objdump montre une section .dynamic
de 48 octets, inutile et remplie de zéros. od montre aussi un autre bloc
de zéros qui ne sert à rien (mais il faut avoir la doc du format ELF
sous le coude pour comprendre ce que sort od).
Si tu veux regarder et comparer, tu peux télécharger ma version en 544
octets à <URL:
http://www.edgar-bonet.org/misc/hello>.
Edgar.
--
Edgar Bonet Tél : 04 76 88 10 96
Laboratoire Louis Néel -- CNRS Mobile : 06 77 19 79 39
25 av. des Martyrs, BP 166 Fax : 04 76 88 11 91
38042 Grenoble cedex 9, France e-mail : guilde@???