Compilateur C, traduire en langage machine

funkeen Messages postés 232 Statut Membre -  
Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, j'apprend le C et j'aimerais le lancer et voir le langage machine de mon code en C, comment faire ? ( j'ai CODE::BLOCKS)

merci d'avance

1 réponse

  1. Hxyp Messages postés 401 Date d'inscription   Statut Membre Dernière intervention   54
     
    Bonjour, vous pouvez utiliser un désassembler après la compilation, le debugger gdb le fait avec la commande disass.
    A la compilation avec gcc vous pouvez générer un fichier asm avec l'option -S je ne sais pas comment y parvenir à partir de codeblocks, le plus simple à faire est de créer un .bat, par exemple pour générer l'asm du fichier main.c dans le .bat j'y met :
    c:\mingw\bin\gcc -S main.c
    ceci dans un fichier.bat dans le dossier du projet va générer un fichier main.s et dedans il y a le code en assembleur exemple :
    	.file	"main.c"
    	.def	___main;	.scl	2;	.type	32;	.endef
    	.section .rdata,"dr"
    LC0:
    	.ascii "Hello world!\0"
    	.text
    .globl _main
    	.def	_main;	.scl	2;	.type	32;	.endef
    _main:
    	pushl	%ebp
    	movl	%esp, %ebp
    	andl	$-16, %esp
    	subl	$16, %esp
    	call	___main
    	movl	$LC0, (%esp)
    	call	_puts
    	movl	$0, %eax
    	leave
    	ret
    	.def	_puts;	.scl	2;	.type	32;	.endef
    

    Et un .bat pour désassembler après compilation en utilisant gdb :
    c:\mingw\bin\gdb bin\Debug\main.exe
    cette ligne dans un fichier debug.bat va charger l'executable dans gdb et y a plus qu'à utiliser les commandes, par exemple "disass main" va afficher le code de la fonction main
    (gdb) disass main
    Dump of assembler code for function main:
       0x00401344 <+0>:     push   %ebp
       0x00401345 <+1>:     mov    %esp,%ebp
       0x00401347 <+3>:     and    $0xfffffff0,%esp
       0x0040134a <+6>:     sub    $0x10,%esp
       0x0040134d <+9>:     call   0x401990 <__main>
       0x00401352 <+14>:    movl   $0x403024,(%esp)
       0x00401359 <+21>:    call   0x401c00 <puts>
       0x0040135e <+26>:    mov    $0x0,%eax
       0x00401363 <+31>:    leave
       0x00401364 <+32>:    ret
    End of assembler dump.
    (gdb)
    1