Bu cevabın önceki sürümü (rextester.com için bir "hack"), http://gcc.godbolt.org/ ARM, x86 ve x86-64 için CL 19 RC sağladığından (Windows arama kuralını hedefleyen , o sitedeki gcc, clang ve icc'den farklı olarak).
Godbolt derleyici gezgini, derleyici asm çıktısını güzel bir şekilde biçimlendirmek ve yönergelerin "gürültüsünü" kaldırmak için tasarlanmıştır; bu nedenle, args alan ve bir değer döndüren basit işlevler için asm'ye bakmak için onu kullanmanızı şiddetle tavsiye ederim (bu nedenle optimize edilmiş).
Bir süredir, CL http://gcc.beta.godbolt.org/ adresinde mevcuttu, ancak ana sitede bulunmuyordu, ancak şimdi her ikisinde de bulunuyor.
MSVC asm çıktısını almak için http://rextester.com/l/cpp_online_compiler_visual çevrimiçi derleyici: Ekle /FAs
komut satırı seçeneklerine. Programınızın kendi yolunu bulmasını ve bu yolu bulup .asm
onu terk etmesini sağlayın . Veya üzerinde bir sökücü çalıştırın .exe
.
örneğin 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
DOS sürümüdür cat
. Asm'i görmek istediğim işlevleri bulmayı zorlaştıracak daha fazla kod eklemek istemedim. (Bu hedeflere giden std :: string ve boost çalıştırmak sayacı kullanılarak rağmen! İşlenmesi (ve oluyor dize hakkında daha varsayımlarda bulunur Bazı C tarzı dize manipülasyon sonucu üzerine) büyük bir tampon kullanarak maksimum uzunlukta güvenlik / tahsisini yok sayar GetModuleFileNameA
misiniz? Öğesinin toplam makine kodu çok daha az olacaktır.)
IDK neden, ancak cout << p.string() << endl
yalnızca temel adını gösterir (yani dosya adı, dizinler olmadan), uzunluğunu yazdırmak bunun yalnızca çıplak ad olmadığını gösterse de. (Ubuntu 15.10'da Chromium48). Muhtemelen bir noktada cout
veya programın stdout'u ile web tarayıcısı arasında bir miktar ters eğik çizgi kaçış işlemi vardır .