मैं C ++ प्रोग्राम के लिए असेंबली कोड कैसे देख सकता हूं?


133

मैं C ++ प्रोग्राम के लिए असेंबली कोड कैसे देख सकता हूं?

ऐसा करने के लिए लोकप्रिय उपकरण क्या हैं?


Microsoft Visual C ++ एक्सप्रेस ने सिर्फ एक ब्रेकपॉइंट सेट किया और प्रेस कियाAlt +8
jyz

संभावित डुप्लिकेट: stackoverflow.com/questions/137038/…
legends2k

जवाबों:


167

संकलक से पूछें

यदि आप स्वयं कार्यक्रम का निर्माण कर रहे हैं, तो आप अपने संकलक से विधानसभा स्रोत का उत्सर्जन करने के लिए कह सकते हैं। अधिकांश UNIX कंपाइलर -Sस्विच का उपयोग करते हैं ।

  • यदि आप GNU असेंबलर का उपयोग कर रहे हैं, तो संकलन करने -g -Wa,-alhसे रुक-रुक कर स्रोत और असेंबली मिलेंगी ( -Waकंपाइलर ड्राइवर को -alअसेंबली में विकल्प पारित करने के लिए कहता है, असेंबली लिस्टिंग चालू करता है, और -ah"उच्च-स्तरीय स्रोत" सूची जोड़ता है):

    g++ -g -c -Wa,-alh foo.cc

  • Visual Studio के लिए, का उपयोग करें /FAsc

बाइनरी में झांकें

यदि आपने बाइनरी संकलित की है,

  • objdump -d a.outUNIX पर उपयोग (साइबरविन के लिए भी काम करता है),
  • dumpbin /DISASM foo.exe विंडोज पर।

अपने डिबगर का उपयोग करें

डिबगर्स भी असंतुष्ट दिखा सकते हैं।

  • disasGDB में कमांड का उपयोग करें ,
  • या विंडोज पर विजुअल स्टूडियो की disassembly विंडो

35

जीसीसी / जी ++ में, के साथ संकलित करें -S। यह something.sअसेंबली कोड के साथ एक फ़ाइल आउटपुट करेगा ।

संपादित करें: यदि आप चाहते हैं कि आउटपुट इंटेल सिंटैक्स में हो (जो आईएमओ है, बहुत अधिक पठनीय है, और अधिकांश विधानसभा ट्यूटोरियल इसका उपयोग करते हैं), के साथ संकलित करें -masm=intel


5
-fverbose-asmविकल्प भी जोड़ें
17

23

विज़ुअल स्टूडियो में ;

  1. एक ब्रेकपॉइंट सेट करें
  2. ब्रेकपॉइंट पर रुकने तक प्रोग्राम को चलाएं
  3. सोर्सकोड पर राइट क्लिक करें और "असंतुष्टी दिखाएं" चुनें

14

Gcc / g ++ के लिए

gcc -save-temps -fverbose-asm prog.c

यह प्रत्येक asm लाइन में प्रयुक्त चरों पर कुछ टिप्पणियों के साथ prog.s उत्पन्न करेगा:

    movl    $42, -24(%ebp)  #, readme
    movl    -16(%ebp), %eax # pid, pid
    movl    %eax, 4(%esp)   # pid,
    movl    $.LC0, (%esp)   #,
    call    printf  #


6

बहुत से लोगों ने पहले ही बताया कि किसी दिए गए कंपाइलर के साथ असेंबली कोड का उत्सर्जन कैसे करें। एक अन्य समाधान एक ऑब्जेक्ट फ़ाइल को संकलित करना है और इसे एक उपकरण जैसे कि objdump , readelf (Unix पर) या DUMPBIN ( लिंक ) (विंडोज पर) के साथ डंप करना है । आप एक निष्पादन योग्य को भी डंप कर सकते हैं, लेकिन आउटपुट को पढ़ना अधिक कठिन होगा।

यह किसी भी संकलक के साथ उसी तरह काम करने का लाभ है।


6

जो भी डीबगर आप उपयोग कर रहे हैं, उसमें एक विधानसभा दृश्य (विजुअल स्टूडियो, बोरलैंड आईडीई, जीडीबी, आदि) होना चाहिए। यदि आप डिबगर का उपयोग नहीं कर रहे हैं और आप केवल यह देखना चाहते हैं कि किसी प्रोग्राम में असेंबली क्या है, तो आप एक डिस्सेम्बलर का उपयोग कर सकते हैं या वैकल्पिक रूप से, प्रोग्राम को चला सकते हैं और इसे डिबगर के साथ संलग्न कर सकते हैं और वहां से डंप कर सकते हैं। विकल्पों पर जानकारी के लिए disassemblers के संदर्भ देखें ।


