この回答の以前のバージョン(rextester.comの「ハック」)は、http://gcc.godbolt.org/がCL 19 RCを提供するようになったため、ほとんど冗長です ARM、x86、およびx86-64(Windows呼び出し規約を対象とをため、、そのサイトのgcc、clang、iccとは異なります)。
Godboltコンパイラエクスプローラは、コンパイラのasm出力を適切にフォーマットし、ディレクティブの「ノイズ」を取り除くように設計されているため、argsを受け取って値を返す単純な関数のasmを調べるために使用することを強くお勧めします(そうしないと、最適化された)。
しばらくの間、CLはhttp://gcc.beta.godbolt.org/で利用できましたが、メインサイトではありませんでしたが、現在は両方で利用できます。
http://rextester.com/l/cpp_online_compiler_visualオンラインコンパイラからMSVC asm出力を取得/FAs
するには:コマンドラインオプションに追加します。プログラムに独自のパスを見つけさせ、へのパスを.asm
計算してダンプします。または、で逆アセンブラを実行し.exe
ます。
例: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バージョンですcat
。asmを確認したい関数を見つけるのが難しくなるようなコードを追加したくありませんでした。(ただし、これらの目標に対してstd :: stringおよびboost runカウンターを使用します!処理する文字列についてより多くの仮定を行う(および大きなバッファーを使用して最大長の安全性/割り当てを無視する)Cスタイルの文字列操作GetModuleFileNameA
ますマシンコードの合計がはるかに少なくなります。)
IDKが理由ですがcout << p.string() << endl
、ベース名(つまり、ディレクトリなしのファイル名)のみが表示されますが、その長さを印刷すると、単なる名前ではないことが示されます。(Ubuntu 15.10上のChromium48)。のある時点cout
、またはプログラムのstdoutとWebブラウザの間にバックスラッシュエスケープ処理が存在する可能性があります。