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

133

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

¿Cuáles son las herramientas populares para hacer esto?

Friki
fuente
Microsoft Visual C ++ Express acaba de establecer un punto de interrupción y presionaAlt +8
jyz
Posible duplicado: stackoverflow.com/questions/137038/…
legends2k

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.
Ruso empleado
fuente
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.

Zifre
fuente
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"
Viktor Sehr
fuente
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  #
osgx
fuente
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.

Bastien Léonard
fuente
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.

Adam Markowitz
fuente
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>.

Ori Pessach
fuente
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.

Nik
fuente
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.

Gomes JA
fuente
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.

Cătălin Pitiș
fuente
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.

Gibertoni
fuente
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
Pieter
fuente
¿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