이 답변의 이전 버전 (rextester.com의 "해킹")은 http://gcc.godbolt.org/ 에서 ARM, x86 및 x86-64 용 CL 19 RC 를 제공 하므로 대부분 중복됩니다 (Windows 호출 규칙을 대상으로 함). , 해당 사이트의 gcc, clang 및 icc와 달리).
Godbolt 컴파일러 탐색기는 컴파일러 asm 출력을 멋지게 형식화하고 지시문의 "노이즈"를 제거하도록 설계되었으므로 인수를 취하고 값을 반환하는 간단한 함수에 대해 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을보고 싶은 함수를 찾기 어렵게 만드는 더 많은 코드를 포함하고 싶지 않았습니다. (그 목표에 표준 : : 문자열과 부스트 런 카운터를 사용하지만!이 처리 (그리고있어 문자열에 대한 자세한 가정을 일부 C 스타일의 문자열 조작의 결과에) 큰 버퍼를 사용하여 최대 길이 안전 / 할당을 무시 GetModuleFileNameA
겠습니까 전체 기계 코드가 훨씬 적습니다.)
IDK cout << p.string() << endl
는 그 길이를 인쇄하는 것이 단순한 이름이 아니라는 것을 보여도 기본 이름 (즉, 디렉토리없이 파일 이름) 만 표시합니다. (Ubuntu 15.10의 Chromium48). 에서 cout
또는 프로그램의 표준 출력과 웹 브라우저 사이 에 백 슬래시 이스케이프 처리가있을 수 있습니다 .