2010-05-22 12 views
9

क्या कोई कृपया समझा सकता है, मेरे पास सी पर एक प्रोग्राम है, क्या मैं इसे असेंबली में बदल सकता हूं? यदि हां, तो कैसे?सी से असेंबली

+0

मुझे यकीन है कि dev-cpp में असेंबली आउटपुट का उत्पादन करने के लिए विकल्प (जीसीसी के समान) हैं। मुझे नहीं पता कि dev-cpp में _intermediate_ आउटपुट के लिए एक ही हुक है, लेकिन मुझे नहीं लगता कि आपको वास्तव में उन चीज़ों की आवश्यकता है जो आप पूछ रहे हैं। उदाहरण के लिए –

उत्तर

21

आप जीसीसी का उपयोग करते हैं आप this पेज के अनुसार उत्पादन प्राप्त करने के लिए क्या कर सकते हैं gcc -O2 -S -c foo.c एक मानव पठनीय रूप में असेंबली।

+0

और पृष्ठ बताता है कि स्रोत कोड कैसे प्राप्त करें और जेनरेट किया गया एएसएम :-) +1 – garph0

+0

@ एंडर्स हाबेल: अगर मुझे कुछ खास चाहिए? उदाहरण के लिए पीडीपी -11? – lego69

+2

एक क्रॉसकंपेलर का उपयोग करें, जो आपके इच्छित आर्क के लिए कोड उत्पन्न करता है। – Johan

3

यही आपके संकलक करता है।

कंपाइलर आपके सी प्रोग्राम को मशीन भाषा में संकलित करता है जो मशीन प्रोग्राम का एक बाइनरी प्रतिनिधित्व है। जब कोई मानव मशीन भाषा लिखना चाहता है, तो वह इसे असेंबलर में लिखता है, जिसे बाइनरी मशीन भाषा में अनुवादित किया जाता है।

असेंबलर कोड बस बाइनरी मशीन भाषा का एक मानव पठनीय रूप है।

सी कार्यक्रम:

$ cat test.c 
#include <stdio.h> 

int main(int argc, char **argv) { 
    int a = 11+12; 
    printf("a = %d\n", a); 
    return 0; 
} 

संकलन यह

$ gcc -c test.c 

यह एकत्रित न:

$ objdump -d test.o 

test.o:  file format elf32-i386 


Disassembly of section .text: 

00000000 <main>: 
    0: 55      push %ebp 
    1: 89 e5     mov %esp,%ebp 
    3: 83 e4 f0    and $0xfffffff0,%esp 
    6: 83 ec 20    sub $0x20,%esp 
    9: c7 44 24 1c 17 00 00 movl $0x17,0x1c(%esp) 
    10: 00 
    11: b8 00 00 00 00   mov $0x0,%eax 
    16: 8b 54 24 1c    mov 0x1c(%esp),%edx 
    1a: 89 54 24 04    mov %edx,0x4(%esp) 
    1e: 89 04 24    mov %eax,(%esp) 
    21: e8 fc ff ff ff   call 22 <main+0x22> 
    26: b8 00 00 00 00   mov $0x0,%eax 
    2b: c9      leave 
    2c: c3      ret  
+0

, मैं dev-cpp का उपयोग कर रहा हूं, मुझे यह विकल्प कहां मिल सकता है? – lego69

+0

प्रोजेक्ट के कंपाइलर/कोड जेनरेटर विकल्पों में देखें, "असेंबली लिस्टिंग जेनरेट करें" जैसे कुछ की खोज करें – garph0

5

जीसीसी के साथ, आप -S विकल्प का उपयोग कर सकते हैं:

gcc -O2 -S myfile.c 

(इस तरह के -O2 के रूप में) सबसे अन्य विकल्प यहाँ भी इस्तेमाल किया जा सकता, यह निर्धारित करने के विधानसभा कोड किस तरह का उत्पादन किया जाता है।

