कोडांतरक में:
.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 को कॉल करें, अगर मैं उन लाइनों पर टिप्पणी करता हूं तो कोड ठीक चलता है।
कोई भी विचार? (मैं अपने विश्वविद्यालयों लिनक्स क्लस्टर पर प्रोग्राम चला रहा हूं, इसलिए मैंने कोई भी सेटिंग बदल नहीं ली है ..)
आप pushl% eax
(या कोई भी अन्य रजिस्टर) और फिर popl% ebp
कर रहा है इन दोनों के साथ एक साथ एक ही प्रभाव पड़ता है जैसे movl% eax,% ebp
।
मुझे लगता है कि आप eax में संग्रहीत मान वापस करने का प्रयास कर रहे हैं। सी कॉलिंग सम्मेलन में, ईएक्स को रिटर्न वैल्यू के लिए उपयोग किया जाता है, इसलिए इसे आगे बढ़ाने या इसके साथ कुछ करने की कोई आवश्यकता नहीं है, बस इसे में छोड़ दें और अन्य कोड इसे चुन लेंगे यदि आप ऐसा करने की कोशिश नहीं कर रहे हैं, तो मैं इस कार्य के अंत में आप क्यों% eax को धक्का दे रहे हैं इस बारे में स्टम्प्ड कर रहा हूं।
Comments
Post a Comment