linux - Illegal instruction gcc assembler -


कोडांतरक में:

  .globl _test _test: pushl% ebp movl% esp,% Ebp movl 8 (% ebp),% eax pushl% eax call printf popl% ebp ret  

से कॉलिंग

  मुख्य () {_test (" नमस्ते"); }  

संकलित करें:

जीसीसी -एम 32-ओ परीक्षण test.c test.s

यह कोड मुझे कभी-कभी गैरकानूनी अनुदेश देता है और खंड गलती करता है फिर कभी। जीडीसी में मैं हमेशा अवैध अनुदेश प्राप्त करता हूं, यह सिर्फ एक साधारण परीक्षण था, मेरे पास एक बड़ा प्रोग्राम था जो काम कर रहा था और अचानक बिना किसी अयोग्य कारण से काम करना बंद हो गया, अब मुझे हमेशा यह त्रुटि मिलती है, भले ही मैं ऊपर की तरह खरोंच से शुरू हो।

मैंने इसे नीचे संकुचित कर दिया है% eax & amp; Call printf को कॉल करें, अगर मैं उन लाइनों पर टिप्पणी करता हूं तो कोड ठीक चलता है।

कोई भी विचार? (मैं अपने विश्वविद्यालयों लिनक्स क्लस्टर पर प्रोग्राम चला रहा हूं, इसलिए मैंने कोई भी सेटिंग बदल नहीं ली है ..)

< P> आपके पिछले दो निर्देश स्टैक बेस सूचक भ्रष्ट हैं वास्तविक स्टैक स्पेस को इंगित करने के लिए ईबिप (बेस पॉइंटर) पर निर्भर कोई भी कोड विफल हो जाएगा। आमतौर पर ईबीपी की जगह की स्थिति को इंगित करने की अपेक्षा एक सुरक्षित धारणा है, और सी-कोड के साथ इंटरफेस करते समय आपको उस धारणा को अमान्य नहीं करना चाहिए।

आप pushl% eax (या कोई भी अन्य रजिस्टर) और फिर popl% ebp कर रहा है इन दोनों के साथ एक साथ एक ही प्रभाव पड़ता है जैसे movl% eax,% ebp

मुझे लगता है कि आप eax में संग्रहीत मान वापस करने का प्रयास कर रहे हैं। सी कॉलिंग सम्मेलन में, ईएक्स को रिटर्न वैल्यू के लिए उपयोग किया जाता है, इसलिए इसे आगे बढ़ाने या इसके साथ कुछ करने की कोई आवश्यकता नहीं है, बस इसे में छोड़ दें और अन्य कोड इसे चुन लेंगे यदि आप ऐसा करने की कोशिश नहीं कर रहे हैं, तो मैं इस कार्य के अंत में आप क्यों% eax को धक्का दे रहे हैं इस बारे में स्टम्प्ड कर रहा हूं।


Comments