คำตอบรุ่นก่อนหน้านี้ ("แฮ็ก" สำหรับ rextester.com) ส่วนใหญ่ซ้ำซ้อนในขณะนี้ที่http://gcc.godbolt.org/มีCL 19 RCสำหรับ ARM, x86 และ x86-64 (กำหนดเป้าหมายตามรูปแบบการโทรของ Windows ซึ่งแตกต่างจาก gcc, clang และ icc ในไซต์นั้น)
Godbolt compiler explorer ได้รับการออกแบบมาสำหรับการจัดรูปแบบเอาต์พุต asm ของคอมไพเลอร์อย่างสวยงามโดยลบ "สัญญาณรบกวน" ของคำสั่งดังนั้นฉันขอแนะนำให้ใช้มันเพื่อดู asm สำหรับฟังก์ชันง่ายๆที่รับ args และคืนค่า (ดังนั้นจะไม่เป็น ปรับให้เหมาะสมที่สุด)
ในระยะหนึ่ง CL มีอยู่ในhttp://gcc.beta.godbolt.org/แต่ไม่ใช่ไซต์หลัก แต่ตอนนี้มีอยู่ในทั้งสองไซต์
ในการรับเอาต์พุต MSVC asm จากhttp://rextester.com/l/cpp_online_compiler_visualคอมไพลเลอร์ออนไลน์: เพิ่ม/FAs
ในตัวเลือกบรรทัดคำสั่ง ให้โปรแกรมของคุณค้นหาเส้นทางของตัวเองและหาเส้นทางไปยัง.asm
และถ่ายโอนข้อมูล หรือเรียกใช้ disassembler บน.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
would น้อยกว่ารหัสเครื่องทั้งหมด)
IDK ทำไม แต่cout << p.string() << endl
แสดงเฉพาะชื่อฐาน (เช่นชื่อไฟล์โดยไม่มีไดเร็กทอรี) แม้ว่าการพิมพ์ความยาวจะแสดงว่าไม่ใช่แค่ชื่อเปล่า (Chromium48 บน Ubuntu 15.10) อาจมีการประมวลผลแบ็กสแลชหลบหนีในบางจุดcout
หรือระหว่าง stdout ของโปรแกรมกับเว็บเบราว์เซอร์