La versión anterior de esta respuesta (un "truco "para rextester.com) es en su mayoría redundante ahora que http://gcc.godbolt.org/ proporciona CL 19 RC para ARM, x86 y x86-64 (se dirige a la convención de llamadas de Windows, a diferencia de gcc, clang e icc en ese sitio). El explorador de compilador Godbolt está diseñado para formatear muy bien la salida de compilador asm, eliminando el "ruido" de las directivas, así que recomiendo usarlo para ver asm para funciones simples que toman argumentos y devuelven un valor (por lo que no será optimizado de distancia).
Por un tiempo, CL estuvo disponible en http://gcc.beta.godbolt.org/ pero no en el sitio principal, pero ahora está en ambos.
Para obtener una salida asm MSVC del compilador de línea http://rextester.com/l/cpp_online_compiler_visual: Añadir /FAs
a las opciones de línea de comandos. Haga que su programa encuentre su propio camino y encuentre la ruta al .asm
y vacíelo. O ejecuta un desensamblador en el .exe
.
p. Ej. 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 encontrar las funciones para las que quería ver el asm. (Aunque usa std :: string e impulsa contrarrestar esos objetivos! Algún tipo de manipulación de cadena 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 gran búfer) en el resultado de GetModuleFileNameA
sería 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 la impresión de su longitud muestra que no es solo el nombre. (Chromium48 en Ubuntu 15.10). Probablemente haya algún procesamiento de escape de barra invertida en algún punto en cout
, o entre la salida estándar del programa y el navegador web.
Tenga en cuenta que el enfoque # 2 no funciona al compilar una biblioteca estática con la optimización de todo el programa habilitada (en VS2010 al menos). Lo cual tiene sentido: el compilador aún no ha generado el código final. – dhaffey
Se llama "Ir a desarmado" en Visual Studio 2017 – Matthias