Du C en asm

kokliko -  
 sirb -
bonjour tout le monde !

voila, j'aimerai savoir si c'etait possible par un tools ou autre de rendre un code C en asm.
Par exemple gdb, il met vraiment en asm ?

test :

voici un ptit prog c :

---------------------
#include <stdio.h>

int main()
{
printf("hello\n");
}
---------------------

bash-2.05b$ hw
hello
bash-2.05b$ gdb hw
GNU gdb 6.1.1
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i486-slackware-linux"...Using host libthread_db library "/lib/libthread_db.so.1".

(gdb) disassemble main
Dump of assembler code for function main:
0x08048384 <main+0>: push %ebp
0x08048385 <main+1>: mov %esp,%ebp
0x08048387 <main+3>: sub $0x8,%esp
0x0804838a <main+6>: and $0xfffffff0,%esp
0x0804838d <main+9>: mov $0x0,%eax
0x08048392 <main+14>: sub %eax,%esp
0x08048394 <main+16>: sub $0xc,%esp
0x08048397 <main+19>: push $0x8048474
0x0804839c <main+24>: call 0x80482b0 <_init+56>
0x080483a1 <main+29>: add $0x10,%esp
0x080483a4 <main+32>: leave
0x080483a5 <main+33>: ret
0x080483a6 <main+34>: nop
0x080483a7 <main+35>: nop
0x080483a8 <main+36>: nop
0x080483a9 <main+37>: nop
0x080483aa <main+38>: nop
0x080483ab <main+39>: nop
0x080483ac <main+40>: nop
0x080483ad <main+41>: nop
0x080483ae <main+42>: nop
0x080483af <main+43>: nop
---Type <return> to continue, or q <return> to quit---
End of assembler dump.

Si je veux rendre ce petit code en asm, je peux le faire via cet outil ?
Si oui, comment ?
Si non, existe t'il une methode ?

merci de votre comprehension
a+

