2010-05-22 16 views
9

¿alguien puede explicar, tengo un programa en C, puedo convertirlo a ensamblaje? si es así, ¿cómo?de C a ensamblado

+0

Estoy seguro de que dev-cpp tiene opciones (similares a gcc) para producir resultados de ensamblaje. No sé si dev-cpp tiene los mismos ganchos para _intermediate_ output, pero no creo que realmente los necesites para lo que estás preguntando. –

Respuesta

21

Si utiliza gcc que puede hacer gcc -O2 -S -c foo.c acuerdo con this página para obtener la salida montaje en una forma legible por humanos.

+0

y la página explica también cómo obtener el código fuente y asm generado :-) +1 – garph0

+0

@Anders Abel: si necesito algo especial? por ejemplo pdp-11? – lego69

+2

Use un crosscompiler, que produce código para el arco que le gustaría. – Johan

3

Eso es lo que hace su compilador.

El compilador compila su programa C con el lenguaje de la máquina, que es una representación binaria del programa de la máquina. Cuando un humano quiere escribir un lenguaje de máquina, lo escribe en ensamblador, que se traduce al lenguaje binario de la máquina.

El código de ensamblador es simplemente una forma legible por humanos del lenguaje de máquina binaria.

El programa C:

$ cat test.c 
#include <stdio.h> 

int main(int argc, char **argv) { 
    int a = 11+12; 
    printf("a = %d\n", a); 
    return 0; 
} 

compilar que

$ gcc -c test.c 

desmontarlo:

$ objdump -d test.o 

test.o:  file format elf32-i386 


Disassembly of section .text: 

00000000 <main>: 
    0: 55      push %ebp 
    1: 89 e5     mov %esp,%ebp 
    3: 83 e4 f0    and $0xfffffff0,%esp 
    6: 83 ec 20    sub $0x20,%esp 
    9: c7 44 24 1c 17 00 00 movl $0x17,0x1c(%esp) 
    10: 00 
    11: b8 00 00 00 00   mov $0x0,%eax 
    16: 8b 54 24 1c    mov 0x1c(%esp),%edx 
    1a: 89 54 24 04    mov %edx,0x4(%esp) 
    1e: 89 04 24    mov %eax,(%esp) 
    21: e8 fc ff ff ff   call 22 <main+0x22> 
    26: b8 00 00 00 00   mov $0x0,%eax 
    2b: c9      leave 
    2c: c3      ret  
+0

por ejemplo, estoy usando dev-cpp, ¿dónde puedo encontrar esta opción? – lego69

+0

busque en las opciones del generador de código/compilador del proyecto, busque algo como "generar listados de ensamblaje" – garph0

5

Con gcc, se puede utilizar la opción -S:

gcc -O2 -S myfile.c 

mayoría de las otras opciones (como la -O2) se puede utilizar aquí también, para determinar qué tipo de código ensamblador obtiene producido.

Sin embargo, tenga en cuenta que esto simplemente expone un paso intermedio que el compilador realiza de todos modos (no la generación de un archivo fuente de ensamblaje, sino el código de máquina que representa). El resultado final, después de pasar este código a través de un ensamblador no será diferente de simplemente compilar directamente a código de máquina.

3

Su compilador debe tener alguna opción para hacerlo. Por ejemplo, para gcc puedes usar la opción -S. Un breve ejemplo:

// test.c 

#include <stdio.h> 

int 
main() 
{ 
    printf ("hello, world\n"); 
    return 0; 
} 

compilarlo con la opción -S. Esto producirá un archivo test.s que contendrá el conjunto:

.file "test.c" 
    .section .rodata 
.LC0: 
    .string "hello, world" 
    .text 
.globl main 
    .type main, @function 
main: 
    leal 4(%esp), %ecx 
    andl $-16, %esp 
    pushl -4(%ecx) 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ecx 
    subl $4, %esp 
    movl $.LC0, (%esp) 
    call puts 
    movl $0, %eax 
    addl $4, %esp 
    popl %ecx 
    popl %ebp 
    leal -4(%ecx), %esp 
    ret 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" 
    .section .note.GNU-stack,"",@progbits 
+0

si necesito algo especial? por ejemplo pdp-11? – lego69

1

La mayoría de los compiladores tienen alguna opción para generar listados de montaje junto con los archivos binarios. En Visual Studio puede encontrarlo en la sección "generación de código" en las propiedades del archivo.
Con gcc puede usar -S-switch (mayúscula S)
Finalmente, si tiene un binario, puede usar objdump -S (mayúscula S).

0

Ver this question. This answer puede ser útil cuando tenga la intención de leer el conjunto. Además, puede compilar un programa y luego usar disasm para obtener resultados de ensamblaje.

1

Como mencionó Dev-C++, vale la pena mencionar que la bandera -S también funciona allí. Suponiendo que Windows, Dev-C++ todavía nombre el .exe de salida, pero el resultado no será un archivo ejecutable así que simplemente cambie la extensión a .txt o lo que sea para que pueda leerse en el editor de su elección. Agregue opciones/indicadores en Proyecto> Opciones de proyecto> Parámetros> Compilador o Herramientas> Opciones de compilación.

+0

HAHA! ¡¡bien!! ¡increíble! Había estado buscando esto durante media hora y ayer toda la tarde. ¡aquí está finalmente! ¡No encontré que hay que cambiarle el nombre a un formato de documento! ¡Maldita sea que fui trolled! ¡Muchas gracias señor! –

Cuestiones relacionadas