2010-10-01 12 views
13

Me gustaría aprender a leer el código de ensamblado generado por el compilador. ¿Dónde y cómo podría evaluar el código de ensamblaje generado a partir de C++?Código de ensamblaje en C++

Gracias

Respuesta

3

Desde su archivo de objeto:

$ g++ -g -c -Wall yourfile.cpp -o yourfile.o 

continuación:

$ gdb yourfile.o 

Una vez en BGF se podrían utilizar disassemble comando para ver el ensamblado generado.

tanto, si su C++ fuente es:

int f() { return 1; } 

que puede hacer en BGF:

(gdb) disassemble f 

Y la salida será:

Dump of assembler code for function f: 
0x00000000 <f+0>:  push %ebp 
0x00000001 <f+1>:  mov %esp,%ebp 
0x00000003 <f+3>:  mov $0x1,%eax 
0x00000008 <f+8>:  pop %ebp 
0x00000009 <f+9>:  ret 
+0

La opción del compilador para generar listados de montaje es mucho más útil que la ejecución de un desensamblador, porque va a mostrar código fuente con la Asamblea. –

+0

@Ben Voigt: 100% contigo en eso. Sin embargo, eso no hace que mi respuesta sea incorrecta. Es solo otra forma de hacerlo. Podría ser útil si no tiene el código fuente, por ejemplo. –

3

Si estás usando gcc, usa el argumento -S y la salida del compilador no pasará por el ensamblador.

4

Es probable que su compilador tenga una opción para generar código de ensamblaje, opcionalmente entrelazado con el código fuente correspondiente. En Microsoft Visual C++ v10 esto es /Fa.

O, simplemente mire los dos uno al lado del otro en su depurador.

Sin embargo, si mira esto, asegúrese de comparar las versiones compiladas con y sin optimización. Es sorprendente ver cuánto pueden descartar los compiladores de hoy sin afectar el funcionamiento del programa.

1

Para GCC y objdump. Using GCC to produce readable assembly?

Para Visual Studio, si está utilizando el IDE, puede modificar la C/inmueble C++ archivos de salida 'en las propiedades de su proyecto, y el cambio 'Salida de ensamble' a 'Asamblea con el código fuente'

Este es también el indicador '/ Fas' para el compilador de Visual C++.

+0

¡Existe la pregunta que estaba buscando! – mkb

1
//a.cpp 
#include <iostream> 

int main() 
{ 
    std::cout << "hello"; 
} 

En gcc puede utilizar la opción -S, es decir gcc -S a.cpp genera a.s

(a.s): 

     .file "a.cpp" 
.lcomm __ZStL8__ioinit,1,1 
     .def ___main;  .scl 2;  .type 32;  .endef 
     .section .rdata,"dr" 
LC0: 
     .ascii "hello\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, 4(%esp) 
     movl $__ZSt4cout, (%esp) 
     call __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc 
     movl $0, %eax 
     leave 
     ret 
     .def ___tcf_0;  .scl 3;  .type 32;  .endef 
___tcf_0: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $24, %esp 
     movl $__ZStL8__ioinit, (%esp) 
     call __ZNSt8ios_base4InitD1Ev 
     leave 
     ret 
     .def __Z41__static_initialization_and_destruction_0ii;  .scl 
3;  .type 32;  .endef 
__Z41__static_initialization_and_destruction_0ii: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $24, %esp 
     cmpl $1, 8(%ebp) 
     jne  L3 
     cmpl $65535, 12(%ebp) 
     jne  L3 
     movl $__ZStL8__ioinit, (%esp) 
     call __ZNSt8ios_base4InitC1Ev 
     movl $___tcf_0, (%esp) 
     call _atexit 
L3: 
     leave 
     ret 
     .def __GLOBAL__I_main;  .scl 3;  .type 32;  .endef 
__GLOBAL__I_main: 
     pushl %ebp 
     movl %esp, %ebp 
     subl $24, %esp 
     movl $65535, 4(%esp) 
     movl $1, (%esp) 
     call __Z41__static_initialization_and_destruction_0ii 
     leave 
     ret 
     .section  .ctors,"w" 
     .align 4 
     .long __GLOBAL__I_main 
     .def __ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc; 
.scl 2;  .type 32;  .endef 
     .def __ZNSt8ios_base4InitD1Ev;  .scl 2;  .type 32; 
.endef 
     .def __ZNSt8ios_base4InitC1Ev;  .scl 2;  .type 32; 
.endef 
     .def _atexit;  .scl 2;  .type 32;  .endef 
Cuestiones relacionadas