¿Cómo puedo ver el código de ensamblaje para un programa C ++?


Respuestas:


167

Pregúntale al compilador

Si está compilando el programa usted mismo, puede pedirle a su compilador que emita una fuente de ensamblaje. Para la mayoría de los compiladores de UNIX, use el -Sconmutador.

  • Si está utilizando el ensamblador GNU, compilar con -g -Wa,-alhdará origen y ensamblaje entremezclados en stdout ( -Wasolicita al controlador del compilador que pase opciones al ensamblador, -alactiva el listado de ensamblaje y -ahagrega el listado de "fuente de alto nivel"):

    g++ -g -c -Wa,-alh foo.cc

  • Para Visual Studio, use /FAsc.

Echa un vistazo a lo binario

Si ha compilado binario,

Usa tu depurador

Los depuradores también podrían mostrarse de manera desastrosa.

  • Use el disascomando en GDB,
  • o la ventana de desmontaje de Visual Studio en Windows.

35

En GCC / G ++, compile con -S. Eso generará un something.sarchivo con el código de ensamblaje.

Editar: si desea que la salida esté en sintaxis Intel (que es IMO, mucho más legible, y la mayoría de los tutoriales de ensamblaje la usan), compile con -masm=intel.


55
agregue también la -fverbose-asmopción
osgx

23

En Visual Studio ;

  1. establecer un punto de interrupción
  2. ejecuta el programa hasta que se detenga en el punto de interrupción
  3. haga clic derecho en el código fuente y seleccione "mostrar desarmado"

14

Para gcc / g ++

gcc -save-temps -fverbose-asm prog.c

Esto generará prog.s con algunos comentarios sobre las variables utilizadas en cada línea asm:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

Mucha gente ya dijo cómo emitir código de ensamblaje con un compilador determinado. Otra solución es compilar un archivo de objeto y volcarlo con una herramienta como objdump , readelf (en Unix) o DUMPBIN ( enlace ) (en Windows). También puede volcar un ejecutable, pero será más difícil leer el resultado.

Esto tiene la ventaja de trabajar de la misma manera con cualquier compilador.


6

Cualquier depurador que esté utilizando debe tener una vista de ensamblaje (Visual Studio, Borland IDE, gdb, etc.). Si no está utilizando un depurador y simplemente quiere ver qué ensamblado está en un programa, puede usar un desensamblador o, alternativamente, ejecutar el programa y adjuntarlo con un depurador y hacer el volcado desde allí. Consulte las referencias a desensambladores para obtener información sobre las opciones.


5

Como alguien más mencionó, el depurador de su plataforma es un buen punto de partida. Para el martillo neumático de todos los depuradores y desensambladores, eche un vistazo a IDA Pro.

En las plataformas Unix / Linux (incluido Cygwin) puede usar objdump --disassemble <executable>.


Si hay una opción para que el compilador genere el ensamblador (como gcc -S, o la opción VS / FA a continuación), es preferible sobre el desmontaje. Es más simbólico.
Marco van de Voort

Claro, si tienes la fuente.
Ori Pessach

2
Por cierto, te sorprenderá cuánta información de símbolos puede deducir IDA Pro.
Ori Pessach

5

La mayoría de los compiladores tienen una opción para generar una lista de ensamblaje. Por ejemplo, con VisualStudio puede usar algo como:

cl.exe /FAfile.asm file.c

Sin embargo, para una mejor legibilidad, la mayoría de los depuradores ofrecerán una vista que intercala el desensamblaje con la fuente original, para que pueda comparar su código con la salida del compilador línea por línea.



3

También puede probar este sitio: http://assembly.ynh.io/

Allí, puede pegar su código C o C ++ y presionar un botón azul para ver la versión equivalente del ensamblaje.


FYI, no se pudo cargar
kaiwan

Sí, en 2015 estaba funcionando bien, y de repente se detuvo. Luego vino ctoassembly.com, pero funcionó solo para un pequeño subconjunto de C. Lo mismo sucedió: ya no se carga. Demasiado.
Gomes JA

2

En Visual Studio puede generar la lista de ensambladores para un proyecto C ++.

Vaya a las propiedades del proyecto, luego a C ++ / Archivos de salida y establezca la configuración de Salida del ensamblador y la ubicación de la lista ASM a un nombre de archivo.


1

En un Intel Mac OS X 10.8 (Mountain Lion) la -masm=inteldirectiva no funcionó. Sin embargo, si tiene instalado Xcode , debería haber instalado la herramienta llamada 'otool':

otool code.o -tV

Debe proporcionar el código objeto compilado como parámetro.


0

Si es usuario de Eclipse, puede usar la vista Desmontaje .

La vista Desmontaje muestra el programa cargado como instrucciones de ensamblador mezcladas con el código fuente para la comparación. La línea que se está ejecutando actualmente se indica mediante un marcador de flecha y se resalta en la vista. Puede realizar las siguientes tareas en la vista Desmontaje:

  • Establecer puntos de interrupción al comienzo de cualquier instrucción de ensamblador
  • Habilitar y deshabilitar puntos de interrupción y establecer sus propiedades
  • Siga las instrucciones de desmontaje de su programa
  • Ir a instrucciones específicas en el programa

¿Puedes elaborar un poco?
Peter Mortensen

También hay vista de ensamblaje al depurar en
MSVC

No tengo un entorno de desarrollo de Eclipse C ++ en funcionamiento en este momento, pero aquí está la documentación oficial: help.eclipse.org/kepler/…
Pieter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.