La versión anterior de esta respuesta (un "truco" para rextester.com) es mayormente redundante ahora que http://gcc.godbolt.org/ proporciona CL 19 RC para ARM, x86 y x86-64 (dirigido a la convención de llamadas de Windows , a diferencia de gcc, clang y icc en ese sitio).
El explorador de compiladores de Godbolt está diseñado para formatear muy bien la salida de asm del compilador, eliminando el "ruido" de las directivas, por lo que recomiendo encarecidamente usarlo para buscar en asm funciones simples que toman argumentos y devuelven un valor (para que no sean optimizado).
Durante un tiempo, CL estuvo disponible en http://gcc.beta.godbolt.org/ pero no en el sitio principal, pero ahora está en ambos.
Para obtener la salida MSVC asm del compilador en línea http://rextester.com/l/cpp_online_compiler_visual : Agregue /FAs
las opciones de la línea de comandos. Haga que su programa encuentre su propia ruta y calcule la ruta al .asm
y lo descargue. O ejecute un desensamblador en el .exe
.
por ejemplo, http://rextester.com/OKI40941
#include <string>
#include <boost/filesystem.hpp>
#include <Windows.h>
using namespace std;
static string my_exe(void){
char buf[MAX_PATH];
DWORD tmp = GetModuleFileNameA( NULL, // self
buf, MAX_PATH);
return buf;
}
int main() {
string dircmd = "dir ";
boost::filesystem::path p( my_exe() );
//boost::filesystem::path dir = p.parent_path();
// transform c:\foo\bar\1234\a.exe
// into c:\foo\bar\1234\1234.asm
p.remove_filename();
system ( (dircmd + p.string()).c_str() );
auto subdir = p.end(); // pointing at one-past the end
subdir--; // pointing at the last directory name
p /= *subdir; // append the last dir name as a filename
p.replace_extension(".asm");
system ( (string("type ") + p.string()).c_str() );
// std::cout << "Hello, world!\n";
}
... code of functions you want to see the asm for goes here ...
type
es la versión DOS de cat
. No quería incluir más código que dificultaría la búsqueda de las funciones para las que quería ver el asm. (¡Aunque usa std :: string y boost run en contra de esos objetivos! Alguna manipulación de cadena de estilo C que hace más suposiciones sobre la cadena que está procesando (e ignora la seguridad / asignación de longitud máxima mediante el uso de un búfer grande) en el resultado de GetModuleFileNameA
would ser mucho menos código de máquina total).
IDK por qué, pero cout << p.string() << endl
solo muestra el nombre base (es decir, el nombre del archivo, sin los directorios), aunque imprimir su longitud muestra que no es solo el nombre simple. (Chromium48 en Ubuntu 15.10). Probablemente haya algún procesamiento de escape de barra invertida en algún momento cout
o entre la salida estándar del programa y el navegador web.