solaris - What is an OpenSolaris syscall calling convention (x86)? -
ओपनसोलारिस सिसॉल कॉलिंग कन्वेंशन (x 86) क्या है?
एफ.ई. मैं 32bit विधानसभा में एक प्रोग्राम लिखना चाहूंगा जो कंसोल के लिए स्ट्रिंग प्रदर्शित करता है। इसके लिए मैं "लेखन" syscall (संख्या 4) का उपयोग करना चाहता हूं। लिखने के लिए सी परिभाषा:
ssize_t लिखना (int fildes, const void * buf, size_t nbyte)
क्या रजिस्टरों को फ़िलिल्ड < / Strong>, बफ़ और nbyte तर्क? आप किस बीच में कॉल कर सकते हैं?
आप एक सी प्रोग्राम लिख सकते हैं जो लिखते हैं
, इसे असेंबली भाषा में संकलित करें ( -S
विकल्प का उपयोग करें)। और फिर आउटपुट को देखने के लिए जांचें कि कम्पाइलर कैसे करता है।
संपादित करें:
ओपनसोलारिस libc ऐसा करता है:
सबसे पहले जब आप इसे कॉल करते हैं तो कुछ चीजें चेक करें और फिर __write कॉल करें:
pushl 0x10 (% ebp) pushl 0xc (% ebp) pushl 0x8 (% ebp) कॉल c2730 & lt; __ लिखें & gt;
और __write फिर दिखता है:
और लिखित; __ लिखना>: कॉल c2735 & lt; __ लिखना + 0x5 & gt; पॉप% edx mov $ 0x4,% eax mov% esp,% ecx $ 0x10 जोड़ें,% edx sysenter jae c2751 & lt; __ लिखना + 0x21 & gt; सीएफ़पी $ 0x5 बी,% ईएक्स जे सी 2730 और एलटी; __ लिखना & gt; Jmp 2e0d0 & lt; __ आतंक & gt; रिटायर्ड
यह ईसीएक्स (4) में लिखना सिसैल नंबर डालता है, ईसीएक्स में स्टैक पॉइंटर और एडएक्स में रिटर्न एड। और लेखन syscall के तर्क पहले से ही स्टैक पर पुश किए गए हैं।
Comments
Post a Comment