6 réponses

  1. sirb
     
    Comme le faisait remarquer ekra, il est inutile d'utiliser un désassembleur pour obtenir le code assembleur d'un programme dont on possède le code source. En effet, lorsque gcc compile un programme C pour en faire un programme exécutable, il lui fait subir une série de transformations intermédiaires (mais ne le mentionne pas dans la console par défaut, il faut ajouter l'option -v à la ligne de commande pour le voir) :

    Code C => Code assembleur => Fichier objet => Programme exécutable

    L'option -S dont parle ekra permet d'interrompre la chaîne de compilation une fois le code assembleur généré, et vous récupérez donc ce code assembleur à la fin (dans un fichier portant l'extension .s par défaut).

    Un désassembleur permet, à partir d'un programme exécutable, de revenir au code assembleur :

    Programme exécutable => Code assembleur

    Enfin, pour corriger quelques à priori sur la légalité de l'emploi d'un désassembleur, c'est très simple : Désassembler un programme ne pose de problème que si la license l'interdit (vous savez bien, le truc que personne ne lit jamais quand on installe un programme mais qu'il faut accepter pour continuer ...). Quand il y a écrit quelque part "il vous est interdit de modifier ou désassembler ce programme, ..." vous violez la license si vous le désassemblez. Dans le cas contraire, je ne vois pas pourquoi ça serait interdit ;)
    5
  2. ekra Messages postés 1873 Statut Membre 342
     
    Inutile de désasembler ! Vous possédez déjà la source....
    Ca ne sert à rien de compiler puis de désassembler. Il faut s'arreter à l'avant derniere étape de la compilation, à la génération du code assembleur.

    $ gcc -S helloWorld.c

    Zatsit !
    2
    1. NewB
       
      Pour avoir le code assembleur avec une syntaxe intel :

      gcc -S -masm=intel file.c

      le résultat se retrouvera dans file.s

      Sinon, pour plus de details se reporter à la doc de gcc.
      0
  3. Reeter Messages postés 120 Statut Membre
     
    lol t'as un TP d'assembleur et tu préfères le faire en C :D

    Non, bon sinon, il existe des logiciels qui désassemblent un programme, et qui te sortent le code assembleur... Je sais pas si c tres légal, mais si c toi qui fait le logiciel que tu désassemble, je ne vois pas trop d'inconvénients!
    Logiciels: WDasm, PE Dasm, ...

    Apres, je peux pas trop t'en dire plus, je m'en suis jamais servi! Au pire mon post aura servi a garder ton thread en première page!! :D
    0
  4. kokliko
     
    ah nan pas du tout, j'ai pas de TP, mais c'est une question qui me trotte dans la tete, et si c'est possible, j'aimerai savoir l'appliquer...

    sinon gdb est un debogger, et il marche exclusivement sur linux..
    merci a toi en tout cas Reeter..

    sinon, pour le reste du forum, vous en pensez quoi ?

    merci d'avance
    0
    1. Reeter Messages postés 120 Statut Membre
       
      oui je connais gdb, je disais juste que je ne me suis jamais servi des logiciels que je nommais!

      je crois que gdb fonctionne sous zindoze aussi....
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. kokliko
     
    Bonjour, j'ai trouve un moyen avec gcc

    bash-2.05b$ cat hw.c
    #include <stdio.h>

    int main()
    {
    printf("hello world");
    }
    bash-2.05b$ gcc -S hw.c
    bash-2.05b$ cat hw.s
    .file "hw.c"
    .section .rodata
    .LC0:
    .string "hello world"
    .text
    .globl main
    .type main, @function
    main:
    pushl %ebp
    movl %esp, %ebp
    subl $8, %esp
    andl $-16, %esp
    movl $0, %eax
    subl %eax, %esp
    subl $12, %esp
    pushl $.LC0
    call printf
    addl $16, %esp
    leave
    ret
    .size main, .-main
    .section .note.GNU-stack,"",@progbits
    .ident "GCC: (GNU) 3.3.4"
    bash-2.05b$ nasm hw.s
    hw.s:1: error: attempt to define a local label before any non-local labels
    hw.s:1: error: parser: instruction expected
    hw.s:2: error: attempt to define a local label before any non-local labels
    hw.s:2: error: parser: instruction expected
    hw.s:3: error: attempt to define a local label before any non-local labels
    hw.s:4: error: attempt to define a local label before any non-local labels
    hw.s:4: error: parser: instruction expected
    hw.s:5: error: attempt to define a local label before any non-local labels
    hw.s:6: error: attempt to define a local label before any non-local labels
    hw.s:6: error: parser: instruction expected
    hw.s:7: error: attempt to define a local label before any non-local labels
    hw.s:7: error: parser: instruction expected
    hw.s:9: error: parser: instruction expected
    hw.s:10: error: parser: instruction expected
    hw.s:11: error: parser: instruction expected
    hw.s:12: error: parser: instruction expected
    hw.s:13: error: symbol `movl' redefined
    hw.s:13: error: parser: instruction expected
    hw.s:14: error: symbol `subl' redefined
    hw.s:14: error: parser: instruction expected
    hw.s:15: error: symbol `subl' redefined
    hw.s:15: error: parser: instruction expected
    hw.s:16: error: symbol `pushl' redefined
    hw.s:16: error: parser: instruction expected
    hw.s:18: error: parser: instruction expected
    hw.s:21: error: parser: instruction expected
    hw.s:22: error: parser: instruction expected
    hw.s:23: error: parser: instruction expected

    On dirait pas que ca donne du code valide, une idee ?
    merci d'avance
    0
    1. me
       
      GCC semble te générer de la syntaxe AT&T alors que NASM ne comprend que la syntaxe Intel. Tu ferais mieux d'utiliser GAS.
      0
  7. missihafid Messages postés 66 Statut Membre
     
    bonjour,
    moi aussi je cherche à compiler un programme en c à un assembleur 8086.
    est ce que je peux utiliser logiciel -WDasm-? mais je ne sais pas où je mets mon programme en c que je veux compiler.
    merci à vous.
    a+
    0