Du C en asm

Fermé
kokliko - 25 févr. 2005 à 11:57
 sirb - 22 mars 2010 à 09:35
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+
A voir également:
  • C asm
  • N asm - Télécharger - Édition & Programmation

6 réponses

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
ekra Messages postés 1870 Date d'inscription vendredi 15 avril 2005 Statut Membre Dernière intervention 24 juillet 2014 342
2 mai 2007 à 00:30
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
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
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
25 févr. 2005 à 12:00
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
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
Reeter Messages postés 120 Date d'inscription mercredi 13 août 2003 Statut Membre Dernière intervention 6 décembre 2005
25 févr. 2005 à 17:43
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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
missihafid Messages postés 59 Date d'inscription jeudi 29 octobre 2009 Statut Membre Dernière intervention 5 avril 2014
24 déc. 2009 à 15:21
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