नोट, हालांकि, यह केवल मध्यवर्ती चरण को उजागर कर रहा है कि संकलक वैसे भी चला जाता है (असेंबली स्रोत फ़ाइल की पीढ़ी नहीं, बल्कि यह है कि मशीन कोड जो इसका प्रतिनिधित्व करता है)। अंत परिणाम, एक असेंबलर के माध्यम से इस कोड को पार करने के बाद सीधे मशीन कोड को संकलित करने से किसी भी तरह से भिन्न नहीं होगा।

3

आपके कंपाइलर के पास ऐसा करने का कुछ विकल्प होना चाहिए। उदाहरण के लिए, जीसीसी के लिए आप -एस विकल्प का उपयोग कर सकते हैं। एक छोटी उदाहरण:

// test.c 

#include <stdio.h> 

int 
main() 
{ 
    printf ("hello, world\n"); 
    return 0; 
} 

-S विकल्प के साथ यह संकलित करें।

.file "test.c" 
    .section .rodata 
.LC0: 
    .string "hello, world" 
    .text 
.globl main 
    .type main, @function 
main: 
    leal 4(%esp), %ecx 
    andl $-16, %esp 
    pushl -4(%ecx) 
    pushl %ebp 
    movl %esp, %ebp 
    pushl %ecx 
    subl $4, %esp 
    movl $.LC0, (%esp) 
    call puts 
    movl $0, %eax 
    addl $4, %esp 
    popl %ecx 
    popl %ebp 
    leal -4(%ecx), %esp 
    ret 
    .size main, .-main 
    .ident "GCC: (Ubuntu 4.3.3-5ubuntu4) 4.3.3" 
    .section .note.GNU-stack,"",@progbits 
+0

सोच रहा था अगर मुझे कुछ खास चाहिए? उदाहरण के लिए पीडीपी -11? – lego69

1

compilers के अधिकांश द्विआधारी फ़ाइलों के साथ विधानसभा लिस्टिंग उत्पन्न करने के लिए कुछ विकल्प होता है: यह एक test.s फ़ाइल जो विधानसभा में शामिल होंगे का उत्पादन करेगा। विजुअल स्टूडियो में आप इसे फ़ाइल गुणों में "कोड जनरेशन" अनुभाग के अंतर्गत पा सकते हैं।
जीसीसी के साथ आप -एस स्विच (पूंजी एस)
का उपयोग कर सकते हैं अंततः यदि आपके पास बाइनरी है तो आप objdump -S (पूंजी एस) का उपयोग कर सकते हैं।

0

this question देखें। जब आप असेंबली को पढ़ना चाहते हैं तो This answer उपयोगी हो सकता है। इसके अलावा, आप एक प्रोग्राम संकलित कर सकते हैं, और फिर असेंबली आउटपुट प्राप्त करने के लिए विवाद का उपयोग करें।

1

चूंकि आपने देव-सी ++ का उल्लेख किया है, यह उल्लेखनीय है कि -S ध्वज भी काम करता है। मान लें कि विंडोज़, देव-सी ++ अभी भी आउटपुट .exe का नाम रखेगा, लेकिन नतीजा निष्पादन योग्य फ़ाइल नहीं होगा, इसलिए एक्सटेंशन को .txt में बदलें या जो कुछ भी इसे आपकी पसंद के संपादक में पढ़ा जा सके। प्रोजेक्ट> प्रोजेक्ट विकल्प> पैरामीटर्स> कंपाइलर या टूल्स> कंपाइलर विकल्प के तहत विकल्प/झंडे जोड़ें।

+0

HAHA! ठीक है!! बहुत बढ़िया! मैं सिर्फ आधा घंटे, और कल शाम के लिए यह खोज रहा था। आखिर में यह आखिरकार है! मुझे नहीं मिला कि आपको इसे दस्तावेज़ प्रारूप में पुनर्नामित करना होगा! अरे मैं ट्रोल किया गया था! महोदय आपका बहुत बहुत धन्यवाद! –

संबंधित मुद्दे