¿alguien puede explicar, tengo un programa en C, puedo convertirlo a ensamblaje? si es así, ¿cómo?de C a ensamblado
Respuesta
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.
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
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.
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
si necesito algo especial? por ejemplo pdp-11? – lego69
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).
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.
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.
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! –
- 1. llamando a funciones de ensamblado desde c
- 2. C# - puede hacer una referencia de ensamblado "débil" a un ensamblado con nombre fuerte
- 3. EncuadernaciónRedireccionar a un nombre de ensamblado diferente
- 4. C#: ¿En qué ensamblado se define SHDocVw.WebBrowser_V1?
- 5. ¿Cómo puedo llamar a un ensamblado de .NET desde C/C++?
- 6. Creación de un administrado (/ CLR) C++ ensamblado con nombre-
- 7. ¿Puede un ensamblado C# .dll contener un punto de entrada?
- 8. Cómo reasignar versión de ensamblado
- 9. Conversión del código de ensamblado al código C
- 10. Método C# que se ejecuta después de cargar el ensamblado
- 11. Ver tanto el código de ensamblado como el código C
- 12. No encontraste System.Windows Ensamblado
- 13. Ensamblado de enlace y redirección
- 14. Cómo reutilizar un ensamblado .Net desde una aplicación C pura
- 15. ¿Dónde está mi ensamblado Microsoft.Windows.Themes?
- 16. en un nombre de ensamblado cualificado pasado a Type.GetType()
- 17. ¿Resolviendo una referencia de ensamblado .NET a un nombre diferente?
- 18. Generar un ensamblado visible de COM desde C++ administrado (C++/CLI)
- 19. MSBuild llegar referencia de ensamblado de ProjectReference
- 20. Obtener la ejecución del nombre del ensamblado a partir de la DLL a la que se hace referencia en C#
- 21. ejecuta un código de ensamblado en ubuntu
- 22. Descargue forzosamente DLL del ensamblado
- 23. Nombrando un ensamblado "central"
- 24. Programmatically modify Ensamblado Encuadernación
- 25. definición de manifiesto del ensamblado ubicado no coincide con referencia al ensamblado
- 26. Salida de enteros en ensamblado en Linux
- 27. ¿Cómo acceder a una clase estática en el mismo espacio de nombres pero a otro ensamblado?
- 28. HRESULT: 0x80131040: definición de manifiesto del ensamblado ubicado no coincide con la referencia de ensamblado
- 29. Recursos de idioma de ensamblado en línea
- 30. ResourceDictionary en un ensamblado aparte
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. –