2012-02-24 15 views
6

के बाद, एक नमूना कार्यक्रम के objdump का आउटपुट हैसंकार्य पीढ़ी एएमडी

080483b4 <display>: 
80483b4:  55      push %ebp 
80483b5:  89 e5     mov %esp,%ebp 
80483b7:  83 ec 18    sub $0x18,%esp 
80483ba:  8b 45 0c    mov 0xc(%ebp),%eax 
80483bd:  89 44 24 04    mov %eax,0x4(%esp) 
80483c1:  8d 45 fe    lea 0xfffffffe(%ebp),%eax 
80483c4:  89 04 24    mov %eax,(%esp) 
80483c7:  e8 ec fe ff ff   call 80482b8 <[email protected]> 
80483cc:  8b 45 08    mov 0x8(%ebp),%eax 
80483cf:  89 44 24 04    mov %eax,0x4(%esp) 
80483d3:  c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp) 
80483da:  e8 e9 fe ff ff   call 80482c8 <[email protected]> 
80483df:  c9      leave 
80483e0:  c3      ret 

080483e1 <main>: 
80483e1:  8d 4c 24 04    lea 0x4(%esp),%ecx 
80483e5:  83 e4 f0    and $0xfffffff0,%esp 
80483e8:  ff 71 fc    pushl 0xfffffffc(%ecx) 
80483eb:  55      push %ebp 
80483ec:  89 e5     mov %esp,%ebp 
80483ee:  51      push %ecx 
80483ef:  83 ec 24    sub $0x24,%esp 
80483f2:  c7 44 24 04 f3 84 04 movl $0x80484f3,0x4(%esp) 
80483f9:  08 
80483fa:  c7 04 24 0a 00 00 00 movl $0xa,(%esp) 
8048401:  e8 ae ff ff ff   call 80483b4 <display> 
8048406:  b8 00 00 00 00   mov $0x0,%eax 
804840b:  83 c4 24    add $0x24,%esp 
804840e:  59      pop %ecx 
804840f:  5d      pop %ebp 
8048410:  8d 61 fc    lea 0xfffffffc(%ecx),%esp 

क्या मैं समझने की जरूरत है, मुख्य हम पते पर निम्न देखें में है - 8,048,401, कॉल 80483 बी 4, हालांकि मशीन कोड है - ई 8 एई एफएफ एफएफ एफएफ। मैं देखता हूं कि कॉल निर्देश E8 है लेकिन फ़ंक्शन 80483b4 का पता FFFFFFAE को डीकोड करने का तरीका कैसा है? मैंने Google में बहुत सी खोज की लेकिन यह कुछ भी वापस नहीं आया। क्या कोई भी समझा सकता है?

उत्तर

8

ई 8 "कॉल रिलेटिव" के लिए ऑपरेंड है, जिसका अर्थ है कि गंतव्य पते को अगले निर्देश के पते पर ऑपरेंड जोड़कर गणना की जाती है। ऑपरेंड 0xFFFFFFAE है, जो नकारात्मक 0x52 है। 0x808406 - 0x52 0x80483b4 है।

अधिकांश डिस्सेबलर्स आपको ऑपरेंड में सापेक्ष पता देने की बजाए वास्तविक लक्ष्य पते की मददपूर्वक गणना करते हैं। पर 86 ईसा के लिए

पूरा जानकारी: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-vol-2a-manual.html

6

दिलचस्प सवाल। मैंने Intel's documentation पर देखा है और E8 ऑपोड CALL rel16/32 है। 0xffffffae वास्तव में 32-बिट दो के पूरक हस्ताक्षर पूर्णांक -82 दशमलव के बराबर है; यह ओपोड और उसके ऑपरेंड के तुरंत बाद बाइट से एक सापेक्ष पता है।

यदि आप गणित आप देख सकते हैं इसे बाहर की जाँच करता है:

0x8048406 - 82 = 0x80483b4

यह display समारोह की शुरुआत में अनुदेश सूचक डालता है।

+0

आपकी टिप्पणियों के लिए धन्यवाद। तो यह केवल निकट कॉल के लिए है। एफएआर कॉल के बारे में क्या? आपकी टिप्पणी से मैं समझता हूं कि निकट कॉल E8 है। क्या एफएआर भी ई 8 कॉल करता है? इसके अलावा, क्या एफएआर कॉल के लिए ऑपरेशन abosolute addres होगा ?? –

+0

@ सैमिरबायद सुदूर कॉल '9ए' हैं और पूर्ण पते लेते हैं। 'एफएफ' भी है जो पूर्ण अप्रत्यक्ष पते के साथ कुछ करता है, लेकिन मुझे यकीन नहीं है कि वे कैसे काम करते हैं। पेज पर उस वॉल्यूम सेट (यानी शीर्ष पर) के पृष्ठ 716 को देखें, जिसे मैंने अधिक विस्तार से जोड़ा है। – spencercw

+0

@ सैमिरबायड: एक्स 86_64 पर भी सुदूर कॉल दुर्लभ हैं। लाइब्रेरी कॉल आमतौर पर पीएलटी के माध्यम से की जाती हैं, इसलिए ऐसा करने के लिए आपको 2 GiByte से बड़ा टेक्स्ट सेगमेंट चाहिए। – hirschhornsalz

3

पास कॉल आम तौर पर आईपी रिश्तेदार हैं - जिसका अर्थ है, "पता" वास्तव में एक अनुदेश सूचक से ऑफसेट है। ऐसे मामले में, ईआईपी अगले निर्देश को इंगित करता है (इसलिए इसका मूल्य 8048406 है)। ffffffae (या -00000052 दो पूरक में) जोड़ें, और आपको 80483b4 मिलें।

ध्यान दें कि यह सब गणित 32-बिट है। आप यहां 64-बिट ऑपरेशंस नहीं कर रहे हैं (या आपके रजिस्टरों के पास उनके नामों में E एस के बजाय R एस होगा, और पते बहुत अधिक होंगे)।