2009-02-07 9 views
18

एक जंप और कॉल निर्देश कैसे भिन्न है? यह उच्च स्तर की अवधारणाओं जैसे गोटो या प्रक्रिया कॉल से कैसे संबंधित है? (Am मैं तुलना में सही हूँ?)जंप और कॉल

यह मैं क्या सोचता है:

जम्प या गोटो किसी अन्य स्थान पर नियंत्रण के हस्तांतरण और नियंत्रण स्वचालित रूप से जहां यह कहा जाता है से बात करने के लिए वापस नहीं करता है ।

दूसरी तरफ, कॉल या प्रक्रिया/फ़ंक्शन कॉल उस बिंदु पर वापस आती है जहां से इसे कहा जाता है। अपनी प्रकृति में इस अंतर के कारण, भाषाएं आम तौर पर एक ढेर का उपयोग करती हैं और एक स्टैक फ्रेम को प्रत्येक प्रक्रिया के लिए वापस आने के लिए स्थान "याद" करने के लिए धक्का दिया जाता है। यह व्यवहार भी रिकर्सिव प्रक्रियाओं पर लागू होता है। पूंछ रिकर्सन के मामले में, प्रत्येक कॉल के लिए स्टैक फ्रेम को "धक्का" देने की आवश्यकता नहीं है।

आपके उत्तरों और टिप्पणियों की बहुत सराहना की जाएगी।

उत्तर

20

यदि आप x86 असेंबली या कुछ समान में कॉल/जेएमपी के बारे में बात कर रहे हैं तो आप अधिकतर सही हैं। मुख्य अंतर यह है:

  • जेएमपी एक स्थान के लिए एक कूद करता है, कुछ और करने
  • कॉल स्टैक (बल्कि: वर्तमान अनुदेश के बाद एक) पर वर्तमान अनुदेश सूचक धक्का बिना, और उसके बाद के लिए JMPs स्थान। आरईटी के साथ आप वापस जा सकते हैं जहां आप थे।

आमतौर पर, कॉल केवल जेएमपी का उपयोग करके लागू एक सुविधा समारोह है। आप

  movl $afterJmp, -(%esp) 
      jmp location 
afterJmp: 

जैसे किसी कॉल के बजाय कुछ कर सकते हैं।

+0

जब आप कहते हैं: "कॉल केवल जेएमपी का उपयोग करके लागू एक सुविधा समारोह है।" क्या इसका मतलब है कि कॉल परमाणु नहीं है (एक प्रोसेसर निर्देश)? – Anzurio

+1

आपका मतलब है कि थ्रेड में movl के बीच बाधा उत्पन्न हो सकती है, लेकिन jmp से पहले, यदि कोई कॉल दो निर्देशों के रूप में लागू किया जाएगा? दस्तावेज़ों को देखकर: http://www.intel.com/Assets/PDF/manual/253666.pdf, यह कहता है कि प्रक्रिया पहले पते को स्टैक पर ले जाती है, और फिर कूद, स्पष्ट रूप से इसे अनुक्रम के रूप में बताती है। मुझे नहीं लगता कि यह परमाणु क्यों होना चाहिए, साथ ही, इससे कोई फर्क नहीं पड़ता? यह वैसे ही है जैसे आप jmp के ठीक बाद बाधित हो जाएंगे, क्योंकि jmp बिना शर्त है। – Anteru

+1

यदि कॉल किया गया है, जहां से आप कॉल करते हैं, तो इसका मतलब है कि बहुत से 'कॉल' स्टैक ओवरफ्लो कर सकते हैं (यदि आप 'आरईटी' नहीं करते हैं), जबकि 'जेएमपी' के साथ स्टैक को भ्रष्ट करना असंभव है, लेकिन चालू दूसरी तरफ, आप तब तक कूद नहीं सकते जब तक कि आप उस स्थान को संग्रहीत नहीं करते जहां से आप स्वयं कूद गए थे। क्या वो सही है? सी के 'गोटो 'को इस मामले में' जेएमपी 'के बराबर होना चाहिए। – CoDEmanX

0

मुझे लगता है कि आपको सामान्य विचार मिल गया है।

यह वास्तुकला पर निर्भर करता है, लेकिन सामान्य रूप में, हार्डवेयर स्तर पर:

  • एक कूद अनुदेश program counter बदल जाएगा कार्यक्रम का एक अलग हिस्सा पर निष्पादन जारी रखने के लिए।

  • एक कॉल निर्देश वर्तमान प्रोग्राम स्थान (या वर्तमान स्थान + 1) को call stack पर धक्का देगा और प्रोग्राम के किसी अन्य भाग पर कूद जाएगा। एक वापसी निर्देश तब कॉल स्टैक के स्थान को बंद कर देगा और मूल स्थान पर वापस कूद जाएगा (या संरेखण स्थान + 1)।

तो, एक कूद अनुदेश, एक GOTO के करीब है, जबकि एक फोन अनुदेश एक प्रक्रियात्मक/समारोह कॉल के करीब है।

इसके अलावा, फ़ंक्शन कॉल करते समय कॉल स्टैक का उपयोग करने के कारण, रिकर्सन द्वारा कॉल स्टैक पर बहुत से रिटर्न पतों को दबाकर stack overflow का कारण बन जाएगा।

असेंबली सीखते समय, मुझे RISC प्रोसेसर से x86 प्रोसेसर की तुलना में निपटने में आसान लगता है, क्योंकि इसमें कम निर्देश और सरल संचालन होते हैं।

1

आप कूद और कॉल के बीच के अंतर के बारे में बिल्कुल सही हैं।

पूंछ रिकर्सन के साथ एक समारोह के नमूना मामले में, तो कंपाइलर मौजूदा स्टैक फ्रेम का पुन: उपयोग करने में सक्षम हो सकता है। हालांकि, यह पारस्परिक रूप से पुनरावर्ती कार्यों के साथ और अधिक जटिल हो सकता है:

void ping() { printf("ping\n"); pong(); } 
void pong() { printf("pong\n"); ping(); } 

मामले पर विचार करें जहां पिंग() और पोंग() और अधिक जटिल कार्यों कि मानकों की विभिन्न संख्या ले रहे हैं। Mark Probst's paper महान विस्तार से जीसीसी के लिए पूंछ रिकर्सन कार्यान्वयन के बारे में वार्ता।

-2

माइक्रोप्रोसेसर के अनुसार, सबसे पहले स्थिति की जांच की जाती है और फिर यह कूद ऑपरेशन करता है (अन्य कोड पर जाता है) और वापस नहीं आता है। कॉल ऑपरेशन c भाषा में फ़ंक्शन कॉलिग की तरह है और जब फ़ंक्शन किया जाता है तो यह इसके निष्पादन को पूरा करने के लिए वापस लौटाता है। अपने विचारों को

+0

चूंकि 'कॉल' कोई शर्त जांच नहीं करता है, इसलिए तुलना के लिए एकमात्र वैध कूद निर्देश 'जेएमपी' है, जो बिना शर्त ** ** कूदता है। – CoDEmanX

0

एक सुधार: यह है कि हम ढेर फ्रेम की जरूरत नहीं है और इसलिए बस जेएमपी वहाँ सकता है न केवल पूंछ प्रत्यावर्तन साथ है, लेकिन आम तौर पर पूंछ कॉल के साथ, (प्रदान किए गए तर्कों स्थापित किए गए हैं सही ढंग से ऊपर)।

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