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
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
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
Si estás usando gcc, usa el argumento -S y la salida del compilador no pasará por el ensamblador.
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.
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++.
¡Existe la pregunta que estaba buscando! – mkb
//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
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. –
@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. –