2010-03-30 13 views
7
0x004012d0 <main+0>: push %ebp 
0x004012d1 <main+1>: mov %esp,%ebp 
0x004012d3 <main+3>: sub $0x28,%esp 

यदि पता उपलब्ध नहीं है, तो क्या हम इसे स्वयं गणना कर सकते हैं?x86 असेंबली में संकलित प्रत्येक निर्देश कितने बाईस है?

मेरा मतलब है हम केवल इस राशि:

बाइट्स की
push %ebp 
mov %esp,%ebp 
sub $0x28,%esp 
+0

क्या आप इसे रनटाइम पर चाहते हैं? यानी 'asm_size ("mov esp, ebp") '? –

+3

इस तरह की सामग्री हार्डवेयर वास्तुकला निर्भर है। यह एक "विश्लेषण" समस्या नहीं है बल्कि एक "उपयुक्त दिखाना 'शब्दकोश' समस्या है। – billyswong

+0

लिनक्स में आप ऑपकोड देखने के लिए 'objdump -d execable-file' का उपयोग कर सकते हैं, फिर आप प्रत्येक निर्देश का आकार – jyz

उत्तर

6

राशि आसन्न निर्देश के बीच पतों की अंतर है:

0x004012d0 <main+0>: push %ebp ;1 byte 
0x004012d1 <main+1>: mov %esp,%ebp ;2 bytes 
0x004012d3 <main+3>: sub $0x28,%esp 

यदि आपके पास केवल पाठ तो यहां जाएं: http://www.swansontec.com/sintel.html और यहाँ: http://faydoc.tripod.com/cpu/conventions.htm और प्रत्येक निर्देश, उपसर्ग और ऑपरेटिंग के लिए गणना

0

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

उदाहरण के लिए, यहां एक 80x86 32-bit Assembler खुला source code (OllyDbg v1.10) है।

1

पहला निर्देश [मुख्य + 0] पर है और दूसरा [मुख्य + 1] पर है, इसलिए पहला निर्देश 1 बाइट है। तीसरा निर्देश [मुख्य + 3] पर है, इसलिए दूसरा निर्देश दो बाइट्स है। आप लिस्टिंग से नहीं बता सकते कि कितना समय तीसरा निर्देश है, क्योंकि यह 4. निर्देश का पता नहीं दिखाता है।

3

आप अनिवार्य रूप से निमोनिक से निर्देश आकार निर्धारित नहीं कर सकते हैं। यहाँ कुछ विशेष मामले हैं:

  • यदि आप एक 16-बिट क्षेत्र में कर रहे हैं, mov eax, 0 जबकि एक 32-बिट क्षेत्र में ऐसा नहीं होता, एक 0x66 उपसर्ग की आवश्यकता है। आपको सेगमेंट के आकार को जानने की जरूरत है।

  • 32-बिट या 16-बिट मोड में

    आप add eax, 1 के रूप में या तो 0x40 (inc eax) या 0x83 0xc0 0x01 (add eax, 1) सांकेतिक शब्दों में बदलना कर सकते हैं। यही है, कुछ निमोनिक्स हैं जिन्हें एक से अधिक तरीकों से एन्कोड किया जा सकता है।

  • मेमोरी ऑपरेंड [eax]eax या तो बेस या इंडेक्स के रूप में एन्कोड कर सकता है। यदि यह सूचकांक है, तो आपके पास एमओडी/आरएम के बाद एक अतिरिक्त एसआईबी बाइट होगा। r15 -

  • 64-बिट मोड में आप रजिस्टर r8 एन्कोड करने के लिए REX उपसर्ग 0x4x उपयोग कर सकते हैं। हालांकि, आप 0x40 का उपयोग कुछ प्रकार के शून्य REX बाइट के रूप में कर सकते हैं, जो आपके निर्देश में एक और बाइट जोड़ देगा।

  • सेगमेंट ओवरराइड का उपयोग किया जा सकता है, भले ही स्पष्ट खंड अंतर्निहित के समान हो।

अधिक या कम बाइट्स का उपयोग करके निर्देश को एन्कोड करने के कई अन्य तरीके हैं। एक अच्छा असेंबलर शायद हमेशा सबसे छोटा उपयोग करना चाहिए, लेकिन यह निश्चित रूप से वास्तुकला द्वारा आवश्यक नहीं है। अच्छी बात यह है कि यदि आप इंटेल आईए -32 सॉफ्टवेयर डेवलपर मैनुअल के वॉल्यूम 2 ​​का अध्ययन करते हैं, तो आप इसे अपने आप से बाहर करने में सक्षम होना चाहिए।

+0

दरअसल, विशेष रूप से x86/x64 पर निर्देश एन्कोडिंग संदिग्ध है, दोनों अर्थ यह है कि दो असेंबली निमोनिक्स एक ही निर्देश ('xchg ax, ax' और' nop') का वर्णन कर सकते हैं, और वहां हो सकता है कि एक असेंबली निमोनिक ('इंक ईएक्स' 32 बिट में - दोनों' 0x40' और '0xff 0xc0') के लिए दो बाइनरी ऑपकोड बनें। वे कभी-कभी जानबूझकर अस्पष्ट रूप से अस्पष्ट होते हैं, जैसे 'एनओपी' निर्देश, http://stackoverflow.com/questions/2123000/dummy-operations-handling-of-intel-processor/2124407#2124407 –

+0

कई पुराने निर्देश देख सकते हैं VEX या EVEX उपसर्ग के साथ फिर से एन्कोड किया जाए, इसलिए उनके पास अलग-अलग लंबाई –

+0

@ LưuVĩnhPhúc के साथ कई प्रस्तुतियां होंगी: यह बिल्कुल सटीक नहीं है। एसईएस निर्देश जो VEX या EVEX का उपयोग करते हुए AVX के रूप में एन्कोड किए गए हैं, उनके पास थोड़ा अलग व्यवहार है: * उनके पास अलग-अलग सक्षमताएं हैं। उदाहरण के लिए, VEX को XCR0 में CR4.OSXSAVE और विभिन्न बिट्स की आवश्यकता होती है। * 128-बिट एवीएक्स निर्देश वाईएमएम या जेडएमएम के ऊपरी बिट्स को साफ़ करते हैं, जबकि संबंधित एसएसई निर्देश ऊपरी बिट्स को बिना छूटे छोड़ देते हैं –

0

यदि संभव हो तो असेंबलर एक सूची उत्पन्न करता है।यह आपका स्रोत कोड दिखाएगा और इसके बाद निर्देशों का द्विआधारी प्रतिनिधित्व होगा और आपको बस इतना करना होगा कि कितने बाइट हैं और फिर आपको आकार मिल गया है।

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