Phiên bản trước của câu trả lời này (một bản "hack" cho rextester.com) hầu hết là dự phòng khi http://gcc.godbolt.org/ cung cấp CL 19 RC cho ARM, x86 và x86-64 (nhắm mục tiêu vào quy ước gọi Windows , không giống như gcc, clang và icc trên trang web đó).
Trình thám hiểm trình biên dịch Godbolt được thiết kế để định dạng đầu ra asm của trình biên dịch độc đáo, loại bỏ "nhiễu" của các lệnh, vì vậy tôi khuyên bạn nên sử dụng nó để xem asm cho các hàm đơn giản lấy args và trả về giá trị (vì vậy chúng sẽ không tối ưu hóa đi).
Trong một thời gian, CL đã có sẵn trên http://gcc.beta.godbolt.org/ nhưng không phải là trang web chính, nhưng bây giờ nó đã có trên cả hai.
Để có được đầu ra asm MSVC từ trình biên dịch trực tuyến http://rextester.com/l/cpp_online_compiler_visual : Thêm /FAs
vào các tùy chọn dòng lệnh. Có chương trình của bạn tìm đường dẫn riêng của nó và tìm ra đường dẫn đến .asm
và kết xuất nó. Hoặc chạy một trình dịch ngược trên .exe
.
ví dụ: 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
là phiên bản DOS của cat
. Tôi không muốn bao gồm nhiều mã hơn khiến việc tìm các hàm tôi muốn xem asm trở nên khó khăn hơn. (Mặc dù sử dụng std :: string và boost run đối với các mục tiêu đó! Một số thao tác chuỗi kiểu C tạo ra nhiều giả định về chuỗi mà nó xử lý (và bỏ qua an toàn / phân bổ độ dài tối đa bằng cách sử dụng bộ đệm lớn) trên kết quả củaGetModuleFileNameA
Would ít hơn nhiều tổng mã máy.)
IDK tại sao, nhưng cout << p.string() << endl
chỉ hiển thị tên cơ sở (tức là tên tệp, không có thư mục), mặc dù việc in chiều dài của nó cho thấy nó không chỉ là tên trần. (Chromium48 trên Ubuntu 15.10). Có thể có một số xử lý thoát dấu gạch chéo ngược tại một số điểm cout
hoặc giữa thiết bị xuất chuẩn của chương trình và trình duyệt web.