Versi sebelumnya dari jawaban ini ("retasan" untuk rextester.com) sebagian besar mubazir sekarang karena http://gcc.godbolt.org/ menyediakan CL 19 RC untuk ARM, x86, dan x86-64 (menargetkan konvensi pemanggilan Windows , tidak seperti gcc, clang, dan icc di situs itu).
Penjelajah kompilator Godbolt dirancang untuk memformat keluaran asm kompilator dengan baik, menghilangkan "noise" dari direktif, jadi saya sangat merekomendasikan menggunakannya untuk melihat asm untuk fungsi sederhana yang mengambil argumen dan mengembalikan nilai (jadi mereka tidak akan dioptimalkan).
Untuk sementara, CL tersedia di http://gcc.beta.godbolt.org/ tetapi bukan situs utama, tetapi sekarang tersedia di keduanya.
Untuk mendapatkan keluaran MSVC asm dari http://rextester.com/l/cpp_online_compiler_visual kompilator online: Tambahkan /FAs
ke opsi baris perintah. Mintalah program Anda menemukan jalurnya sendiri dan mengerjakan jalur ke .asm
dan membuangnya. Atau jalankan disassembler di .exe
.
mis. 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
adalah versi DOS dari cat
. Saya tidak ingin memasukkan lebih banyak kode yang akan membuat lebih sulit untuk menemukan fungsi yang ingin saya lihat asmnya. (Meskipun menggunakan std :: string dan boost run counter untuk tujuan tersebut! Beberapa manipulasi string gaya C yang membuat lebih banyak asumsi tentang string yang diprosesnya (dan mengabaikan keamanan / alokasi panjang-maksimal dengan menggunakan buffer besar) pada hasil GetModuleFileNameA
would menjadi lebih sedikit total kode mesin.)
IDK mengapa, tetapi cout << p.string() << endl
hanya menunjukkan nama dasar (yaitu nama file, tanpa direktori), meskipun pencetakan panjangnya menunjukkan itu bukan hanya nama kosong. (Chromium48 di Ubuntu 15.10). Mungkin ada beberapa pemrosesan backslash-escape di beberapa titik cout
, atau antara stdout program dan browser web.