2011-02-03 17 views
6

पहचानकर्ता के बाद '$' क्या होता है?

x86 असेंबली, & टी वाक्यविन्यास।

+0

यह सटीक प्रश्न [ग्राउंड अप से प्रोग्रामिंग] के लिए अभ्यासों में से एक है (http://programminggroundup.blogspot.ca/2007/01/programming-from-ground-up.html)। – user240515

उत्तर

11

एटी & टी सिंटैक्स $ का मतलब है कि स्मृति पते के बजाय तत्काल स्थिरता के रूप में क्या चल रहा है। दूसरे शब्दों में,

movl $_start, %eax 

% eax में प्रतीक _start का पता लोड करता है;

movl _start, %eax 

% eax में _start के पते पर स्मृति से 4 बाइट पढ़ता है। यदि आप दोनों के डिस्सेप्लर को देखते हैं:

0: b8 00 00 00 00   mov $0x0,%eax 
     1: R_386_32 _start 
5: a1 00 00 00 00   mov 0x0,%eax 
     6: R_386_32 _start 

आप देख सकते हैं कि केवल अंतर ही ऑपोड है। आसान, अगर कुछ हद तक स्वयं सेवापूर्वक नाम दिया गया है, Intel® 64 and IA-32 Architectures Software Developer's Manual (आप वॉल्यूम 2 ​​चाहते हैं, जो निर्देश सेट संदर्भ है) कहता है कि बीएफ एन्कोड के माध्यम से बी 8 को ऑपोड करता है "रजिस्टर में तुरंत 16/32-बिट स्थिर लोड करें" (यह कोड निर्धारित होने वाला है 32-बिट कोड सेगमेंट में लोड किया गया है, इसलिए यह 32-बिट लोड है; 16-बिट लोड के लिए, आपके पास "ऑपरेंड साइज ओवरराइड" उपसर्ग बाइट, 66 होगा) और ऑपोड ए 1 एन्कोड "लोड 32-बिट मात्रा ईएक्स में डीएस (या उचित उपसर्ग बाइट के साथ) से 32-बिट ऑफ़सेट निर्दिष्ट किया गया है। " ठेठ "फ्लैट" मेमोरी मॉडल के साथ, यह निर्दिष्ट 32-बिट पूर्ण पते पर लोड 32-बिट मात्रा के नैतिक समकक्ष है "लेकिन आप देख सकते हैं कि कैसे x86 को मशीन स्तर पर हास्यास्पद रूप से जटिल के रूप में अपनी प्रतिष्ठा मिली।

a: bb 00 00 00 00   mov $0x0,%ebx 
     b: R_386_32 _start 
f: 8b 1d 00 00 00 00  mov 0x0,%ebx 
     11: R_386_32 _start 

लोड-तत्काल अभी भी एक एक बाइट अनुदेश संकार्य गिनती नहीं के साथ किया जा सकता है (यह है:

मामले आप सोच रहे हैं में, यह यह कैसा अगर हम EBX बजाय प्रयोग किया लगेगा है बी 9 के बजाय बीबी, जैसा कि आप उम्मीद कर सकते हैं, क्योंकि आंतरिक रजिस्टर ऑर्डर एएक्स, सीएक्स, डीएक्स, बीएक्स, एसपी, बीपी, एसआई, डीआई - गंभीरता से है) लेकिन लोड-से-पूर्ण-पता अब दो है -बाइट निर्देश, 8 बी 1 डी; दूसरा बाइट वह है जो इंटेल ने "मॉडआरएम" बाइट कहा है, जो ईबीएक्स दोनों को निर्दिष्ट करता है और यह कि एक पूर्ण 4-बाइट पता निम्नानुसार है।

2

आम तौर पर इसका अर्थ है "तत्काल" मूल्य, यानी एक संख्या, एक अन्य रजिस्टर मूल्य के विपरीत, स्मृति से पुनर्प्राप्त कुछ इत्यादि। इसलिए, इस मामले में, यह प्रतीक _start से जुड़े नंबर को ईएक्स रजिस्टर में ले जा रहा है ।

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