2009-08-18 16 views
6

में एक लेबल इस 86 विधानसभा कोड पर विचार करें:अपसंदर्भन 86 विधानसभा

section .data 

foo: 
    mov ebx, [boo] 
    mov [goo], ebx 
goo: 
    mov eax, 2 
    mov eax, 3 
    ret 
boo: 
    mov eax, 4 
    mov eax, 5 
    ret 

वास्तव में क्या यहाँ चल रहा है? जब मैं [boo] और mov को [goo] पर रोकता हूं तो मैं वास्तव में वहां क्या चल रहा हूं? बस एक आदेश? ret भी?


फ़ॉलो-अप प्रश्न:

  1. अपसंदर्भन करता है एक लेबल मुझे एक पता दे? या लेबल में पहले कमांड के लिए मशीन कोड?
  2. यदि यह एक मशीन कोड है - यह संभवतः एक से अधिक कमांड कैसे हो सकता है? सभी आदेश अनिवार्य रूप से 32-बिट नहीं हैं (भले ही सभी बिट्स का उपयोग न किया जाए)?
  3. नीचे की रेखा - eax के अंत में 3 या 5 का मूल्य है?

उत्तर

9

boo अनुभाग .data अंदर अनुदेश mov eax, 3 की ऑफसेट है। mov ebx, [boo] का अर्थ है "ऑफसेट पर चार बाइट्स booebx के अंदर इंगित करें"। इसी तरह, mov [goo], ebxgoo द्वारा इंगित ऑफसेट पर ईबीएक्स की सामग्री को स्थानांतरित करेगा।

हालांकि, कोड अक्सर पढ़ने के लिए ही होता है, इसलिए कोड को क्रैश करने के लिए यह आश्चर्यजनक नहीं होगा।

यहाँ कैसे boo पर दिए गए निर्देशों इनकोड है:

boo: 
b8 03 00 00 00   mov eax,0x3 
c3      ret 

तो क्या आप ebx में मिलता है वास्तव में mov eax, 3 शिक्षा का 4/5 है।

+1

ऊपर समाशोधन के लिए धन्यवाद ऐसा लगता है कि यह काम करने के लिए, क्योंकि वे पूर्ण 32-बिट मात्रा नहीं कर रहे हैं और क्या होता है की तरह अंतिम बाइट हमेशा 0 होगा। यदि आप mov जैसे कुछ कोशिश करते हैं, तो यह कोड विफल हो जाएगा, ex 0xC000000 – Michael

+0

"चार बाइट्स लाएं" जो मैं ढूंढ रहा था। धन्यवाद! –

3

पहला mov सेगमेंट रजिस्टर [ई] डीएस के सापेक्ष ऑफसेट गुओ से कॉपी हो रहा है। दूसरा मूवी डीओ रजिस्टर के सापेक्ष डेटा स्थान में foo के ऑफसेट पर लिख रहा है। यदि सीएस और डीएस संयोग से हैं, तो इसे अनदेखा किया जा सकता है। सीएस और डीएस मानते हैं कि संयोगिक हैं, आप अगली सुरक्षा तंत्र में भाग लेने की संभावना रखते हैं जो कोड अनुभागों को केवल पढ़ने के लिए प्रस्तुत करते हैं।

आरई followups:

  1. एक संदर्भ की तरह एक लेबल नहीं है - आप भिन्नता जैसे नहीं है। असेंबलर परिणामस्वरूप कोड में स्थान का प्रतिनिधित्व करने वाले नंबर में प्रतिस्थापित करता है। आप या तो पता, या पते पर बात लोड कर सकते हैं। [और] dereferencing इंगित करता है - मैंने इसे कवर करने के लिए अपनी पहली प्रतिक्रिया में एक भ्रमित तत्व तय कर दिया है। मैं कर रहा हूं [goo] उस पते पर उस चीज़ को लोड करता है।
  2. एक सीआईएससी निर्देश सेट x86 की तरह सेट [बहुत] परिवर्तनीय लंबाई निर्देश है - कुछ शब्द की लंबाई का एक भी नहीं है। आरआईएससी आम तौर पर डिकोडिंग निर्देशों को सरल बनाने के लिए इसे रोकने का प्रयास करते हैं।
  3. 3 - आप केवल mov eax, 2 के पहले 4 बाइट्स को संशोधित कर रहे हैं (जो, छोटे एंडियन एन्कोडिंग के कारण 4 के साथ प्रतिस्थापित हो जाता है लेकिन फिर अगले निर्देश द्वारा ओवरराइट किया जाता है जिसे बिल्कुल संशोधित नहीं किया गया है - 5 कभी भी नहीं है एक उम्मीदवार के रूप में चित्र (मैंने सोचा था कि आप सोच रहे थे कि कोड जिस तरह से आपने पहली बार सवाल पूछा [1] हालांकि आप स्पष्ट रूप से कुछ और जानते हैं क्योंकि मुझे आपके प्रतिनिधि से अनुमान लगाया जाना चाहिए: पी)]।

नोट मानता है कि यह सब है कि सीएस = डी एस और डीईपी में कदम नहीं है।

इसके अलावा, अगर आप EBX के बजाय BX, चीजें आप खेलने में आ जाएगा उम्मीद कर रहे थे की तरह इस्तेमाल कर रहे थे (का उपयोग करते हुए एक्सएक्स के बजाय एक्सएक्स रजिस्टर के निम्न 2 बाइट्स तक पहुंचता है [और एक्सएल सबसे कम बाइट एक्सेस करता है])

[1] याद रखें कि एक असेंबलर ऑपकोड लिखने के लिए पूरी तरह से एक उपकरण है - लेबल जैसे सामान आदि सभी को उबला हुआ संख्या आदि कोड के बहुत कम जादू या प्रभावशाली परिवर्तन के साथ - उस प्रकृति की गहराई या उस चीज में गहराई से कुछ भी नहीं है। (यह थोड़ा oversimplifying है - कोड पुनर्निधारणीय हो सकता है, और कई मामलों में fixups लिंकर का एक संयोजन और लोडर द्वारा ऑफसेट के उपयोगों के लिए लागू हो)

+0

सही - मेरे मन में RISC साथ था ... उस बिंदु –

2

अनुवर्ती जवाब:

  1. यह आप मशीन कोड पता पर शुरू कर देता है। इसमें से कितना आपके भार की लंबाई पर निर्भर करता है, इस मामले में यह 4 बाइट है।

  2. यह एक से अधिक कमांड या केवल एक कमांड का एक टुकड़ा हो सकता है। इस आर्किटेक्चर (इंटेल x86) पर मशीन कोड कमांड 8 और 120 बिट के बीच हैं।

  3. 3.

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