इस उत्तर के पहले संस्करण (rextester.com के लिए एक "हैक") अब ज्यादातर बेमानी है कि http://gcc.godbolt.org/ सीएल 19 आरसी प्रदान करता है एआरएम, x86 और x86-64 के लिए (Windows कॉलिंग कन्वेंशन को लक्षित करते हुए) , gcc, clang, और उस साइट पर icc के विपरीत)।
Godbolt कंपाइलर एक्सप्लोरर अच्छी तरह से संकलक एसएम आउटपुट के लिए डिज़ाइन किया गया है, निर्देशों के "शोर" को हटा रहा है, इसलिए मैं अत्यधिक उपयोग करने वाले साधारण कार्यों के लिए एएसएम को देखने के लिए इसका उपयोग करने की सलाह देता हूं जो कि args लेते हैं और एक मान लौटाते हैं (इसलिए वे नहीं होंगे अनुकूलित)।
कुछ समय के लिए, सीएल http://gcc.beta.godbolt.org/ पर उपलब्ध था , लेकिन मुख्य साइट नहीं थी, लेकिन अब यह दोनों पर है।
Http://rextester.com/l/cpp_online_compiler_visual ऑनलाइन कंपाइलर से MSVC asm आउटपुट प्राप्त करने के लिए : /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
का डॉस संस्करण है cat
। मैं और अधिक कोड शामिल नहीं करना चाहता था, जिससे मुझे उन कार्यों को खोजने में मुश्किल हो, जिनके लिए मैं asm देखना चाहता था। (हालांकि std :: string और बूस्ट रन काउंटर का उपयोग उन लक्ष्यों के लिए किया जाता है! कुछ C- शैली स्ट्रिंग हेरफेर जो कि इसके प्रसंस्करण के लिए स्ट्रिंग के बारे में अधिक धारणा बनाता है (और एक बड़े बफर का उपयोग करके अधिकतम-लंबाई सुरक्षा / आवंटन की उपेक्षा करता है)GetModuleFileNameA
चाहेंगे बहुत कम कुल मशीन कोड हो।)
IDK क्यों, लेकिन cout << p.string() << endl
केवल बेसनेम (यानी निर्देशिका के बिना फ़ाइल नाम) दिखाता है, भले ही इसकी लंबाई को मुद्रित करना दिखाता है कि यह सिर्फ नंगे नाम नहीं है। (Ubuntu 15.10 पर क्रोमियम 48)। cout
प्रोग्राम के स्टडआउट और वेब ब्राउजर के बीच कुछ बिंदु पर कुछ बैकस्लैश-एस्केप प्रोसेसिंग है।