5

जैसा कि किसी और ने उल्लेख किया है, आपके प्लेटफ़ॉर्म का डिबगर एक अच्छा शुरुआती बिंदु है। सभी डीबगर्स और डिस्सेम्बलर्स के जैकहैमर के लिए, आईडीए प्रो पर एक नज़र डालें

यूनिक्स / लिनक्स प्लेटफार्मों पर (सिगविन सहित) आप उपयोग कर सकते हैं objdump --disassemble <executable>


यदि कंपाइलर के पास असेंबलर जेनरेट करने का विकल्प है (जैसे gcc -S, या VS / FA विकल्प नीचे), तो यह डिस्एम्सेबल पर बेहतर है। यह अधिक प्रतीकात्मक है।
मार्को वैन डे वोयर्ट

ज़रूर, अगर आपके पास स्रोत है।
ओरिज पेसक

2
वैसे, आपको आश्चर्य होगा कि आईडीए प्रो द्वारा कितना प्रतीक जानकारी काटा जा सकता है।
ओरिएंटल पेसैक

5

अधिकांश कंपाइलर्स के पास असेंबली लिस्टिंग को आउटपुट करने का विकल्प होता है। VisualStudio के साथ जैसे आप कुछ का उपयोग कर सकते हैं:

cl.exe /FAfile.asm file.c

सर्वश्रेष्ठ पठनीयता के लिए, हालांकि, अधिकांश डिबगर्स एक ऐसा दृश्य प्रस्तुत करेंगे, जो मूल स्रोत के साथ डिसएपस्म को इंटरलेव करता है, इसलिए आप अपने कोड की तुलना कंपाइलर के आउटपुट लाइन से कर सकते हैं।



3

आप इस साइट को भी आज़मा सकते हैं: http://assembly.ynh.io/

वहां, आप अपना C या C ++ कोड पेस्ट कर सकते हैं और असेंबली समकक्ष संस्करण देखने के लिए एक नीला बटन दबा सकते हैं।


FYI करें, लोड करने में विफल
काईवन

हाँ, 2015 में वापस यह ठीक काम कर रहा था, फिर अचानक बंद हो गया। इसके बाद ctoassembly.com आया, लेकिन इसने केवल सी के एक छोटे उपसमुच्चय के लिए काम किया। वही आनंद: अब लोड नहीं हो रहा है। बहुत बुरा।
गोम्स जेए

2

विजुअल स्टूडियो में आप C ++ प्रोजेक्ट के लिए असेंबलर लिस्टिंग जेनरेट कर सकते हैं।

प्रोजेक्ट प्रॉपर्टीज पर जाएँ, फिर C ++ / आउटपुट फाइल्स में और असेंबलर आउटपुट सेटिंग और ASM लिस्ट लोकेशन को एक फाइल नाम पर सेट करें।


1

Intel Mac OS X 10.8 (माउंटेन लायन) पर -masm=intelनिर्देश काम नहीं करता था। हालाँकि, यदि आपने Xcode स्थापित किया है, तो उसे 'otool' नाम का टूल इंस्टॉल करना चाहिए:

otool code.o -tV

आपको एक पैरामीटर के रूप में संकलित ऑब्जेक्ट कोड प्रदान करना होगा।


0

यदि आप एक ग्रहण उपयोगकर्ता हैं, तो आप Disassembly दृश्य का उपयोग कर सकते हैं ।

Disassembly दृश्य लोड प्रोग्राम को तुलना के लिए स्रोत कोड के साथ मिश्रित निर्देशांक के रूप में दिखाता है। वर्तमान में निष्पादित लाइन एक तीर मार्कर द्वारा दर्शाई गई है और दृश्य में हाइलाइट की गई है। आप Disassembly दृश्य में निम्नलिखित कार्य कर सकते हैं:

  • किसी भी असेंबली इंस्ट्रक्शन के शुरू होने पर ब्रेकपॉइंट सेट करें
  • ब्रेकपॉइंट को सक्षम और अक्षम करें और उनके गुण सेट करें
  • अपने प्रोग्राम के डिस्सैम्ड निर्देशों के माध्यम से चरण
  • कार्यक्रम में विशिष्ट निर्देशों के लिए कूदो

क्या आप थोड़ा विस्तार कर सकते हैं?
पीटर मोर्टेंसन

MSVC में डिबगिंग करते समय असेंबली व्यू भी होते हैं
phuclv

मेरे पास अभी काम करने वाला ग्रहण C ++ विकास का माहौल नहीं है, लेकिन यहां आधिकारिक दस्तावेज है: help.eclipse.org/kepler/…
पीटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.