2010-11-04 15 views
7

मैं पढ़ रहा हूँ "कंप्यूटर सिस्टम्स: एक प्रोग्रामर दृष्टिकोण", अध्याय 3 mov अनुदेश बताते हैं, और में एक किताब मुझे confuses स्पष्टीकरण देने के।mov निर्देश और पंजीयक - भ्रम!

एक समारोह देना (पेज 142 1 के संस्करण) समारोह के शरीर के

int exchange(int *xp, int y) 
{ 
    int x = *xp; 
    *xp = y; 
    return x; 
} 

विधानसभा कोड

movl 8(%ebp), %eax //Get xp 
movl 12(%ebp), %edx //Get y 
movl (%eax), %ecx //Get x at *xp 
movl %edx, (%eax) //Store y at *xp 
movl %ecx, %eax  //Set x as return value 

मुझे क्या confuses, क्या संग्रहित किया जा रहा है है, और जहां
यहाँ है मैं इसे कैसे समझता हूं:

movl 8(%ebp), %eax //Get xp 

सीपीयू चाल (- मूल्य, नहीं पता दुकानों जोर देने के लिए)

मैं सही हूँ ढेर अप +8 बाइट (फ्रेम सूचक %ebp से), उस स्थान पर संग्रहीत मूल्य, और दुकानों यह मान रजिस्टर %eax पर ले जाता है? धन्यवाद!

instruction  source, dest 

इंटेल विधानसभा the opposite order है:

उत्तर

9

हाँ, यह लगता है कि आप यह सही मिल गया है था। IMHO, एटी & टी 8(%ebp) वाक्य रचना इंटेल [ebp+8] जो और अधिक स्पष्ट है की तुलना में कम सहज है। ब्रैकेट दिखाते हैं कि आप रजिस्टर में पते पर मूल्य का उपयोग कर रहे हैं, और उस नंबर से ऑफसेट है जो आप वास्तव में चाहते हैं।

+0

बहुत सच ...... – ruslik

+1

तो दूसरे शब्दों में, क्योंकि '% ebp' स्टोर्स पॉइंटर, हम इसके नाम के चारों ओर कोष्ठक का उपयोग करते हैं, यह निर्दिष्ट करने के लिए कि हमें +% ebp' से + 8bytes को संग्रहीत मूल्य प्राप्त हो रहा है। इस मामले में, '8 (% ebp)' में सूचक '* xp' है। बाद में, 'movl (% eax),% ecx' में हम' xp' को उसी तरह से संदर्भित कर रहे हैं जैसा हमने असेंबली कोड – newprint

+0

की पहली पंक्ति में किया था, अब सबकुछ सीधा हो गया है। पेंथेसिस भ्रम का स्रोत था! धन्यवाद ! – newprint

2

हाँ, यह एटी & टी वाक्य रचना, रूप की है जो उपयोग कर रहा है।

तुम भी 8(%ebp) चलती 8 बाइट्स अप फ्रेम सूचक से के बारे में सही कर रहे हैं। कारण यह 8 बाइट्स ले जाता है, विशेष रूप से, ("छोड़" करने के लिए जब एक ठेठ समारोह कॉल को देखकर "सही"), क्योंकि मापदंडों उलटे क्रम में ढेर पर पुश किए जाते हैं। इस प्रकार, y पहले फोन करने वाले समारोह की वापसी पता धक्का दे दिया गया था, तो xp और अंत में (और इसी कारण आप के बजाय 8 बाइट्स 4 ले जाते हैं)।

1

आप को समझने के लिए एक ढेर फ्रेम है क्या जरूरत है। जानें कि वास्तव में push और pop निर्देश क्या हैं। कि कोड से पहले वहाँ एक

push y_val 
    push xp_ptr 
    call exchange 
.cont  
... 
.exchange 
    push ebp 
    mov ebp, esp 
// .. rest of code 
// stack frame: 
    old_ebp_val ; [ebp] points here 
    .cont  ; [ebp + 4] 
    xp_ptr  ; [ebp + 8] 
    y_val 
+0

मेरा प्रश्न ढेर के बारे में नहीं है, यहां तक ​​कि सोचा भी ढेर शामिल है। यह रजिस्टर और मेमोरी – newprint

+1

@user में संग्रहीत मूल्यों के बारे में है, आरटीटीआई को दिमाग में लागू करने का प्रयास करें। हमेशा मूल्यों के प्रकार का ट्रैक रखें। – ruslik

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