2010-08-24 23 views
13

में एएसएम प्रक्रिया के अंत में कौन सी सीपीयू रजिस्टरों को पुनर्स्थापित किया जाना है असेंबली कोड में डेल्फी प्रक्रिया या फ़ंक्शन लिखते समय, कौन से रजिस्टरों को सहेजा जाना चाहिए और प्रक्रिया के अंत में मूल मूल्य पर पुनर्स्थापित किया जाना चाहिए?डेल्फी

एक और डेल्फी प्रक्रिया या इनलाइन (इनलाइन) असेंबली कोड से फ़ंक्शन कॉल करते समय, मैं अन्य कार्यों को रजिस्टरों के साथ क्या करने की उम्मीद कर सकता हूं? कौन से रजिस्ट्रार अपने मूल मूल्यों पर बहाल किए जाएंगे और जो नहीं हो सकता है?

(जाहिर है, एक ही जवाब दोनों सवालों पर लागू होगा)

मैं डेल्फी के default calling convention संभालने कर रहा हूँ। मुझे पता है कि 0 -32-बिट रिटर्न मानों के लिए उपयोग किया जाता है। और SysUtils.pas में एएसएम कोड को देखते हुए, ऐसा लगता है कि EBX, ESI और EDI धक्का और बहाल किए जाते हैं, लेकिन अन्य नहीं हैं। हालांकि, मुझे इसके बारे में कोई दस्तावेज नहीं मिल रहा है।

उत्तर

11

तीन एक समारोह के पहले तर्क EAX, EDX, और ECX क्रमश में दिए गए हैं। ढेर पर अतिरिक्त तर्क धकेल दिए जाते हैं। किसी ऑब्जेक्ट की विधि के लिए, Self पॉइंटर हमेशा (अदृश्य) पहला पैरामीटर होता है। परिणाम EAX में होना चाहिए। लंबे तारों को लौटने वाले कार्यों के लिए, (अदृश्य) फ़ंक्शन का अंतिम पैरामीटर परिणामस्वरूप स्ट्रिंग का सूचक है (जो स्वयं स्ट्रिंग के पहले अक्षर के लिए सूचक है)।

EBX बदल नहीं किया जाना चाहिए (जब तक आप यह प्रक्रिया/समारोह के अंत से पहले बहाल), और इसलिए ESP, EBP, ESI, या EDI या तो नहीं करना चाहिए। (1) डेल्फी इनलाइन एएसएम के लिए एक उत्कृष्ट परिचय यहां पाया जाता था: http://www.delphi3000.com/articles/article_3766.asp

+2

यह सही जानकारी है। और यदि परिणाम एक इंट 64 है, तो यह ईएक्स/ईडीएक्स जोड़े में स्थित है। –

+0

@ ए बॉचेज: बहुत सच है। –

+2

असल में, रजिस्टरों में क्या है कॉलिंग सम्मेलन पर निर्भर करता है। कुछ भी "stdcall" और "cdecl" असेंबलर फ़ंक्शंस लिखने से मना नहीं करता है, जो पैरामीटर पास करने के लिए रजिस्टरों का उपयोग नहीं करते हैं। रजिस्टर में क्या है, स्टैक पर क्या है (और एफपीयू रजिस्टर में क्या है) पैरामीटर प्रकार पर निर्भर करता है। ईबीएक्स, ईएसआई, ईडीआई प्रक्रिया के अंदर बदला जा सकता है, जब तक कि वे सहेजे और ठीक से बहाल हो जाएं। निश्चित रूप से ईबीपी और ईएसपी को छूना कहीं अधिक खतरनाक है। –

4

मैं अगर डॉक्स अद्यतित हैं पता नहीं है, लेकिन आप Embarcardero विकी पर Using Inline Assembly Code (Win32 Only) पर एक नजर है चाहिए:

उद्धरण:

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

+0

लिंक के लिए धन्यवाद, भले ही यह टूटा हुआ हो (यूआरएल में एक बंद ब्रांड्स गायब है)। – Servaas

+0

@ सर्वास: क्या आप उपरोक्त समापन कोष्ठक नहीं देखते हैं? :) समस्या यह है कि स्टैक ओवरफ्लो (या, असल में, मार्कडाउन) बंद करने वाले कोष्ठक (स्वाभाविक रूप से) से संबंधित यूआरएल की व्याख्या नहीं कर सकता है। –

+0

स्पष्ट रूप से लिंक तय किया गया है। धन्यवाद, रॉब केनेडी। – Servaas